Merge pull request #2100 from assimp/qt_viewer_new_imagelib
Introduce header-only imagelib to make install of qt-viewer simpler.pull/2040/head^2
commit
8ceca4daaf
|
@ -227,8 +227,8 @@ ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fvisibility=hidden -fPIC -Wall -Wno-long-long -std=c++11" )
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fvisibility=hidden -fPIC -Wall -Wno-long-long -std=c++11" )
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
||||||
ELSEIF( CMAKE_COMPILER_IS_MINGW )
|
ELSEIF( CMAKE_COMPILER_IS_MINGW )
|
||||||
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -Wall -Wno-long-long -std=c++11" )
|
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -Wall -Wno-long-long -std=c++11 -Wa,-mbig-obj" )
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC ")
|
||||||
ADD_DEFINITIONS( -U__STRICT_ANSI__ )
|
ADD_DEFINITIONS( -U__STRICT_ANSI__ )
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|
|
@ -3,52 +3,28 @@ project(assimp_qt_viewer)
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 2.6)
|
||||||
|
|
||||||
OPTION( ASSIMP_QT4_VIEWER
|
|
||||||
"Set to ON to enable Qt4 against Qt5 for assimp_qt_viewer"
|
|
||||||
OFF
|
|
||||||
)
|
|
||||||
|
|
||||||
FIND_PACKAGE(DevIL QUIET)
|
|
||||||
FIND_PACKAGE(OpenGL QUIET)
|
FIND_PACKAGE(OpenGL QUIET)
|
||||||
|
|
||||||
IF(ASSIMP_QT4_VIEWER)
|
# Qt5 version
|
||||||
# Qt4 version
|
FIND_PACKAGE(Qt5 COMPONENTS Gui Widgets OpenGL QUIET)
|
||||||
FIND_PACKAGE(Qt4 QUIET)
|
|
||||||
ELSE(ASSIMP_QT4_VIEWER)
|
|
||||||
# Qt5 version
|
|
||||||
FIND_PACKAGE(Qt5 COMPONENTS Gui Widgets OpenGL QUIET)
|
|
||||||
ENDIF(ASSIMP_QT4_VIEWER)
|
|
||||||
|
|
||||||
SET(VIEWER_BUILD:BOOL FALSE)
|
SET(VIEWER_BUILD:BOOL FALSE)
|
||||||
|
|
||||||
IF((Qt4_FOUND OR Qt5Widgets_FOUND) AND IL_FOUND AND OPENGL_FOUND)
|
IF( Qt5Widgets_FOUND AND OPENGL_FOUND)
|
||||||
SET(VIEWER_BUILD TRUE)
|
SET(VIEWER_BUILD TRUE)
|
||||||
|
ELSE( Qt5Widgets_FOUND AND OPENGL_FOUND)
|
||||||
ELSE((Qt4_FOUND OR Qt5Widgets_FOUND) AND IL_FOUND AND OPENGL_FOUND)
|
|
||||||
SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "")
|
SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "")
|
||||||
|
|
||||||
IF(ASSIMP_QT4_VIEWER)
|
IF (NOT Qt5_FOUND)
|
||||||
IF (NOT Qt4_FOUND)
|
SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "${ASSIMP_QT_VIEWER_DEPENDENCIES} Qt5")
|
||||||
SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "${ASSIMP_QT_VIEWER_DEPENDENCIES} Qt4")
|
ENDIF (NOT Qt5_FOUND)
|
||||||
ENDIF (NOT Qt4_FOUND)
|
|
||||||
|
|
||||||
ELSE(ASSIMP_QT4_VIEWER)
|
|
||||||
IF (NOT Qt5_FOUND)
|
|
||||||
SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "${ASSIMP_QT_VIEWER_DEPENDENCIES} Qt5")
|
|
||||||
ENDIF (NOT Qt5_FOUND)
|
|
||||||
|
|
||||||
ENDIF(ASSIMP_QT4_VIEWER)
|
|
||||||
|
|
||||||
IF (NOT IL_FOUND)
|
|
||||||
SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "${ASSIMP_QT_VIEWER_DEPENDENCIES} DevIL")
|
|
||||||
ENDIF (NOT IL_FOUND)
|
|
||||||
|
|
||||||
IF (NOT OPENGL_FOUND)
|
IF (NOT OPENGL_FOUND)
|
||||||
SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "${ASSIMP_QT_VIEWER_DEPENDENCIES} OpengGL")
|
SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "${ASSIMP_QT_VIEWER_DEPENDENCIES} OpengGL")
|
||||||
ENDIF (NOT OPENGL_FOUND)
|
ENDIF (NOT OPENGL_FOUND)
|
||||||
|
|
||||||
MESSAGE (WARNING "Build of assimp_qt_viewer is disabled. Unsatisfied dendencies: ${ASSIMP_QT_VIEWER_DEPENDENCIES}")
|
MESSAGE (WARNING "Build of assimp_qt_viewer is disabled. Unsatisfied dendencies: ${ASSIMP_QT_VIEWER_DEPENDENCIES}")
|
||||||
ENDIF((Qt4_FOUND OR Qt5Widgets_FOUND) AND IL_FOUND AND OPENGL_FOUND)
|
ENDIF( Qt5Widgets_FOUND AND OPENGL_FOUND)
|
||||||
|
|
||||||
IF(VIEWER_BUILD)
|
IF(VIEWER_BUILD)
|
||||||
INCLUDE_DIRECTORIES(
|
INCLUDE_DIRECTORIES(
|
||||||
|
@ -63,28 +39,23 @@ IF(VIEWER_BUILD)
|
||||||
LINK_DIRECTORIES(${Assimp_BINARY_DIR})
|
LINK_DIRECTORIES(${Assimp_BINARY_DIR})
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pedantic -Wall")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pedantic -Wall")
|
||||||
|
|
||||||
SET(assimp_qt_viewer_SRCS main.cpp loggerview.cpp glview.cpp mainwindow.cpp)
|
SET(assimp_qt_viewer_SRCS
|
||||||
|
main.cpp
|
||||||
|
loggerview.hpp
|
||||||
|
loggerview.cpp
|
||||||
|
glview.hpp
|
||||||
|
glview.cpp
|
||||||
|
mainwindow.hpp
|
||||||
|
mainwindow.cpp
|
||||||
|
)
|
||||||
|
|
||||||
IF(ASSIMP_QT4_VIEWER)
|
MESSAGE("assimp_qt_viewer use Qt5")
|
||||||
MESSAGE("assimp_qt_viewer use Qt4")
|
INCLUDE_DIRECTORIES(${Qt5Widgets_INCLUDES})
|
||||||
ADD_DEFINITIONS( -DASSIMP_QT4_VIEWER )
|
qt5_wrap_ui(UISrcs mainwindow.ui)
|
||||||
INCLUDE_DIRECTORIES(${QT_INCLUDES})
|
qt5_wrap_cpp(MOCrcs mainwindow.hpp glview.hpp)
|
||||||
qt4_wrap_ui(UISrcs mainwindow.ui)
|
|
||||||
qt4_wrap_cpp(MOCrcs mainwindow.hpp glview.hpp)
|
|
||||||
ELSE()
|
|
||||||
MESSAGE("assimp_qt_viewer use Qt5")
|
|
||||||
INCLUDE_DIRECTORIES(${Qt5Widgets_INCLUDES})
|
|
||||||
qt5_wrap_ui(UISrcs mainwindow.ui)
|
|
||||||
qt5_wrap_cpp(MOCrcs mainwindow.hpp glview.hpp)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
add_executable(${PROJECT_NAME} ${assimp_qt_viewer_SRCS} ${UISrcs} ${MOCrcs})
|
add_executable(${PROJECT_NAME} ${assimp_qt_viewer_SRCS} ${UISrcs} ${MOCrcs})
|
||||||
|
target_link_libraries(${PROJECT_NAME} Qt5::Gui Qt5::Widgets Qt5::OpenGL ${IL_LIBRARIES} ${OPENGL_LIBRARIES} assimp)
|
||||||
IF(ASSIMP_QT4_VIEWER)
|
|
||||||
target_link_libraries(${PROJECT_NAME} ${QT_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTOPENGL_LIBRARY} ${IL_LIBRARIES} ${OPENGL_LIBRARIES} assimp)
|
|
||||||
ELSE()
|
|
||||||
target_link_libraries(${PROJECT_NAME} Qt5::Gui Qt5::Widgets Qt5::OpenGL ${IL_LIBRARIES} ${OPENGL_LIBRARIES} assimp)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
IF(WIN32) # Check if we are on Windows
|
IF(WIN32) # Check if we are on Windows
|
||||||
IF(MSVC) # Check if we are using the Visual Studio compiler
|
IF(MSVC) # Check if we are using the Visual Studio compiler
|
||||||
|
|
|
@ -1,8 +1,45 @@
|
||||||
/// \file glview.cpp
|
/*
|
||||||
/// \brief OpenGL visualisation. Implementation file.
|
---------------------------------------------------------------------------
|
||||||
/// \author smal.root@gmail.com
|
Open Asset Import Library (assimp)
|
||||||
/// \date 2016
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
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"
|
#include "glview.hpp"
|
||||||
|
|
||||||
// Header files, Qt.
|
// Header files, Qt.
|
||||||
|
@ -16,40 +53,30 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Header files, DevIL.
|
// Header files, DevIL.
|
||||||
#include <il.h>
|
|
||||||
|
|
||||||
// Header files, Assimp.
|
// Header files, Assimp.
|
||||||
#include <assimp/DefaultLogger.hpp>
|
#include <assimp/DefaultLogger.hpp>
|
||||||
|
|
||||||
#ifndef __unused
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
#define __unused __attribute__((unused))
|
#include "stb_image.h"
|
||||||
#endif // __unused
|
|
||||||
|
|
||||||
/**********************************/
|
|
||||||
/********** SHelper_Mesh **********/
|
|
||||||
/**********************************/
|
|
||||||
|
|
||||||
CGLView::SHelper_Mesh::SHelper_Mesh(const size_t pQuantity_Point, const size_t pQuantity_Line, const size_t pQuantity_Triangle, const SBBox& pBBox)
|
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)
|
: 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_Point = pQuantity_Point ? new GLuint[pQuantity_Point * 1] : nullptr;
|
||||||
Index_Line = pQuantity_Line ? new GLuint[pQuantity_Line * 2] : nullptr;
|
Index_Line = pQuantity_Line ? new GLuint[pQuantity_Line * 2] : nullptr;
|
||||||
Index_Triangle = pQuantity_Triangle ? new GLuint[pQuantity_Triangle * 3] : nullptr;
|
Index_Triangle = pQuantity_Triangle ? new GLuint[pQuantity_Triangle * 3] : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLView::SHelper_Mesh::~SHelper_Mesh()
|
CGLView::SHelper_Mesh::~SHelper_Mesh() {
|
||||||
{
|
delete [] Index_Point;
|
||||||
if(Index_Point != nullptr) delete [] Index_Point;
|
delete [] Index_Line;
|
||||||
if(Index_Line != nullptr) delete [] Index_Line;
|
delete [] Index_Triangle;
|
||||||
if(Index_Triangle != nullptr) delete [] Index_Triangle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************/
|
void CGLView::SHelper_Camera::SetDefault() {
|
||||||
/********** SHelper_Mesh **********/
|
|
||||||
/**********************************/
|
|
||||||
|
|
||||||
void CGLView::SHelper_Camera::SetDefault()
|
|
||||||
{
|
|
||||||
Position.Set(0, 0, 0);
|
Position.Set(0, 0, 0);
|
||||||
Target.Set(0, 0, -1);
|
Target.Set(0, 0, -1);
|
||||||
Rotation_AroundCamera = aiMatrix4x4();
|
Rotation_AroundCamera = aiMatrix4x4();
|
||||||
|
@ -57,39 +84,21 @@ void CGLView::SHelper_Camera::SetDefault()
|
||||||
Translation_ToScene.Set(0, 0, 2);
|
Translation_ToScene.Set(0, 0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************/
|
static void set_float4(float f[4], float a, float b, float c, float d) {
|
||||||
/************ CGLView *************/
|
f[0] = a;
|
||||||
/**********************************/
|
f[1] = b;
|
||||||
|
f[2] = c;
|
||||||
|
f[3] = d;
|
||||||
|
}
|
||||||
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
static void color4_to_float4(const aiColor4D *c, float f[4]) {
|
||||||
# define ConditionalContextControl_Begin \
|
f[0] = c->r;
|
||||||
bool ContextEnabledHere; \
|
f[1] = c->g;
|
||||||
\
|
f[2] = c->b;
|
||||||
if(mGLContext_Current) \
|
f[3] = c->a;
|
||||||
{ \
|
}
|
||||||
ContextEnabledHere = false; \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
{ \
|
|
||||||
makeCurrent(); \
|
|
||||||
mGLContext_Current = true; \
|
|
||||||
ContextEnabledHere = true; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
do {} while(false)
|
|
||||||
|
|
||||||
# define ConditionalContextControl_End \
|
void CGLView::Material_Apply(const aiMaterial* pMaterial) {
|
||||||
if(ContextEnabledHere) \
|
|
||||||
{ \
|
|
||||||
doneCurrent(); \
|
|
||||||
mGLContext_Current = false; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
do {} while(false)
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
|
|
||||||
void CGLView::Material_Apply(const aiMaterial* pMaterial)
|
|
||||||
{
|
|
||||||
GLfloat tcol[4];
|
GLfloat tcol[4];
|
||||||
aiColor4D taicol;
|
aiColor4D taicol;
|
||||||
unsigned int max;
|
unsigned int max;
|
||||||
|
@ -97,15 +106,12 @@ void CGLView::Material_Apply(const aiMaterial* pMaterial)
|
||||||
int texture_index = 0;
|
int texture_index = 0;
|
||||||
aiString texture_path;
|
aiString texture_path;
|
||||||
|
|
||||||
auto set_float4 = [](float f[4], float a, float b, float c, float d) { f[0] = a, f[1] = b, f[2] = c, f[3] = d; };
|
|
||||||
auto color4_to_float4 = [](const aiColor4D *c, float f[4]) { f[0] = c->r, f[1] = c->g, f[2] = c->b, f[3] = c->a; };
|
|
||||||
|
|
||||||
///TODO: cache materials
|
///TODO: cache materials
|
||||||
// Disable color material because glMaterial is used.
|
// Disable color material because glMaterial is used.
|
||||||
glDisable(GL_COLOR_MATERIAL);///TODO: cache
|
glDisable(GL_COLOR_MATERIAL);///TODO: cache
|
||||||
// Set texture. If assigned.
|
|
||||||
if(AI_SUCCESS == pMaterial->GetTexture(aiTextureType_DIFFUSE, texture_index, &texture_path))
|
// Set texture. If assigned.
|
||||||
{
|
if(AI_SUCCESS == pMaterial->GetTexture(aiTextureType_DIFFUSE, texture_index, &texture_path)) {
|
||||||
//bind texture
|
//bind texture
|
||||||
unsigned int texture_ID = mTexture_IDMap.value(texture_path.data, 0);
|
unsigned int texture_ID = mTexture_IDMap.value(texture_path.data, 0);
|
||||||
|
|
||||||
|
@ -116,20 +122,27 @@ void CGLView::Material_Apply(const aiMaterial* pMaterial)
|
||||||
//
|
//
|
||||||
// Diffuse
|
// Diffuse
|
||||||
set_float4(tcol, 0.8f, 0.8f, 0.8f, 1.0f);
|
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);
|
if ( AI_SUCCESS == aiGetMaterialColor( pMaterial, AI_MATKEY_COLOR_DIFFUSE, &taicol )) {
|
||||||
|
color4_to_float4( &taicol, tcol );
|
||||||
|
}
|
||||||
|
|
||||||
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, tcol);
|
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, tcol);
|
||||||
// Specular
|
|
||||||
|
// Specular
|
||||||
set_float4(tcol, 0.0f, 0.0f, 0.0f, 1.0f);
|
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);
|
if ( AI_SUCCESS == aiGetMaterialColor( pMaterial, AI_MATKEY_COLOR_SPECULAR, &taicol )) {
|
||||||
|
color4_to_float4( &taicol, tcol );
|
||||||
|
}
|
||||||
|
|
||||||
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, tcol);
|
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, tcol);
|
||||||
// Ambient
|
// Ambient
|
||||||
set_float4(tcol, 0.2f, 0.2f, 0.2f, 1.0f);
|
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);
|
if ( AI_SUCCESS == aiGetMaterialColor( pMaterial, AI_MATKEY_COLOR_AMBIENT, &taicol )) {
|
||||||
|
color4_to_float4( &taicol, tcol );
|
||||||
|
}
|
||||||
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, tcol);
|
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, tcol);
|
||||||
// Emission
|
|
||||||
|
// Emission
|
||||||
set_float4(tcol, 0.0f, 0.0f, 0.0f, 1.0f);
|
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);
|
if(AI_SUCCESS == aiGetMaterialColor(pMaterial, AI_MATKEY_COLOR_EMISSIVE, &taicol)) color4_to_float4(&taicol, tcol);
|
||||||
|
|
||||||
|
@ -142,12 +155,9 @@ void CGLView::Material_Apply(const aiMaterial* pMaterial)
|
||||||
// Shininess strength
|
// Shininess strength
|
||||||
max = 1;
|
max = 1;
|
||||||
ret2 = aiGetMaterialFloatArray(pMaterial, AI_MATKEY_SHININESS_STRENGTH, &strength, &max);
|
ret2 = aiGetMaterialFloatArray(pMaterial, AI_MATKEY_SHININESS_STRENGTH, &strength, &max);
|
||||||
if((ret1 == AI_SUCCESS) && (ret2 == AI_SUCCESS))
|
if((ret1 == AI_SUCCESS) && (ret2 == AI_SUCCESS)) {
|
||||||
{
|
|
||||||
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess * strength);///TODO: cache
|
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess * strength);///TODO: cache
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0f);///TODO: cache
|
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0f);///TODO: cache
|
||||||
set_float4(tcol, 0.0f, 0.0f, 0.0f, 0.0f);
|
set_float4(tcol, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, tcol);
|
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, tcol);
|
||||||
|
@ -199,38 +209,26 @@ void CGLView::Matrix_NodeToRoot(const aiNode* pNode, aiMatrix4x4& pOutMatrix)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGLView::ImportTextures(const QString& pScenePath)
|
void CGLView::ImportTextures(const QString& scenePath) {
|
||||||
{
|
|
||||||
auto LoadTexture = [&](const QString& pFileName) -> bool ///TODO: IME texture mode, operation.
|
auto LoadTexture = [&](const QString& pFileName) -> bool ///TODO: IME texture mode, operation.
|
||||||
{
|
{
|
||||||
ILboolean success;
|
|
||||||
GLuint id_ogl_texture;// OpenGL texture ID.
|
GLuint id_ogl_texture;// OpenGL texture ID.
|
||||||
|
|
||||||
if(!pFileName.startsWith(AI_EMBEDDED_TEXNAME_PREFIX))
|
if(!pFileName.startsWith(AI_EMBEDDED_TEXNAME_PREFIX))
|
||||||
{
|
{
|
||||||
ILuint id_image;// DevIL image ID.
|
QString basepath = scenePath.left(scenePath.lastIndexOf('/') + 1);// path with '/' at the end.
|
||||||
QString basepath = pScenePath.left(pScenePath.lastIndexOf('/') + 1);// path with '/' at the end.
|
|
||||||
QString fileloc = (basepath + pFileName);
|
QString fileloc = (basepath + pFileName);
|
||||||
|
|
||||||
fileloc.replace('\\', "/");
|
fileloc.replace('\\', "/");
|
||||||
ilGenImages(1, &id_image);// Generate DevIL image ID.
|
int x, y, n;
|
||||||
ilBindImage(id_image);
|
unsigned char *data = stbi_load(fileloc.toLocal8Bit(), &x, &y, &n, STBI_rgb_alpha );
|
||||||
success = ilLoadImage(fileloc.toLocal8Bit());
|
if ( nullptr == data ) {
|
||||||
if(!success)
|
|
||||||
{
|
|
||||||
LogError(QString("Couldn't load Image: %1").arg(fileloc));
|
LogError(QString("Couldn't load Image: %1").arg(fileloc));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert every colour component into unsigned byte. If your image contains alpha channel you can replace IL_RGB with IL_RGBA.
|
// Convert every colour component into unsigned byte. If your image contains alpha channel you can replace IL_RGB with IL_RGBA.
|
||||||
success = ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);
|
|
||||||
if(!success)
|
|
||||||
{
|
|
||||||
LogError("Couldn't convert image.");
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
glGenTextures(1, &id_ogl_texture);// Texture ID generation.
|
glGenTextures(1, &id_ogl_texture);// Texture ID generation.
|
||||||
mTexture_IDMap[pFileName] = id_ogl_texture;// save texture ID for filename in map
|
mTexture_IDMap[pFileName] = id_ogl_texture;// save texture ID for filename in map
|
||||||
|
@ -238,11 +236,9 @@ void CGLView::ImportTextures(const QString& pScenePath)
|
||||||
// Redefine standard texture values
|
// 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_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.
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);// We will use linear interpolation for minifying filter.
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, ilGetInteger(IL_IMAGE_BPP), ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT), 0,
|
glTexImage2D(GL_TEXTURE_2D, 0, n, x, y, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, data );// Texture specification.
|
||||||
ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, ilGetData());// Texture specification.
|
|
||||||
|
|
||||||
//Cleanup
|
// Cleanup
|
||||||
ilDeleteImages(1, &id_image);// Because we have already copied image data into texture data we can release memory used by image.
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -321,27 +317,18 @@ void CGLView::ImportTextures(const QString& pScenePath)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Before calling ilInit() version should be checked.
|
|
||||||
if(ilGetInteger(IL_VERSION_NUM) < IL_VERSION)
|
|
||||||
{
|
|
||||||
LogError("Wrong DevIL version.");
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ilInit();// Initialization of DevIL.
|
|
||||||
//
|
//
|
||||||
// Load textures.
|
// Load textures.
|
||||||
//
|
//
|
||||||
// Get textures file names and number of textures.
|
// Get textures file names and number of textures.
|
||||||
for(size_t idx_material = 0; idx_material < mScene->mNumMaterials; idx_material++)
|
for(size_t idx_material = 0; idx_material < mScene->mNumMaterials; idx_material++) {
|
||||||
{
|
|
||||||
int idx_texture = 0;
|
int idx_texture = 0;
|
||||||
aiString path;
|
aiString path;
|
||||||
|
|
||||||
do
|
do {
|
||||||
{
|
if (mScene->mMaterials[ idx_material ]->GetTexture( aiTextureType_DIFFUSE, idx_texture, &path ) != AI_SUCCESS) {
|
||||||
if(mScene->mMaterials[idx_material]->GetTexture(aiTextureType_DIFFUSE, idx_texture, &path) != AI_SUCCESS) break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
LoadTexture(QString(path.C_Str()));
|
LoadTexture(QString(path.C_Str()));
|
||||||
idx_texture++;
|
idx_texture++;
|
||||||
|
@ -349,11 +336,8 @@ void CGLView::ImportTextures(const QString& pScenePath)
|
||||||
}// for(size_t idx_material = 0; idx_material < mScene->mNumMaterials; idx_material++)
|
}// for(size_t idx_material = 0; idx_material < mScene->mNumMaterials; idx_material++)
|
||||||
|
|
||||||
// Textures list is empty, exit.
|
// Textures list is empty, exit.
|
||||||
if(mTexture_IDMap.size() == 0)
|
if(mTexture_IDMap.empty()) {
|
||||||
{
|
|
||||||
LogInfo("No textures for import.");
|
LogInfo("No textures for import.");
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -451,32 +435,21 @@ void CGLView::BBox_GetFromVertices(const aiVector3D* pVertices, const size_t pVe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************/
|
void CGLView::LogInfo(const QString& pMessage) {
|
||||||
/************************ Logging functions *************************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
void CGLView::LogInfo(const QString& pMessage)
|
|
||||||
{
|
|
||||||
Assimp::DefaultLogger::get()->info(pMessage.toStdString());
|
Assimp::DefaultLogger::get()->info(pMessage.toStdString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGLView::LogError(const QString& pMessage)
|
void CGLView::LogError(const QString& pMessage) {
|
||||||
{
|
|
||||||
Assimp::DefaultLogger::get()->error(pMessage.toStdString());
|
Assimp::DefaultLogger::get()->error(pMessage.toStdString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************/
|
void CGLView::Draw_Node(const aiNode* pNode) {
|
||||||
/************************** Draw functions **************************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
void CGLView::Draw_Node(const aiNode* pNode)
|
|
||||||
{
|
|
||||||
aiMatrix4x4 mat_node = pNode->mTransformation;
|
aiMatrix4x4 mat_node = pNode->mTransformation;
|
||||||
|
|
||||||
// Apply node transformation matrix.
|
// Apply node transformation matrix.
|
||||||
mat_node.Transpose();
|
mat_node.Transpose();
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
#if ASSIMP_DOUBLE_PRECISION
|
#ifdef ASSIMP_DOUBLE_PRECISION
|
||||||
glMultMatrixd((GLdouble*)mat_node[0]);
|
glMultMatrixd((GLdouble*)mat_node[0]);
|
||||||
#else
|
#else
|
||||||
glMultMatrixf((GLfloat*)&mat_node);
|
glMultMatrixf((GLfloat*)&mat_node);
|
||||||
|
@ -518,7 +491,7 @@ void CGLView::Draw_Mesh(const size_t pMesh_Index)
|
||||||
{
|
{
|
||||||
glEnable(GL_COLOR_MATERIAL);///TODO: cache
|
glEnable(GL_COLOR_MATERIAL);///TODO: cache
|
||||||
glEnableClientState(GL_COLOR_ARRAY);
|
glEnableClientState(GL_COLOR_ARRAY);
|
||||||
#if ASSIMP_DOUBLE_PRECISION
|
#ifdef ASSIMP_DOUBLE_PRECISION
|
||||||
glColorPointer(4, GL_DOUBLE, 0, mesh_cur.mColors[0]);
|
glColorPointer(4, GL_DOUBLE, 0, mesh_cur.mColors[0]);
|
||||||
#else
|
#else
|
||||||
glColorPointer(4, GL_FLOAT, 0, mesh_cur.mColors[0]);
|
glColorPointer(4, GL_FLOAT, 0, mesh_cur.mColors[0]);
|
||||||
|
@ -531,7 +504,7 @@ void CGLView::Draw_Mesh(const size_t pMesh_Index)
|
||||||
if(mesh_cur.HasTextureCoords(0))
|
if(mesh_cur.HasTextureCoords(0))
|
||||||
{
|
{
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
#if ASSIMP_DOUBLE_PRECISION
|
#ifdef ASSIMP_DOUBLE_PRECISION
|
||||||
glTexCoordPointer(2, GL_DOUBLE, sizeof(aiVector3D), mesh_cur.mTextureCoords[0]);
|
glTexCoordPointer(2, GL_DOUBLE, sizeof(aiVector3D), mesh_cur.mTextureCoords[0]);
|
||||||
#else
|
#else
|
||||||
glTexCoordPointer(2, GL_FLOAT, sizeof(aiVector3D), mesh_cur.mTextureCoords[0]);
|
glTexCoordPointer(2, GL_FLOAT, sizeof(aiVector3D), mesh_cur.mTextureCoords[0]);
|
||||||
|
@ -544,7 +517,7 @@ void CGLView::Draw_Mesh(const size_t pMesh_Index)
|
||||||
if(mesh_cur.HasNormals())
|
if(mesh_cur.HasNormals())
|
||||||
{
|
{
|
||||||
glEnableClientState(GL_NORMAL_ARRAY);
|
glEnableClientState(GL_NORMAL_ARRAY);
|
||||||
#if ASSIMP_DOUBLE_PRECISION
|
#ifdef ASSIMP_DOUBLE_PRECISION
|
||||||
glNormalPointer(GL_DOUBLE, 0, mesh_cur.mNormals);
|
glNormalPointer(GL_DOUBLE, 0, mesh_cur.mNormals);
|
||||||
#else
|
#else
|
||||||
glNormalPointer(GL_FLOAT, 0, mesh_cur.mNormals);
|
glNormalPointer(GL_FLOAT, 0, mesh_cur.mNormals);
|
||||||
|
@ -581,16 +554,12 @@ void CGLView::Draw_BBox(const SBBox& pBBox)
|
||||||
glBindTexture(GL_TEXTURE_1D, 0);
|
glBindTexture(GL_TEXTURE_1D, 0);
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
glBindTexture(GL_TEXTURE_3D, 0);
|
glBindTexture(GL_TEXTURE_3D, 0);
|
||||||
#if ASSIMP_QT4_VIEWER
|
|
||||||
qglColor(QColor(Qt::white));
|
|
||||||
#else
|
|
||||||
const QColor c_w(Qt::white);
|
const QColor c_w(Qt::white);
|
||||||
|
|
||||||
glColor3f(c_w.redF(), c_w.greenF(), c_w.blueF());
|
glColor3f(c_w.redF(), c_w.greenF(), c_w.blueF());
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
|
|
||||||
glBegin(GL_LINE_STRIP);
|
glBegin(GL_LINE_STRIP);
|
||||||
# if ASSIMP_DOUBLE_PRECISION
|
# 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[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.
|
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
|
# else
|
||||||
|
@ -600,7 +569,7 @@ void CGLView::Draw_BBox(const SBBox& pBBox)
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
# if ASSIMP_DOUBLE_PRECISION
|
# ifdef ASSIMP_DOUBLE_PRECISION
|
||||||
glVertex3dv(&vertex[1][0]), glVertex3dv(&vertex[5][0]);
|
glVertex3dv(&vertex[1][0]), glVertex3dv(&vertex[5][0]);
|
||||||
glVertex3dv(&vertex[2][0]), glVertex3dv(&vertex[6][0]);
|
glVertex3dv(&vertex[2][0]), glVertex3dv(&vertex[6][0]);
|
||||||
glVertex3dv(&vertex[3][0]), glVertex3dv(&vertex[7][0]);
|
glVertex3dv(&vertex[3][0]), glVertex3dv(&vertex[7][0]);
|
||||||
|
@ -615,48 +584,28 @@ void CGLView::Draw_BBox(const SBBox& pBBox)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGLView::Enable_Textures(const bool pEnable)
|
void CGLView::Enable_Textures(const bool pEnable) {
|
||||||
{
|
if(pEnable) {
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_Begin;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
|
|
||||||
if(pEnable)
|
|
||||||
{
|
|
||||||
glEnable(GL_TEXTURE_1D);
|
glEnable(GL_TEXTURE_1D);
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
glEnable(GL_TEXTURE_3D);
|
glEnable(GL_TEXTURE_3D);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
glDisable(GL_TEXTURE_1D);
|
glDisable(GL_TEXTURE_1D);
|
||||||
glDisable(GL_TEXTURE_2D);
|
glDisable(GL_TEXTURE_2D);
|
||||||
glDisable(GL_TEXTURE_3D);
|
glDisable(GL_TEXTURE_3D);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_End;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************/
|
void CGLView::initializeGL() {
|
||||||
/*********************** Override functions ************************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
void CGLView::initializeGL()
|
|
||||||
{
|
|
||||||
#if ASSIMP_QT4_VIEWER
|
|
||||||
qglClearColor(Qt::gray);
|
|
||||||
#else
|
|
||||||
mGLContext_Current = true;
|
mGLContext_Current = true;
|
||||||
initializeOpenGLFunctions();
|
initializeOpenGLFunctions();
|
||||||
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
|
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
glShadeModel(GL_SMOOTH);
|
glShadeModel(GL_SMOOTH);
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glEnable(GL_NORMALIZE);
|
glEnable(GL_NORMALIZE);
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glEnable( GL_MULTISAMPLE );
|
||||||
|
|
||||||
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT);
|
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT);
|
||||||
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
|
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
|
||||||
|
@ -668,25 +617,14 @@ void CGLView::initializeGL()
|
||||||
glCullFace(GL_BACK);
|
glCullFace(GL_BACK);
|
||||||
|
|
||||||
glFrontFace(GL_CCW);
|
glFrontFace(GL_CCW);
|
||||||
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
mGLContext_Current = false;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGLView::resizeGL(int pWidth, int pHeight)
|
void CGLView::resizeGL(int width, int height) {
|
||||||
{
|
mCamera_Viewport_AspectRatio = (GLdouble)width / height;
|
||||||
#if !ASSIMP_QT4_VIEWER
|
glViewport(0, 0, width, height);
|
||||||
mGLContext_Current = true;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
mCamera_Viewport_AspectRatio = (GLdouble)pWidth / pHeight;
|
|
||||||
glViewport(0, 0, pWidth, pHeight);
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
gluPerspective(mCamera_FOVY, mCamera_Viewport_AspectRatio, 1.0, 100000.0);///TODO: znear/zfar depend on scene size.
|
gluPerspective(mCamera_FOVY, mCamera_Viewport_AspectRatio, 1.0, 100000.0);///TODO: znear/zfar depend on scene size.
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
mGLContext_Current = false;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGLView::drawCoordSystem() {
|
void CGLView::drawCoordSystem() {
|
||||||
|
@ -699,19 +637,8 @@ void CGLView::drawCoordSystem() {
|
||||||
glBindTexture(GL_TEXTURE_3D, 0);
|
glBindTexture(GL_TEXTURE_3D, 0);
|
||||||
glEnable(GL_COLOR_MATERIAL);
|
glEnable(GL_COLOR_MATERIAL);
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
#if ASSIMP_QT4_VIEWER
|
|
||||||
// X, -X
|
// X, -X
|
||||||
qglColor(QColor(Qt::red)), glVertex3f(0.0, 0.0, 0.0), glVertex3f(100000.0, 0.0, 0.0);
|
|
||||||
qglColor(QColor(Qt::cyan)), glVertex3f(0.0, 0.0, 0.0), glVertex3f(-100000.0, 0.0, 0.0);
|
|
||||||
// Y, -Y
|
|
||||||
qglColor(QColor(Qt::green)), glVertex3f(0.0, 0.0, 0.0), glVertex3f(0.0, 100000.0, 0.0);
|
|
||||||
qglColor(QColor(Qt::magenta)), glVertex3f(0.0, 0.0, 0.0), glVertex3f(0.0, -100000.0, 0.0);
|
|
||||||
// Z, -Z
|
|
||||||
qglColor(QColor(Qt::blue)), glVertex3f(0.0, 0.0, 0.0), glVertex3f(0.0, 0.0, 100000.0);
|
|
||||||
qglColor(QColor(Qt::yellow)), glVertex3f(0.0, 0.0, 0.0), glVertex3f(0.0, 0.0, -100000.0);
|
|
||||||
qglColor(QColor(Qt::white));
|
|
||||||
#else
|
|
||||||
// X, -X
|
|
||||||
glColor3f(1.0f, 0.0f, 0.0f), glVertex3f(0.0, 0.0, 0.0), glVertex3f(100000.0, 0.0, 0.0);
|
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);
|
glColor3f(0.5f, 0.5f, 1.0f), glVertex3f(0.0, 0.0, 0.0), glVertex3f(-100000.0, 0.0, 0.0);
|
||||||
// Y, -Y
|
// Y, -Y
|
||||||
|
@ -721,19 +648,15 @@ void CGLView::drawCoordSystem() {
|
||||||
glColor3f(0.0f, 0.0f, 1.0f), glVertex3f(0.0, 0.0, 0.0), glVertex3f(0.0, 0.0, 100000.0);
|
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, 0.0f), glVertex3f(0.0, 0.0, 0.0), glVertex3f(0.0, 0.0, -100000.0);
|
||||||
glColor3f(1.0f, 1.0f, 1.0f);
|
glColor3f(1.0f, 1.0f, 1.0f);
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
glEnd();
|
|
||||||
// Restore previous state of lighting.
|
|
||||||
if(mLightingEnabled) glEnable(GL_LIGHTING);
|
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
// Restore previous state of lighting.
|
||||||
|
if (mLightingEnabled) {
|
||||||
|
glEnable( GL_LIGHTING );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGLView::paintGL()
|
void CGLView::paintGL() {
|
||||||
{
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
mGLContext_Current = true;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
|
|
||||||
QTime time_paintbegin;
|
QTime time_paintbegin;
|
||||||
|
|
||||||
time_paintbegin = QTime::currentTime();
|
time_paintbegin = QTime::currentTime();
|
||||||
|
@ -741,6 +664,7 @@ void CGLView::paintGL()
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
||||||
// Apply current camera transformations.
|
// Apply current camera transformations.
|
||||||
#if ASSIMP_DOUBLE_PRECISION
|
#if ASSIMP_DOUBLE_PRECISION
|
||||||
glMultMatrixd((GLdouble*)&mHelper_Camera.Rotation_AroundCamera);
|
glMultMatrixd((GLdouble*)&mHelper_Camera.Rotation_AroundCamera);
|
||||||
|
@ -753,58 +677,38 @@ void CGLView::paintGL()
|
||||||
#endif // ASSIMP_DOUBLE_PRECISION
|
#endif // ASSIMP_DOUBLE_PRECISION
|
||||||
|
|
||||||
// Coordinate system
|
// Coordinate system
|
||||||
if (mScene_AxesEnabled == true)
|
if ( mScene_AxesEnabled ) {
|
||||||
{
|
|
||||||
drawCoordSystem();
|
drawCoordSystem();
|
||||||
}
|
}
|
||||||
|
|
||||||
glDisable(GL_COLOR_MATERIAL);
|
glDisable(GL_COLOR_MATERIAL);
|
||||||
// Scene
|
|
||||||
if(mScene != nullptr)
|
// Scene
|
||||||
{
|
if(mScene != nullptr) {
|
||||||
Draw_Node(mScene->mRootNode);
|
Draw_Node(mScene->mRootNode);
|
||||||
// Scene BBox
|
// Scene BBox
|
||||||
if(mScene_DrawBBox) Draw_BBox(mScene_BBox);
|
if (mScene_DrawBBox) {
|
||||||
|
Draw_BBox( mScene_BBox );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
emit Paint_Finished((size_t)time_paintbegin.msecsTo(QTime::currentTime()), mHelper_Camera.Translation_ToScene.Length());
|
emit Paint_Finished((size_t) time_paintbegin.msecsTo(QTime::currentTime()), mHelper_Camera.Translation_ToScene.Length());
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
mGLContext_Current = false;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
/********************** Constructor/Destructor **********************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
CGLView::CGLView(QWidget *pParent)
|
CGLView::CGLView( QWidget *pParent )
|
||||||
#if ASSIMP_QT4_VIEWER
|
: QOpenGLWidget( pParent )
|
||||||
: QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer), pParent)
|
, mGLContext_Current( false ) {
|
||||||
#else
|
// set initial view
|
||||||
: QOpenGLWidget(pParent), mGLContext_Current(false)
|
mHelper_CameraDefault.SetDefault();
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
Camera_Set( 0 );
|
||||||
{
|
|
||||||
// set initial view
|
|
||||||
mHelper_CameraDefault.SetDefault();
|
|
||||||
Camera_Set(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLView::~CGLView()
|
CGLView::~CGLView() {
|
||||||
{
|
|
||||||
FreeScene();
|
FreeScene();
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************/
|
void CGLView::FreeScene() {
|
||||||
/********************* Scene control functions **********************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
void CGLView::FreeScene()
|
|
||||||
{
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_Begin;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
|
|
||||||
// Set scene to null and after that \ref paintGL will not try to render it.
|
// Set scene to null and after that \ref paintGL will not try to render it.
|
||||||
mScene = nullptr;
|
mScene = nullptr;
|
||||||
// Clean helper objects.
|
// Clean helper objects.
|
||||||
|
@ -834,21 +738,14 @@ void CGLView::FreeScene()
|
||||||
mTexture_IDMap.clear();
|
mTexture_IDMap.clear();
|
||||||
delete [] id_tex;
|
delete [] id_tex;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_End;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGLView::SetScene(const aiScene *pScene, const QString& pScenePath)
|
void CGLView::SetScene(const aiScene *pScene, const QString& pScenePath) {
|
||||||
{
|
FreeScene();// Clear old data
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_Begin;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
|
|
||||||
FreeScene();// Clear old data
|
|
||||||
// Why checking here, not at begin of function. Because old scene may not exist at know. So, need cleanup.
|
// Why checking here, not at begin of function. Because old scene may not exist at know. So, need cleanup.
|
||||||
if(pScene == nullptr) return;
|
if (pScene == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
mScene = pScene;// Copy pointer of new scene.
|
mScene = pScene;// Copy pointer of new scene.
|
||||||
|
|
||||||
|
@ -874,7 +771,7 @@ void CGLView::SetScene(const aiScene *pScene, const QString& pScenePath)
|
||||||
|
|
||||||
BBox_GetFromVertices(mesh_cur.mVertices, mesh_cur.mNumVertices, mesh_bbox);
|
BBox_GetFromVertices(mesh_cur.mVertices, mesh_cur.mNumVertices, mesh_bbox);
|
||||||
//
|
//
|
||||||
// Create vertices indices arrays splited by primitive type.
|
// Create vertices indices arrays splitted by primitive type.
|
||||||
//
|
//
|
||||||
size_t indcnt_p = 0;// points quantity
|
size_t indcnt_p = 0;// points quantity
|
||||||
size_t indcnt_l = 0;// lines quantity
|
size_t indcnt_l = 0;// lines quantity
|
||||||
|
@ -1039,7 +936,10 @@ void CGLView::SetScene(const aiScene *pScene, const QString& pScenePath)
|
||||||
}// switch(light_cur.mType)
|
}// switch(light_cur.mType)
|
||||||
|
|
||||||
// Add light source
|
// Add light source
|
||||||
if(name.isEmpty()) name += QString("%1").arg(idx_light);// Use index if name is empty.
|
// Use index if name is empty.
|
||||||
|
if (name.isEmpty()) {
|
||||||
|
name += QString( "%1" ).arg( idx_light );
|
||||||
|
}
|
||||||
|
|
||||||
Lighting_EditSource(idx_light, lp);
|
Lighting_EditSource(idx_light, lp);
|
||||||
emit SceneObject_LightSource(name);// Light source will be enabled in signal handler.
|
emit SceneObject_LightSource(name);// Light source will be enabled in signal handler.
|
||||||
|
@ -1072,66 +972,48 @@ void CGLView::SetScene(const aiScene *pScene, const QString& pScenePath)
|
||||||
emit SceneObject_Camera(mScene->mCameras[idx_cam]->mName.C_Str());
|
emit SceneObject_Camera(mScene->mCameras[idx_cam]->mName.C_Str());
|
||||||
}
|
}
|
||||||
}// if(!mScene->HasCameras()) else
|
}// if(!mScene->HasCameras()) else
|
||||||
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_End;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************/
|
void CGLView::Lighting_Enable() {
|
||||||
/******************** Lighting control functions ********************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
void CGLView::Lighting_Enable()
|
|
||||||
{
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_Begin;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
|
|
||||||
mLightingEnabled = true;
|
mLightingEnabled = true;
|
||||||
glEnable(GL_LIGHTING);
|
glEnable(GL_LIGHTING);
|
||||||
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_End;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGLView::Lighting_Disable()
|
void CGLView::Lighting_Disable() {
|
||||||
{
|
glDisable( GL_LIGHTING );
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_Begin;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
|
|
||||||
glDisable(GL_LIGHTING);
|
|
||||||
mLightingEnabled = false;
|
mLightingEnabled = false;
|
||||||
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_End;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGLView::Lighting_EditSource(const size_t pLightNumber, const SLightParameters& pLightParameters)
|
void CGLView::Lighting_EditSource(const size_t pLightNumber, const SLightParameters& pLightParameters)
|
||||||
{
|
{
|
||||||
#if !ASSIMP_QT4_VIEWER
|
const size_t light_num = GL_LIGHT0 + pLightNumber;
|
||||||
ConditionalContextControl_Begin;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
|
|
||||||
const size_t light_num = GL_LIGHT0 + pLightNumber;
|
GLfloat farr[4];
|
||||||
|
|
||||||
GLfloat farr[4];
|
|
||||||
|
|
||||||
if(pLightNumber >= GL_MAX_LIGHTS) return;///TODO: return value;
|
if(pLightNumber >= GL_MAX_LIGHTS) return;///TODO: return value;
|
||||||
|
|
||||||
// Ambient color
|
// Ambient color
|
||||||
farr[0] = pLightParameters.Ambient.r, farr[1] = pLightParameters.Ambient.g; farr[2] = pLightParameters.Ambient.b; farr[3] = pLightParameters.Ambient.a;
|
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);
|
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;
|
// 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);
|
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;
|
// 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);
|
glLightfv(light_num, GL_SPECULAR, farr);
|
||||||
// Other parameters
|
|
||||||
|
// Other parameters
|
||||||
switch(pLightParameters.Type)
|
switch(pLightParameters.Type)
|
||||||
{
|
{
|
||||||
case aiLightSource_DIRECTIONAL:
|
case aiLightSource_DIRECTIONAL:
|
||||||
|
@ -1176,46 +1058,21 @@ GLfloat farr[4];
|
||||||
glLightf(light_num, GL_SPOT_CUTOFF, 180.0);
|
glLightf(light_num, GL_SPOT_CUTOFF, 180.0);
|
||||||
break;
|
break;
|
||||||
}// switch(pLightParameters.Type)
|
}// switch(pLightParameters.Type)
|
||||||
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_End;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGLView::Lighting_EnableSource(const size_t pLightNumber)
|
void CGLView::Lighting_EnableSource(const size_t pLightNumber) {
|
||||||
{
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_Begin;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
|
|
||||||
if(pLightNumber >= GL_MAX_LIGHTS) return;///TODO: return value;
|
if(pLightNumber >= GL_MAX_LIGHTS) return;///TODO: return value;
|
||||||
|
|
||||||
glEnable(GL_LIGHT0 + pLightNumber);
|
glEnable(GL_LIGHT0 + pLightNumber);
|
||||||
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_End;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGLView::Lighting_DisableSource(const size_t pLightNumber)
|
void CGLView::Lighting_DisableSource(const size_t pLightNumber)
|
||||||
{
|
{
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_Begin;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
|
|
||||||
if(pLightNumber >= GL_MAX_LIGHTS) return;///TODO: return value;
|
if(pLightNumber >= GL_MAX_LIGHTS) return;///TODO: return value;
|
||||||
|
|
||||||
glDisable(GL_LIGHT0 + pLightNumber);
|
glDisable(GL_LIGHT0 + pLightNumber);
|
||||||
|
|
||||||
#if !ASSIMP_QT4_VIEWER
|
|
||||||
ConditionalContextControl_End;
|
|
||||||
#endif // ASSIMP_QT4_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
/******************** Cameras control functions *********************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
void CGLView::Camera_Set(const size_t pCameraNumber)
|
void CGLView::Camera_Set(const size_t pCameraNumber)
|
||||||
{
|
{
|
||||||
SHelper_Camera& hcam = mHelper_Camera;// reference with short name for conveniance.
|
SHelper_Camera& hcam = mHelper_Camera;// reference with short name for conveniance.
|
||||||
|
@ -1263,7 +1120,7 @@ void CGLView::Camera_Set(const size_t pCameraNumber)
|
||||||
|
|
||||||
void CGLView::Camera_RotateScene(const GLfloat pAngle_X, const GLfloat pAngle_Y, const GLfloat pAngle_Z, const aiMatrix4x4* pMatrix_Rotation_Initial) {
|
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 {
|
auto deg2rad = [](const GLfloat pDegree) -> GLfloat {
|
||||||
return pDegree * AI_MATH_PI / 180.0;
|
return pDegree * AI_MATH_PI / 180.0f;
|
||||||
};
|
};
|
||||||
|
|
||||||
aiMatrix4x4 mat_rot;
|
aiMatrix4x4 mat_rot;
|
||||||
|
|
|
@ -1,7 +1,45 @@
|
||||||
/// \file glview.hpp
|
/*
|
||||||
/// \brief OpenGL visualisation.
|
---------------------------------------------------------------------------
|
||||||
/// \author smal.root@gmail.com
|
Open Asset Import Library (assimp)
|
||||||
/// \date 2016
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
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
|
#pragma once
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,64 @@
|
||||||
/// \file loggerview.cpp
|
/*
|
||||||
/// \brief Stream for Assimp logging subsystem.
|
---------------------------------------------------------------------------
|
||||||
/// \author smal.root@gmail.com
|
Open Asset Import Library (assimp)
|
||||||
/// \date 2016
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
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"
|
#include "loggerview.hpp"
|
||||||
|
|
||||||
// Header files, Qt.
|
// Header files, Qt.
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
|
#include <QTextBrowser>
|
||||||
|
|
||||||
CLoggerView::CLoggerView(QTextBrowser* pOutputWidget)
|
CLoggerView::CLoggerView(QTextBrowser* pOutputWidget)
|
||||||
: mOutputWidget(pOutputWidget)
|
: mOutputWidget(pOutputWidget) {
|
||||||
{
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
void CLoggerView::write(const char *pMessage)
|
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));
|
mOutputWidget->insertPlainText(QString("[%1] %2").arg(QTime::currentTime().toString()).arg(pMessage));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,33 +1,67 @@
|
||||||
/// \file loggerview.hpp
|
/*
|
||||||
/// \brief Stream for Assimp logging subsystem.
|
---------------------------------------------------------------------------
|
||||||
/// \author smal.root@gmail.com
|
Open Asset Import Library (assimp)
|
||||||
/// \date 2016
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
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
|
#pragma once
|
||||||
|
|
||||||
// Header files, Qt.
|
|
||||||
#include <QTextBrowser>
|
|
||||||
|
|
||||||
// Header files, Assimp.
|
// Header files, Assimp.
|
||||||
#include <assimp/DefaultLogger.hpp>
|
#include <assimp/DefaultLogger.hpp>
|
||||||
|
|
||||||
/// \class CLoggerView
|
class QTextBrowser;
|
||||||
/// GUI-stream for Assimp logging subsytem. Get data for logging and write it to output widget.
|
|
||||||
class CLoggerView final : public Assimp::LogStream
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
|
|
||||||
QTextBrowser* mOutputWidget;///< Widget for displaying messages.
|
|
||||||
|
|
||||||
|
/// @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:
|
public:
|
||||||
|
/// @brief The class constructor.
|
||||||
|
/// @param [in] pOutputWidget - pointer to output widget.
|
||||||
|
explicit CLoggerView( QTextBrowser* pOutputWidget );
|
||||||
|
|
||||||
/// \fn explicit CLoggerView(QTextBrowser* pOutputWidget)
|
/// @brief The class destructor.
|
||||||
/// Constructor.
|
virtual ~CLoggerView();
|
||||||
/// \param [in] pOutputWidget - pointer to output widget.
|
|
||||||
explicit CLoggerView(QTextBrowser* pOutputWidget);
|
|
||||||
|
|
||||||
/// \fn virtual void write(const char *pMessage)
|
|
||||||
/// Write message to output widget. Used by Assimp.
|
/// Write message to output widget. Used by Assimp.
|
||||||
/// \param [in] pMessage - message for displaying.
|
/// \param [in] pMessage - message for displaying.
|
||||||
virtual void write(const char *pMessage);
|
virtual void write(const char *pMessage);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QTextBrowser * mOutputWidget; ///< Widget for displaying messages.
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,7 +1,46 @@
|
||||||
/// \file main.cpp
|
/*
|
||||||
/// \brief Start-up file which contain function "main".
|
---------------------------------------------------------------------------
|
||||||
/// \author smal.root@gmail.com
|
Open Asset Import Library (assimp)
|
||||||
/// \date 2016
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
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.
|
// Thanks to acorn89 for support.
|
||||||
|
|
||||||
// Header files, project.
|
// Header files, project.
|
||||||
|
@ -11,9 +50,9 @@
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
QApplication a(argc, argv);
|
QApplication app(argc, argv);
|
||||||
MainWindow w;
|
MainWindow win;
|
||||||
w.show();
|
win.show();
|
||||||
|
|
||||||
return a.exec();
|
return app.exec();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,45 @@
|
||||||
/// \file mainwindow.hpp
|
/*
|
||||||
/// \brief Main window and algorhytms.
|
---------------------------------------------------------------------------
|
||||||
/// \author smal.root@gmail.com
|
Open Asset Import Library (assimp)
|
||||||
/// \date 2016
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
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 "mainwindow.hpp"
|
||||||
#include "ui_mainwindow.h"
|
#include "ui_mainwindow.h"
|
||||||
|
@ -14,22 +52,13 @@
|
||||||
#define __unused __attribute__((unused))
|
#define __unused __attribute__((unused))
|
||||||
#endif // __unused
|
#endif // __unused
|
||||||
|
|
||||||
/**********************************/
|
|
||||||
/************ Functions ***********/
|
|
||||||
/**********************************/
|
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
/********************* Import/Export functions **********************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
void MainWindow::ImportFile(const QString &pFileName)
|
|
||||||
{
|
|
||||||
using namespace Assimp;
|
using namespace Assimp;
|
||||||
|
|
||||||
QTime time_begin = QTime::currentTime();
|
|
||||||
|
|
||||||
if(mScene != nullptr)
|
void MainWindow::ImportFile(const QString &pFileName) {
|
||||||
{
|
QTime time_begin = QTime::currentTime();
|
||||||
|
|
||||||
|
if ( mScene != nullptr ) {
|
||||||
mImporter.FreeScene();
|
mImporter.FreeScene();
|
||||||
mGLView->FreeScene();
|
mGLView->FreeScene();
|
||||||
}
|
}
|
||||||
|
@ -37,8 +66,7 @@ QTime time_begin = QTime::currentTime();
|
||||||
// Try to import scene.
|
// Try to import scene.
|
||||||
mScene = mImporter.ReadFile(pFileName.toStdString(), aiProcess_Triangulate | aiProcess_GenNormals | aiProcess_ValidateDataStructure | \
|
mScene = mImporter.ReadFile(pFileName.toStdString(), aiProcess_Triangulate | aiProcess_GenNormals | aiProcess_ValidateDataStructure | \
|
||||||
aiProcess_GenUVCoords | aiProcess_TransformUVCoords | aiProcess_FlipUVs);
|
aiProcess_GenUVCoords | aiProcess_TransformUVCoords | aiProcess_FlipUVs);
|
||||||
if(mScene != nullptr)
|
if ( mScene != nullptr ) {
|
||||||
{
|
|
||||||
ui->lblLoadTime->setText(QString::number(time_begin.secsTo(QTime::currentTime())));
|
ui->lblLoadTime->setText(QString::number(time_begin.secsTo(QTime::currentTime())));
|
||||||
LogInfo("Import done: " + pFileName);
|
LogInfo("Import done: " + pFileName);
|
||||||
// Prepare widgets for new scene.
|
// Prepare widgets for new scene.
|
||||||
|
@ -60,8 +88,7 @@ QTime time_begin = QTime::currentTime();
|
||||||
size_t qty_face = 0;
|
size_t qty_face = 0;
|
||||||
size_t qty_vert = 0;
|
size_t qty_vert = 0;
|
||||||
|
|
||||||
for(size_t idx_mesh = 0; idx_mesh < mScene->mNumMeshes; idx_mesh++)
|
for(size_t idx_mesh = 0; idx_mesh < mScene->mNumMeshes; idx_mesh++) {
|
||||||
{
|
|
||||||
qty_face += mScene->mMeshes[idx_mesh]->mNumFaces;
|
qty_face += mScene->mMeshes[idx_mesh]->mNumFaces;
|
||||||
qty_vert += mScene->mMeshes[idx_mesh]->mNumVertices;
|
qty_vert += mScene->mMeshes[idx_mesh]->mNumVertices;
|
||||||
}
|
}
|
||||||
|
@ -241,7 +268,6 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
: QMainWindow(parent), ui(new Ui::MainWindow),
|
: QMainWindow(parent), ui(new Ui::MainWindow),
|
||||||
mScene(nullptr)
|
mScene(nullptr)
|
||||||
{
|
{
|
||||||
using namespace Assimp;
|
|
||||||
|
|
||||||
// other variables
|
// other variables
|
||||||
mMouse_Transformation.Position_Pressed_Valid = false;
|
mMouse_Transformation.Position_Pressed_Valid = false;
|
||||||
|
|
|
@ -1,7 +1,45 @@
|
||||||
/// \file mainwindow.hpp
|
/*
|
||||||
/// \brief Main window and algorhytms.
|
---------------------------------------------------------------------------
|
||||||
/// \author smal.root@gmail.com
|
Open Asset Import Library (assimp)
|
||||||
/// \date 2016
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
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
|
#pragma once
|
||||||
|
|
||||||
|
@ -20,125 +58,64 @@
|
||||||
#include <assimp/Importer.hpp>
|
#include <assimp/Importer.hpp>
|
||||||
#include <assimp/scene.h>
|
#include <assimp/scene.h>
|
||||||
|
|
||||||
namespace Ui { class MainWindow; }
|
namespace Ui {
|
||||||
|
class MainWindow;
|
||||||
|
}
|
||||||
|
|
||||||
/// \class MainWindow
|
/// \class MainWindow
|
||||||
/// Main window and algorhytms.
|
/// Main window and algorithms.
|
||||||
class MainWindow : public QMainWindow
|
class MainWindow : public QMainWindow {
|
||||||
{
|
Q_OBJECT
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
/**********************************/
|
struct SMouse_Transformation;
|
||||||
/************ Variables ***********/
|
|
||||||
/**********************************/
|
|
||||||
|
|
||||||
private:
|
public:
|
||||||
|
/// @brief The class constructor.
|
||||||
|
/// \param [in] pParent - pointer to parent widget.
|
||||||
|
explicit MainWindow( QWidget* pParent = 0 );
|
||||||
|
|
||||||
Ui::MainWindow *ui;
|
/// @brief The class destructor.
|
||||||
|
~MainWindow();
|
||||||
CGLView* mGLView;///< Pointer to OpenGL render.
|
|
||||||
CLoggerView* mLoggerView;///< Pointer to logging object.
|
/// Import scene from file.
|
||||||
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;
|
|
||||||
|
|
||||||
/**********************************/
|
|
||||||
/************ Functions ***********/
|
|
||||||
/**********************************/
|
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
/********************* Import/Export functions **********************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
/// \fn void ImportFile(const QString& pFileName)
|
|
||||||
/// Import scene from file.
|
|
||||||
/// \param [in] pFileName - path and name of the file.
|
/// \param [in] pFileName - path and name of the file.
|
||||||
void ImportFile(const QString& pFileName);
|
void ImportFile(const QString& pFileName);
|
||||||
|
|
||||||
|
|
||||||
/// \fn void ResetSceneInfos()
|
|
||||||
/// Reset informations about the scene
|
/// Reset informations about the scene
|
||||||
void ResetSceneInfos();
|
void ResetSceneInfos();
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
/************************ Logging functions *************************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
/// \fn void LogInfo(const QString& pMessage)
|
|
||||||
/// Add message with severity "Warning" to log.
|
/// Add message with severity "Warning" to log.
|
||||||
void LogInfo(const QString& pMessage);
|
void LogInfo(const QString& pMessage);
|
||||||
|
|
||||||
/// \fn void LogError(const QString& pMessage)
|
|
||||||
/// Add message with severity "Error" to log.
|
/// Add message with severity "Error" to log.
|
||||||
void LogError(const QString& pMessage);
|
void LogError(const QString& pMessage);
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
/*********************** Override functions ************************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/// \fn void mousePressEvent(QMouseEvent* pEvent) override
|
|
||||||
/// Override function which handles mouse event "button pressed".
|
/// Override function which handles mouse event "button pressed".
|
||||||
/// \param [in] pEvent - pointer to event data.
|
/// \param [in] pEvent - pointer to event data.
|
||||||
void mousePressEvent(QMouseEvent* pEvent) override;
|
void mousePressEvent(QMouseEvent* pEvent) override;
|
||||||
|
|
||||||
/// \fn void mouseReleaseEvent(QMouseEvent *pEvent) override
|
|
||||||
/// Override function which handles mouse event "button released".
|
/// Override function which handles mouse event "button released".
|
||||||
/// \param [in] pEvent - pointer to event data.
|
/// \param [in] pEvent - pointer to event data.
|
||||||
void mouseReleaseEvent(QMouseEvent *pEvent) override;
|
void mouseReleaseEvent(QMouseEvent *pEvent) override;
|
||||||
|
|
||||||
/// \fn void mouseMoveEvent(QMouseEvent* pEvent) override
|
|
||||||
/// Override function which handles mouse event "move".
|
/// Override function which handles mouse event "move".
|
||||||
/// \param [in] pEvent - pointer to event data.
|
/// \param [in] pEvent - pointer to event data.
|
||||||
void mouseMoveEvent(QMouseEvent* pEvent) override;
|
void mouseMoveEvent(QMouseEvent* pEvent) override;
|
||||||
|
|
||||||
/// \fn void keyPressEvent(QKeyEvent* pEvent) override
|
|
||||||
/// Override function which handles key event "key pressed".
|
/// Override function which handles key event "key pressed".
|
||||||
/// \param [in] pEvent - pointer to event data.
|
/// \param [in] pEvent - pointer to event data.
|
||||||
void keyPressEvent(QKeyEvent* pEvent) override;
|
void keyPressEvent(QKeyEvent* pEvent) override;
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
/********************** Constructor/Destructor **********************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
/// \fn explicit MainWindow(QWidget* pParent = 0)
|
|
||||||
/// \param [in] pParent - pointer to parent widget.
|
|
||||||
explicit MainWindow(QWidget* pParent = 0);
|
|
||||||
|
|
||||||
/// \fn ~MainWindow()
|
|
||||||
/// Destructor.
|
|
||||||
~MainWindow();
|
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
/****************************** Slots *******************************/
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
/// \fn void Paint_Finished(const int pPaintTime)
|
|
||||||
/// Show paint/render time and distance between camera and center of the scene.
|
/// Show paint/render time and distance between camera and center of the scene.
|
||||||
/// \param [in] pPaintTime_ms - paint time in milliseconds.
|
/// \param [in] pPaintTime_ms - paint time in milliseconds.
|
||||||
void Paint_Finished(const size_t pPaintTime_ms, const GLfloat pDistance);
|
void Paint_Finished(const size_t pPaintTime_ms, const GLfloat pDistance);
|
||||||
|
|
||||||
/// \fn void SceneObject_Camera(const QString& pName)
|
|
||||||
/// Add camera name to list.
|
/// Add camera name to list.
|
||||||
/// \param [in] pName - name of the camera.
|
/// \param [in] pName - name of the camera.
|
||||||
void SceneObject_Camera(const QString& pName);
|
void SceneObject_Camera(const QString& pName);
|
||||||
|
|
||||||
/// \fn void SceneObject_LightSource(const QString& pName)
|
|
||||||
/// Add lighting source name to list.
|
/// Add lighting source name to list.
|
||||||
/// \param [in] pName - name of the light source,
|
/// \param [in] pName - name of the light source,
|
||||||
void SceneObject_LightSource(const QString& pName);
|
void SceneObject_LightSource(const QString& pName);
|
||||||
|
@ -151,4 +128,21 @@ private slots:
|
||||||
void on_cbxBBox_clicked(bool checked);
|
void on_cbxBBox_clicked(bool checked);
|
||||||
void on_cbxTextures_clicked(bool checked);
|
void on_cbxTextures_clicked(bool checked);
|
||||||
void on_cbxDrawAxes_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;
|
||||||
};
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue