Compare commits
2 Commits
e216217b7e
...
c745da30c6
Author | SHA1 | Date |
---|---|---|
Shaun Reed | c745da30c6 | |
Shaun Reed | bc073fbd03 |
|
@ -20,16 +20,12 @@ set(CMAKE_CXX_STANDARD 11)
|
|||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
# For CLion builds, point CMAKE_PREFIX_PATH to Qt6 install directory
|
||||
list(APPEND CMAKE_PREFIX_PATH $ENV{HOME}/Code/Clones/Qt/6.3.1/gcc_64/)
|
||||
find_package(Qt6 COMPONENTS OpenGLWidgets)
|
||||
if (NOT Qt6_FOUND)
|
||||
message(SEND_ERROR "Unable to find Qt6 at CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
|
||||
message(FATAL_ERROR "Specify path to Qt6 with `cmake -DCMAKE_PREFIX_PATH=/path/to/Qt/6.x.x/gcc_64 -S /path/to/qtk -B /path/to/qtk/build && cmake --build /path/to/qtk/build -j $(nprocs)`")
|
||||
endif()
|
||||
list(APPEND CMAKE_PREFIX_PATH $ENV{HOME}/Code/Clones/Qt6.2/6.2.3/gcc_64/)
|
||||
find_package(Qt6 COMPONENTS OpenGLWidgets REQUIRED)
|
||||
|
||||
# Add our Qt resources.qrc file to our application
|
||||
set(SOURCES app/main.cpp)
|
||||
qt6_add_big_resources(SOURCES resources.qrc)
|
||||
qt6_add_resources(SOURCES resources.qrc)
|
||||
|
||||
add_executable(qtk ${SOURCES})
|
||||
|
||||
|
@ -60,7 +56,6 @@ add_library(main-widget SHARED
|
|||
src/transform3D.cpp src/transform3D.h
|
||||
src/model.cpp src/model.h
|
||||
src/scene.cpp src/scene.h
|
||||
src/resourcemanager.cpp src/resourcemanager.h
|
||||
)
|
||||
|
||||
target_include_directories(main-widget PUBLIC src/)
|
||||
|
|
|
@ -22,10 +22,11 @@ Be sure to take note of the Qt6 installation directory, as we will need it to co
|
|||
|
||||
Once Qt6 is installed, to build and run `qtk` on Ubuntu -
|
||||
```bash
|
||||
sudo apt update -y && sudo apt install freeglut3-dev libassimp-dev cmake build-essential git
|
||||
git clone https://gitlab.com/shaunrd0/qtk
|
||||
cmake -DCMAKE_PREFIX_PATH=$HOME/Qt/6.3.1/gcc_64 -S qtk/ -B qtk/build/ && cmake --build qtk/build/ -j $(nprocs)
|
||||
./qtk/build/qtk
|
||||
sudo apt update -y && sudo apt install libassimp-dev cmake build-essential git
|
||||
git clone https://gitlab.com/shaunrd0/qtk && cd qtk
|
||||
mkdir build && cd build
|
||||
cmake .. -DCMAKE_PREFIX_PATH=$HOME/Qt6/6.2.3/gcc_64 && cmake --build .
|
||||
./qtk
|
||||
```
|
||||
|
||||
You can fly around the scene if you hold the right mouse button and use WASD.
|
||||
|
|
|
@ -39,8 +39,7 @@ public:
|
|||
|
||||
// Shader settings
|
||||
inline void setShaderVertex(const std::string & vert) { mVertexShader = vert;}
|
||||
inline void setShaderFragment(const std::string & frag)
|
||||
{ mFragmentShader = frag;}
|
||||
inline void setShaderFragment(const std::string & frag) { mFragmentShader = frag;}
|
||||
void setShaders(const std::string & vert, const std::string & frag);
|
||||
|
||||
template <typename T>
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
|
||||
#include <scene.h>
|
||||
#include <texture.h>
|
||||
#include <resourcemanager.h>
|
||||
|
||||
#include <model.h>
|
||||
|
||||
|
@ -189,18 +188,6 @@ void Model::flipTexture(const std::string & fileName, bool flipX, bool flipY)
|
|||
* Model Private Member Functions
|
||||
******************************************************************************/
|
||||
|
||||
/**
|
||||
* Loads a model in .obj, .fbx, .gltf, and other formats
|
||||
* For a full list of formats see assimp documentation:
|
||||
* https://github.com/assimp/assimp/blob/master/doc/Fileformats.md
|
||||
*
|
||||
* Models should not be loaded into Qt resource system
|
||||
* Instead pass an *absolute* path to this function
|
||||
* Relative paths will break if Qtk is executed from different locations
|
||||
* See resourcemanager.h for an example of how qtk handles this
|
||||
*
|
||||
* @param path Absolute path to a model .obj or other format accepted by assimp
|
||||
*/
|
||||
void Model::loadModel(const std::string & path)
|
||||
{
|
||||
Assimp::Importer import;
|
||||
|
@ -208,14 +195,13 @@ void Model::loadModel(const std::string & path)
|
|||
// JIC a relative path was used, get the absolute file path
|
||||
QFileInfo info(path.c_str());
|
||||
info.makeAbsolute();
|
||||
mDirectory = path[0] == ':' ? RM::getPath(path)
|
||||
: info.absoluteFilePath().toStdString();
|
||||
std::string temp = info.absoluteFilePath().toStdString();
|
||||
|
||||
// Import the model, converting non-triangular geometry to triangles
|
||||
// + And flipping texture UVs, etc..
|
||||
// Assimp options: http://assimp.sourceforge.net/lib_html/postprocess_8h.html
|
||||
const aiScene * scene =
|
||||
import.ReadFile(mDirectory, aiProcess_Triangulate
|
||||
import.ReadFile(temp, aiProcess_Triangulate
|
||||
| aiProcess_FlipUVs
|
||||
| aiProcess_GenSmoothNormals
|
||||
| aiProcess_CalcTangentSpace
|
||||
|
@ -230,7 +216,7 @@ void Model::loadModel(const std::string & path)
|
|||
return;
|
||||
}
|
||||
// If there were no errors, find the directory that contains this model
|
||||
mDirectory = mDirectory.substr(0, mDirectory.find_last_of('/'));
|
||||
mDirectory = path.substr(0, path.find_last_of('/'));
|
||||
|
||||
// Pass the pointers to the root node and the scene to recursive function
|
||||
// + Base case breaks when no nodes left to process on model
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
/*##############################################################################
|
||||
## Author: Shaun Reed ##
|
||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
||||
## About: Manage files and resources used by qtk ##
|
||||
## ##
|
||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
|
||||
#include "resourcemanager.h"
|
||||
|
||||
std::string RM::resourcesDir =
|
||||
std::string(__FILE__).substr(0, std::string(__FILE__).find("src/"))
|
||||
+ "resources/";
|
|
@ -1,35 +0,0 @@
|
|||
/*##############################################################################
|
||||
## Author: Shaun Reed ##
|
||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
||||
## About: Manage files and resources used by qtk ##
|
||||
## ##
|
||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
|
||||
#include <string>
|
||||
|
||||
#ifndef QTK_RESOURCEMANAGER_H
|
||||
#define QTK_RESOURCEMANAGER_H
|
||||
|
||||
typedef class ResourceManager {
|
||||
public:
|
||||
|
||||
/**
|
||||
* Takes a path using qrc format and constructs full system path to qtk assets
|
||||
* Qrc format prefix ':/' is trimmed from the path for the caller
|
||||
* Assets used with RM may (or may not) appear in qtk/resources.qrc
|
||||
*
|
||||
* @param path Path relative to qtk/resources/; ie) ':/models/backpack/backpack.obj'
|
||||
* An asset at location qtk/resources/path/to/asset.obj
|
||||
* Should be given in qrc format: ':/path/to/asset.obj'
|
||||
* @return Absoulte system path to a qtk asset
|
||||
*/
|
||||
static std::string getPath(const std::string & path) {
|
||||
// Only construct qtk resource path if in qrc format; else return it as-is
|
||||
return path[0] == ':' ? resourcesDir + path.substr(2) : path;
|
||||
}
|
||||
|
||||
static std::string resourcesDir;
|
||||
} RM;
|
||||
|
||||
#endif //QTK_RESOURCEMANAGER_H
|
|
@ -10,7 +10,6 @@
|
|||
#include <texture.h>
|
||||
#include <meshrenderer.h>
|
||||
#include <model.h>
|
||||
#include <resourcemanager.h>
|
||||
|
||||
#include <scene.h>
|
||||
|
||||
|
@ -151,31 +150,35 @@ void Scene::init()
|
|||
//
|
||||
// Model loading
|
||||
|
||||
mModels.push_back(new Model("backpack", ":/models/backpack/backpack.obj"));
|
||||
mModels.push_back(new Model("backpack",
|
||||
"../resources/models/backpack/backpack.obj"));
|
||||
// Sometimes model textures need flipped in certain directions
|
||||
mModels.back()->flipTexture("diffuse.jpg", false, true);
|
||||
mModels.back()->mTransform.setTranslation(0.0f, 0.0f, -10.0f);
|
||||
|
||||
mModels.push_back(new Model("bird", ":/models/bird/bird.obj"));
|
||||
mModels.push_back(new Model("bird", "../resources/models/bird/bird.obj"));
|
||||
mModels.back()->mTransform.setTranslation(2.0f, 2.0f, -10.0f);
|
||||
// Sometimes the models are very large
|
||||
mModels.back()->mTransform.scale(0.0025f);
|
||||
mModels.back()->mTransform.rotate(-110.0f, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
mModels.push_back(new Model("lion", ":/models/lion/lion.obj"));
|
||||
mModels.push_back(new Model("lion", "../resources/models/lion/lion.obj"));
|
||||
mModels.back()->mTransform.setTranslation(-3.0f, -1.0f, -10.0f);
|
||||
mModels.back()->mTransform.scale(0.15f);
|
||||
|
||||
mModels.push_back(new Model("alien", ":/models/alien-hominid/alien.obj"));
|
||||
mModels.push_back(
|
||||
new Model("alien", "../resources/models/alien-hominid/alien.obj"));
|
||||
mModels.back()->mTransform.setTranslation(2.0f, -1.0f, -5.0f);
|
||||
mModels.back()->mTransform.scale(0.15f);
|
||||
|
||||
mModels.push_back(new Model("scythe", ":/models/scythe/scythe.obj"));
|
||||
mModels.push_back( new Model("scythe",
|
||||
"../resources/models/scythe/scythe.obj"));
|
||||
mModels.back()->mTransform.setTranslation(-6.0f, 0.0f, -10.0f);
|
||||
mModels.back()->mTransform.rotate(-90.0f, 1.0f, 0.0f, 0.0f);
|
||||
mModels.back()->mTransform.rotate(90.0f, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
mModels.push_back(new Model("masterChief", ":/models/spartan/spartan.obj"));
|
||||
mModels.push_back(
|
||||
new Model("masterChief", "../resources/models/spartan/spartan.obj"));
|
||||
mModels.back()->mTransform.setTranslation(-1.5f, 0.5f, -2.0f);
|
||||
|
||||
|
||||
|
@ -193,9 +196,8 @@ void Scene::init()
|
|||
mMeshes.back()->init();
|
||||
|
||||
mModels.push_back(
|
||||
new Model("alienTest", ":/models/alien-hominid/alien.obj",
|
||||
":/model-specular.vert", ":/model-specular.frag")
|
||||
);
|
||||
new Model("alienTest", "../resources/models/alien-hominid/alien.obj",
|
||||
":/model-specular.vert", ":/model-specular.frag"));
|
||||
mModels.back()->mTransform.setTranslation(3.0f, -1.0f, 10.0f);
|
||||
mModels.back()->mTransform.scale(0.15f);
|
||||
mModels.back()->setUniform("uMaterial.ambient", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
|
@ -213,8 +215,7 @@ void Scene::init()
|
|||
|
||||
// Test spartan Model with phong lighting, specular and normal mapping
|
||||
mMeshes.push_back(
|
||||
new MeshRenderer("spartanTestLight", Triangle(QTK_DRAW_ELEMENTS))
|
||||
);
|
||||
new MeshRenderer("spartanTestLight", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(1.0f, 1.5f, 10.0f);
|
||||
mMeshes.back()->mTransform.scale(0.25f);
|
||||
// This function changes values we have allocated in a buffer, so init() after
|
||||
|
@ -222,9 +223,8 @@ void Scene::init()
|
|||
mMeshes.back()->init();
|
||||
|
||||
mModels.push_back(
|
||||
new Model("spartanTest", ":/models/spartan/spartan.obj",
|
||||
":/model-normals.vert", ":/model-normals.frag")
|
||||
);
|
||||
new Model("spartanTest", "../resources/models/spartan/spartan.obj",
|
||||
":/model-normals.vert", ":/model-normals.frag"));
|
||||
mModels.back()->mTransform.setTranslation(0.0f, -1.0f, 10.0f);
|
||||
mModels.back()->mTransform.scale(2.0f);
|
||||
mModels.back()->setUniform("uMaterial.ambient", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
|
|
Loading…
Reference in New Issue