Compare commits
9 Commits
0f372f71f4
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 7fbd4c0226 | |||
| ed604eb655 | |||
| f40366cb8d | |||
| d827d02a15 | |||
|
|
d0c8316f79 | ||
| ad59d9149e | |||
| e889785b65 | |||
| a04ebae42a | |||
| 443c09da7c |
75
.clang-format
Normal file
@@ -0,0 +1,75 @@
|
||||
---
|
||||
BasedOnStyle: Google
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignArrayOfStructures: Left
|
||||
AlignConsecutiveAssignments: None
|
||||
AlignConsecutiveDeclarations: None
|
||||
AlignConsecutiveMacros: Consecutive
|
||||
AlignEscapedNewlines: Left
|
||||
AlignOperands: Align
|
||||
AlignTrailingComments: true
|
||||
AllowAllArgumentsOnNextLine: true
|
||||
AllowShortBlocksOnASingleLine: Never
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: Inline
|
||||
AllowShortIfStatementsOnASingleLine: Never
|
||||
AllowShortLambdasOnASingleLine: All
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AlwaysBreakTemplateDeclarations: MultiLine
|
||||
InsertBraces: true
|
||||
IndentAccessModifiers: true
|
||||
EmptyLineAfterAccessModifier: Never
|
||||
EmptyLineBeforeAccessModifier: LogicalBlock
|
||||
BinPackArguments: false
|
||||
BinPackParameters: false
|
||||
AllowAllParametersOfDeclarationOnNextLine: true
|
||||
ExperimentalAutoDetectBinPacking: false
|
||||
BreakBeforeBraces: Linux
|
||||
BreakBeforeBinaryOperators: NonAssignment
|
||||
BreakBeforeTernaryOperators: true
|
||||
BreakConstructorInitializers: AfterColon
|
||||
BreakInheritanceList: AfterColon
|
||||
BreakStringLiterals: true
|
||||
ColumnLimit: 80
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||
ConstructorInitializerIndentWidth: 4
|
||||
ContinuationIndentWidth: 4
|
||||
Cpp11BracedListStyle: true
|
||||
QualifierAlignment: Left
|
||||
ReferenceAlignment: Middle
|
||||
DerivePointerAlignment: false
|
||||
SpaceAroundPointerQualifiers: Both
|
||||
FixNamespaceComments: true
|
||||
IncludeBlocks: Preserve
|
||||
IndentCaseLabels: true
|
||||
IndentPPDirectives: None
|
||||
IndentWidth: 2
|
||||
IndentWrappedFunctionNames: false
|
||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||
Language: Cpp
|
||||
MaxEmptyLinesToKeep: 2
|
||||
NamespaceIndentation: All
|
||||
ObjCBlockIndentWidth: 2
|
||||
PointerAlignment: Middle
|
||||
ReflowComments: true
|
||||
SortIncludes: CaseSensitive
|
||||
SortUsingDeclarations: true
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceAfterLogicalNot: false
|
||||
SpaceAfterTemplateKeyword: true
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeCpp11BracedList: true
|
||||
SpaceBeforeCtorInitializerColon: true
|
||||
SpaceBeforeParens: ControlStatementsExceptControlMacros
|
||||
SpaceBeforeRangeBasedForLoopColon: true
|
||||
SpacesBeforeTrailingComments: 2
|
||||
SpaceInEmptyParentheses: false
|
||||
SpacesInAngles: false
|
||||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInContainerLiterals: false
|
||||
SpacesInParentheses: false
|
||||
SpacesInSquareBrackets: false
|
||||
Standard: Latest
|
||||
TabWidth: 2
|
||||
UseTab: Never
|
||||
...
|
||||
287
.clang-tidy
Normal file
@@ -0,0 +1,287 @@
|
||||
# Generated from CLion Inspection settings
|
||||
---
|
||||
HeaderFilterRegex: "*.h"
|
||||
UseColor: true
|
||||
Checks: '-*,
|
||||
bugprone-argument-comment,
|
||||
bugprone-assert-side-effect,
|
||||
bugprone-bad-signal-to-kill-thread,
|
||||
bugprone-branch-clone,
|
||||
bugprone-copy-constructor-init,
|
||||
bugprone-dangling-handle,
|
||||
bugprone-dynamic-static-initializers,
|
||||
bugprone-fold-init-type,
|
||||
bugprone-forward-declaration-namespace,
|
||||
bugprone-forwarding-reference-overload,
|
||||
bugprone-inaccurate-erase,
|
||||
bugprone-incorrect-roundings,
|
||||
bugprone-integer-division,
|
||||
bugprone-lambda-function-name,
|
||||
bugprone-macro-parentheses,
|
||||
bugprone-macro-repeated-side-effects,
|
||||
bugprone-misplaced-operator-in-strlen-in-alloc,
|
||||
bugprone-misplaced-pointer-arithmetic-in-alloc,
|
||||
bugprone-misplaced-widening-cast,
|
||||
bugprone-move-forwarding-reference,
|
||||
bugprone-multiple-statement-macro,
|
||||
bugprone-no-escape,
|
||||
bugprone-not-null-terminated-result,
|
||||
bugprone-parent-virtual-call,
|
||||
bugprone-posix-return,
|
||||
bugprone-reserved-identifier,
|
||||
bugprone-sizeof-container,
|
||||
bugprone-sizeof-expression,
|
||||
bugprone-spuriously-wake-up-functions,
|
||||
bugprone-string-constructor,
|
||||
bugprone-string-integer-assignment,
|
||||
bugprone-string-literal-with-embedded-nul,
|
||||
bugprone-suspicious-enum-usage,
|
||||
bugprone-suspicious-include,
|
||||
bugprone-suspicious-memory-comparison,
|
||||
bugprone-suspicious-memset-usage,
|
||||
bugprone-suspicious-missing-comma,
|
||||
bugprone-suspicious-semicolon,
|
||||
bugprone-suspicious-string-compare,
|
||||
bugprone-swapped-arguments,
|
||||
bugprone-terminating-continue,
|
||||
bugprone-throw-keyword-missing,
|
||||
bugprone-too-small-loop-variable,
|
||||
bugprone-undefined-memory-manipulation,
|
||||
bugprone-undelegated-constructor,
|
||||
bugprone-unhandled-self-assignment,
|
||||
bugprone-unused-raii,
|
||||
bugprone-unused-return-value,
|
||||
bugprone-use-after-move,
|
||||
bugprone-virtual-near-miss,
|
||||
cert-dcl21-cpp,
|
||||
cert-dcl58-cpp,
|
||||
cert-err34-c,
|
||||
cert-err52-cpp,
|
||||
cert-err60-cpp,
|
||||
cert-flp30-c,
|
||||
cert-msc50-cpp,
|
||||
cert-msc51-cpp,
|
||||
cert-str34-c,
|
||||
cppcoreguidelines-interfaces-global-init,
|
||||
cppcoreguidelines-pro-type-member-init,
|
||||
cppcoreguidelines-pro-type-static-cast-downcast,
|
||||
cppcoreguidelines-slicing,
|
||||
google-explicit-constructor,
|
||||
google-runtime-operator,
|
||||
hicpp-exception-baseclass,
|
||||
hicpp-multiway-paths-covered,
|
||||
misc-misplaced-const,
|
||||
misc-new-delete-overloads,
|
||||
misc-non-copyable-objects,
|
||||
misc-throw-by-value-catch-by-reference,
|
||||
misc-unconventional-assign-operator,
|
||||
misc-uniqueptr-reset-release,
|
||||
modernize-avoid-bind,
|
||||
modernize-concat-nested-namespaces,
|
||||
modernize-deprecated-headers,
|
||||
modernize-deprecated-ios-base-aliases,
|
||||
modernize-loop-convert,
|
||||
modernize-make-shared,
|
||||
modernize-make-unique,
|
||||
modernize-pass-by-value,
|
||||
modernize-raw-string-literal,
|
||||
modernize-redundant-void-arg,
|
||||
modernize-replace-auto-ptr,
|
||||
modernize-replace-disallow-copy-and-assign-macro,
|
||||
modernize-replace-random-shuffle,
|
||||
modernize-return-braced-init-list,
|
||||
modernize-shrink-to-fit,
|
||||
modernize-unary-static-assert,
|
||||
modernize-use-auto,
|
||||
modernize-use-bool-literals,
|
||||
modernize-use-emplace,
|
||||
modernize-use-equals-default,
|
||||
modernize-use-equals-delete,
|
||||
modernize-use-nodiscard,
|
||||
modernize-use-noexcept,
|
||||
modernize-use-nullptr,
|
||||
modernize-use-override,
|
||||
modernize-use-transparent-functors,
|
||||
modernize-use-uncaught-exceptions,
|
||||
mpi-buffer-deref,
|
||||
mpi-type-mismatch,
|
||||
openmp-use-default-none,
|
||||
performance-faster-string-find,
|
||||
performance-for-range-copy,
|
||||
performance-implicit-conversion-in-loop,
|
||||
performance-inefficient-algorithm,
|
||||
performance-inefficient-string-concatenation,
|
||||
performance-inefficient-vector-operation,
|
||||
performance-move-const-arg,
|
||||
performance-move-constructor-init,
|
||||
performance-no-automatic-move,
|
||||
performance-noexcept-move-constructor,
|
||||
performance-trivially-destructible,
|
||||
performance-type-promotion-in-math-fn,
|
||||
performance-unnecessary-copy-initialization,
|
||||
performance-unnecessary-value-param,
|
||||
portability-simd-intrinsics,
|
||||
readability-avoid-const-params-in-decls,
|
||||
readability-const-return-type,
|
||||
readability-container-size-empty,
|
||||
readability-delete-null-pointer,
|
||||
readability-deleted-default,
|
||||
readability-inconsistent-declaration-parameter-name,
|
||||
readability-make-member-function-const,
|
||||
readability-misleading-indentation,
|
||||
readability-misplaced-array-index,
|
||||
readability-non-const-parameter,
|
||||
readability-redundant-control-flow,
|
||||
readability-redundant-declaration,
|
||||
readability-redundant-function-ptr-dereference,
|
||||
readability-braces-around-statements,
|
||||
readability-redundant-smartptr-get,
|
||||
readability-redundant-string-cstr,
|
||||
readability-redundant-string-init,
|
||||
readability-simplify-subscript-expr,
|
||||
readability-static-definition-in-anonymous-namespace,
|
||||
readability-string-compare,
|
||||
readability-uniqueptr-delete-release,
|
||||
readability-use-anyofallof'
|
||||
CheckOptions:
|
||||
bugprone-argument-comment.CommentBoolLiterals: '0'
|
||||
bugprone-argument-comment.CommentCharacterLiterals: '0'
|
||||
bugprone-argument-comment.CommentFloatLiterals: '0'
|
||||
bugprone-argument-comment.CommentIntegerLiterals: '0'
|
||||
bugprone-argument-comment.CommentNullPtrs: '0'
|
||||
bugprone-argument-comment.CommentStringLiterals: '0'
|
||||
bugprone-argument-comment.CommentUserDefinedLiterals: '0'
|
||||
bugprone-argument-comment.IgnoreSingleArgument: '0'
|
||||
bugprone-argument-comment.StrictMode: '0'
|
||||
bugprone-assert-side-effect.AssertMacros: assert,NSAssert,NSCAssert
|
||||
bugprone-assert-side-effect.CheckFunctionCalls: 'false'
|
||||
bugprone-assert-side-effect.IgnoredFunctions: __builtin_expect
|
||||
bugprone-dangling-handle.HandleClasses: 'std::basic_string_view;std::experimental::basic_string_view'
|
||||
bugprone-dynamic-static-initializers.HeaderFileExtensions: ';h;hh;hpp;hxx'
|
||||
bugprone-lambda-function-name.IgnoreMacros: 'false'
|
||||
bugprone-misplaced-widening-cast.CheckImplicitCasts: 'false'
|
||||
bugprone-not-null-terminated-result.WantToUseSafeFunctions: 'true'
|
||||
bugprone-reserved-identifier.AggressiveDependentMemberLookup: 'false'
|
||||
bugprone-reserved-identifier.AllowedIdentifiers: ''
|
||||
bugprone-reserved-identifier.Invert: 'false'
|
||||
bugprone-sizeof-expression.WarnOnSizeOfCompareToConstant: 'true'
|
||||
bugprone-sizeof-expression.WarnOnSizeOfConstant: 'true'
|
||||
bugprone-sizeof-expression.WarnOnSizeOfIntegerExpression: 'false'
|
||||
bugprone-sizeof-expression.WarnOnSizeOfPointerToAggregate: 'true'
|
||||
bugprone-sizeof-expression.WarnOnSizeOfThis: 'true'
|
||||
bugprone-string-constructor.LargeLengthThreshold: '8388608'
|
||||
bugprone-string-constructor.StringNames: '::std::basic_string;::std::basic_string_view'
|
||||
bugprone-string-constructor.WarnOnLargeLength: 'true'
|
||||
bugprone-suspicious-enum-usage.StrictMode: 'false'
|
||||
bugprone-suspicious-include.HeaderFileExtensions: ';h;hh;hpp;hxx'
|
||||
bugprone-suspicious-include.ImplementationFileExtensions: 'c;cc;cpp;cxx'
|
||||
bugprone-suspicious-missing-comma.MaxConcatenatedTokens: '5'
|
||||
bugprone-suspicious-missing-comma.RatioThreshold: '0.200000'
|
||||
bugprone-suspicious-missing-comma.SizeThreshold: '5'
|
||||
bugprone-suspicious-string-compare.StringCompareLikeFunctions: ''
|
||||
bugprone-suspicious-string-compare.WarnOnImplicitComparison: 'true'
|
||||
bugprone-suspicious-string-compare.WarnOnLogicalNotComparison: 'false'
|
||||
bugprone-too-small-loop-variable.MagnitudeBitsUpperLimit: '16'
|
||||
bugprone-unhandled-self-assignment.WarnOnlyIfThisHasSuspiciousField: 'true'
|
||||
bugprone-unused-return-value.AllowCastToVoid: 'false'
|
||||
bugprone-unused-return-value.CheckedFunctions: '::std::async;::std::launder;::std::remove;::std::remove_if;::std::unique;::std::unique_ptr::release;::std::basic_string::empty;::std::vector::empty;::std::back_inserter;::std::distance;::std::find;::std::find_if;::std::inserter;::std::lower_bound;::std::make_pair;::std::map::count;::std::map::find;::std::map::lower_bound;::std::multimap::equal_range;::std::multimap::upper_bound;::std::set::count;::std::set::find;::std::setfill;::std::setprecision;::std::setw;::std::upper_bound;::std::vector::at;::bsearch;::ferror;::feof;::isalnum;::isalpha;::isblank;::iscntrl;::isdigit;::isgraph;::islower;::isprint;::ispunct;::isspace;::isupper;::iswalnum;::iswprint;::iswspace;::isxdigit;::memchr;::memcmp;::strcmp;::strcoll;::strncmp;::strpbrk;::strrchr;::strspn;::strstr;::wcscmp;::access;::bind;::connect;::difftime;::dlsym;::fnmatch;::getaddrinfo;::getopt;::htonl;::htons;::iconv_open;::inet_addr;::isascii;::isatty;::mmap;::newlocale;::openat;::pathconf;::pthread_equal;::pthread_getspecific;::pthread_mutex_trylock;::readdir;::readlink;::recvmsg;::regexec;::scandir;::semget;::setjmp;::shm_open;::shmget;::sigismember;::strcasecmp;::strsignal;::ttyname'
|
||||
bugprone-unused-return-value.CheckedReturnTypes: '::std::error_code;::std::error_condition;::std::errc;::std::expected;::boost::system::error_code'
|
||||
cert-dcl16-c.NewSuffixes: 'L;LL;LU;LLU'
|
||||
cert-err33-c.AllowCastToVoid: 'true'
|
||||
cert-err33-c.CheckedFunctions: '::aligned_alloc;::asctime_s;::at_quick_exit;::atexit;::bsearch;::bsearch_s;::btowc;::c16rtomb;::c32rtomb;::calloc;::clock;::cnd_broadcast;::cnd_init;::cnd_signal;::cnd_timedwait;::cnd_wait;::ctime_s;::fclose;::fflush;::fgetc;::fgetpos;::fgets;::fgetwc;::fopen;::fopen_s;::fprintf;::fprintf_s;::fputc;::fputs;::fputwc;::fputws;::fread;::freopen;::freopen_s;::fscanf;::fscanf_s;::fseek;::fsetpos;::ftell;::fwprintf;::fwprintf_s;::fwrite;::fwscanf;::fwscanf_s;::getc;::getchar;::getenv;::getenv_s;::gets_s;::getwc;::getwchar;::gmtime;::gmtime_s;::localtime;::localtime_s;::malloc;::mbrtoc16;::mbrtoc32;::mbsrtowcs;::mbsrtowcs_s;::mbstowcs;::mbstowcs_s;::memchr;::mktime;::mtx_init;::mtx_lock;::mtx_timedlock;::mtx_trylock;::mtx_unlock;::printf_s;::putc;::putwc;::raise;::realloc;::remove;::rename;::scanf;::scanf_s;::setlocale;::setvbuf;::signal;::snprintf;::snprintf_s;::sprintf;::sprintf_s;::sscanf;::sscanf_s;::strchr;::strerror_s;::strftime;::strpbrk;::strrchr;::strstr;::strtod;::strtof;::strtoimax;::strtok;::strtok_s;::strtol;::strtold;::strtoll;::strtoul;::strtoull;::strtoumax;::strxfrm;::swprintf;::swprintf_s;::swscanf;::swscanf_s;::thrd_create;::thrd_detach;::thrd_join;::thrd_sleep;::time;::timespec_get;::tmpfile;::tmpfile_s;::tmpnam;::tmpnam_s;::tss_create;::tss_get;::tss_set;::ungetc;::ungetwc;::vfprintf;::vfprintf_s;::vfscanf;::vfscanf_s;::vfwprintf;::vfwprintf_s;::vfwscanf;::vfwscanf_s;::vprintf_s;::vscanf;::vscanf_s;::vsnprintf;::vsnprintf_s;::vsprintf;::vsprintf_s;::vsscanf;::vsscanf_s;::vswprintf;::vswprintf_s;::vswscanf;::vswscanf_s;::vwprintf_s;::vwscanf;::vwscanf_s;::wcrtomb;::wcschr;::wcsftime;::wcspbrk;::wcsrchr;::wcsrtombs;::wcsrtombs_s;::wcsstr;::wcstod;::wcstof;::wcstoimax;::wcstok;::wcstok_s;::wcstol;::wcstold;::wcstoll;::wcstombs;::wcstombs_s;::wcstoul;::wcstoull;::wcstoumax;::wcsxfrm;::wctob;::wctrans;::wctype;::wmemchr;::wprintf_s;::wscanf;::wscanf_s;'
|
||||
cert-msc51-cpp.DisallowedSeedTypes: 'time_t,std::time_t'
|
||||
cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField: 'false'
|
||||
cert-str34-c.CharTypdefsToIgnore: ''
|
||||
cert-str34-c.DiagnoseSignedUnsignedCharComparisons: 'false'
|
||||
cppcoreguidelines-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic: 'true'
|
||||
cppcoreguidelines-pro-type-member-init.IgnoreArrays: 'false'
|
||||
cppcoreguidelines-pro-type-member-init.UseAssignment: 'false'
|
||||
cppcoreguidelines-pro-type-static-cast-downcast.StrictMode: 'true'
|
||||
google-readability-braces-around-statements.ShortStatementLines: '1'
|
||||
google-readability-function-size.StatementThreshold: '800'
|
||||
google-readability-namespace-comments.ShortNamespaceLines: '10'
|
||||
google-readability-namespace-comments.SpacesBeforeComments: '2'
|
||||
hicpp-multiway-paths-covered.WarnOnMissingElse: 'false'
|
||||
llvm-else-after-return.WarnOnConditionVariables: 'false'
|
||||
llvm-else-after-return.WarnOnUnfixable: 'false'
|
||||
llvm-qualified-auto.AddConstToQualified: 'false'
|
||||
misc-throw-by-value-catch-by-reference.CheckThrowTemporaries: 'true'
|
||||
misc-throw-by-value-catch-by-reference.WarnOnLargeObjects: 'false'
|
||||
misc-uniqueptr-reset-release.IncludeStyle: llvm
|
||||
modernize-avoid-bind.PermissiveParameterList: 'false'
|
||||
modernize-deprecated-headers.CheckHeaderFile: 'false'
|
||||
modernize-loop-convert.IncludeStyle: llvm
|
||||
modernize-loop-convert.MakeReverseRangeFunction: ''
|
||||
modernize-loop-convert.MakeReverseRangeHeader: ''
|
||||
modernize-loop-convert.MaxCopySize: '16'
|
||||
modernize-loop-convert.MinConfidence: reasonable
|
||||
modernize-loop-convert.NamingStyle: CamelCase
|
||||
modernize-loop-convert.UseCxx20ReverseRanges: 'true'
|
||||
modernize-make-shared.IgnoreDefaultInitialization: 'true'
|
||||
modernize-make-shared.IgnoreMacros: 'true'
|
||||
modernize-make-shared.IncludeStyle: llvm
|
||||
modernize-make-shared.MakeSmartPtrFunction: 'std::make_shared'
|
||||
modernize-make-shared.MakeSmartPtrFunctionHeader: '<memory>'
|
||||
modernize-make-unique.IgnoreDefaultInitialization: 'true'
|
||||
modernize-make-unique.IgnoreMacros: 'true'
|
||||
modernize-make-unique.IncludeStyle: llvm
|
||||
modernize-make-unique.MakeSmartPtrFunction: 'std::make_unique'
|
||||
modernize-make-unique.MakeSmartPtrFunctionHeader: '<memory>'
|
||||
modernize-pass-by-value.IncludeStyle: llvm
|
||||
modernize-pass-by-value.ValuesOnly: 'false'
|
||||
modernize-raw-string-literal.DelimiterStem: lit
|
||||
modernize-raw-string-literal.ReplaceShorterLiterals: 'false'
|
||||
modernize-replace-auto-ptr.IncludeStyle: llvm
|
||||
modernize-replace-disallow-copy-and-assign-macro.MacroName: DISALLOW_COPY_AND_ASSIGN
|
||||
modernize-replace-random-shuffle.IncludeStyle: llvm
|
||||
modernize-use-auto.MinTypeNameLength: '5'
|
||||
modernize-use-auto.RemoveStars: 'false'
|
||||
modernize-use-bool-literals.IgnoreMacros: 'true'
|
||||
modernize-use-emplace.ContainersWithPush: '::std::stack;::std::queue;::std::priority_queue'
|
||||
modernize-use-emplace.ContainersWithPushBack: '::std::vector;::std::list;::std::deque'
|
||||
modernize-use-emplace.ContainersWithPushFront: '::std::forward_list;::std::list;::std::deque'
|
||||
modernize-use-emplace.EmplacyFunctions: 'vector::emplace_back;vector::emplace;deque::emplace;deque::emplace_front;deque::emplace_back;forward_list::emplace_after;forward_list::emplace_front;list::emplace;list::emplace_back;list::emplace_front;set::emplace;set::emplace_hint;map::emplace;map::emplace_hint;multiset::emplace;multiset::emplace_hint;multimap::emplace;multimap::emplace_hint;unordered_set::emplace;unordered_set::emplace_hint;unordered_map::emplace;unordered_map::emplace_hint;unordered_multiset::emplace;unordered_multiset::emplace_hint;unordered_multimap::emplace;unordered_multimap::emplace_hint;stack::emplace;queue::emplace;priority_queue::emplace'
|
||||
modernize-use-emplace.IgnoreImplicitConstructors: 'false'
|
||||
modernize-use-emplace.SmartPointers: '::std::shared_ptr;::std::unique_ptr;::std::auto_ptr;::std::weak_ptr'
|
||||
modernize-use-emplace.TupleMakeFunctions: '::std::make_pair;::std::make_tuple'
|
||||
modernize-use-emplace.TupleTypes: '::std::pair;::std::tuple'
|
||||
modernize-use-equals-default.IgnoreMacros: 'true'
|
||||
modernize-use-equals-delete.IgnoreMacros: 'true'
|
||||
modernize-use-nodiscard.ReplacementString: '[[nodiscard]]'
|
||||
modernize-use-noexcept.ReplacementString: ''
|
||||
modernize-use-noexcept.UseNoexceptFalse: 'true'
|
||||
modernize-use-nullptr.IgnoredTypes: 'std::_CmpUnspecifiedParam::;^std::__cmp_cat::__unspec'
|
||||
modernize-use-nullptr.NullMacros: 'NULL'
|
||||
modernize-use-override.AllowOverrideAndFinal: 'false'
|
||||
modernize-use-override.FinalSpelling: final
|
||||
modernize-use-override.IgnoreDestructors: 'true'
|
||||
modernize-use-override.IgnoreTemplateInstantiations: 'false'
|
||||
modernize-use-override.OverrideSpelling: override
|
||||
modernize-use-transparent-functors.SafeMode: 'false'
|
||||
performance-faster-string-find.StringLikeClasses: '::std::basic_string;::std::basic_string_view'
|
||||
performance-for-range-copy.AllowedTypes: ''
|
||||
performance-for-range-copy.WarnOnAllAutoCopies: 'false'
|
||||
performance-inefficient-string-concatenation.StrictMode: 'false'
|
||||
performance-inefficient-vector-operation.EnableProto: 'false'
|
||||
performance-inefficient-vector-operation.VectorLikeClasses: '::std::vector'
|
||||
performance-move-const-arg.CheckMoveToConstRef: 'true'
|
||||
performance-move-const-arg.CheckTriviallyCopyableMove: 'true'
|
||||
performance-no-automatic-move.AllowedTypes: ''
|
||||
performance-type-promotion-in-math-fn.IncludeStyle: llvm
|
||||
performance-unnecessary-copy-initialization.AllowedTypes: ''
|
||||
performance-unnecessary-copy-initialization.ExcludedContainerTypes: ''
|
||||
performance-unnecessary-value-param.AllowedTypes: ''
|
||||
performance-unnecessary-value-param.IncludeStyle: llvm
|
||||
portability-simd-intrinsics.Std: ''
|
||||
portability-simd-intrinsics.Suggest: 'false'
|
||||
readability-avoid-const-params-in-decls.IgnoreMacros: 'true'
|
||||
readability-braces-around-statements.ShortStatementLines: '0'
|
||||
readability-const-return-type.IgnoreMacros: 'true'
|
||||
readability-container-size-empty.ExcludedComparisonTypes: '::std::array'
|
||||
readability-inconsistent-declaration-parameter-name.IgnoreMacros: 'true'
|
||||
readability-inconsistent-declaration-parameter-name.Strict: 'false'
|
||||
readability-redundant-declaration.IgnoreMacros: 'true'
|
||||
readability-redundant-smartptr-get.IgnoreMacros: 'true'
|
||||
readability-redundant-string-init.StringNames: '::std::basic_string_view;::std::basic_string'
|
||||
readability-simplify-subscript-expr.Types: '::std::basic_string;::std::basic_string_view;::std::vector;::std::array;::std::span'
|
||||
readability-uniqueptr-delete-release.PreferResetCall: 'false'
|
||||
79
.github/workflows/build-test.yml
vendored
@@ -1,79 +0,0 @@
|
||||
name: Build Test
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
Build-Qtk:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.3.1/gcc_64/"
|
||||
- os: windows-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH="D:/a/qtk/qtk/Qt/6.3.1/mingw81_64/"
|
||||
- os: macos-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.3.1/gcc_64/"
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v2
|
||||
with:
|
||||
version: '6.3.1'
|
||||
|
||||
- name: Chocolatey Action
|
||||
if: matrix.os == 'windows-latest'
|
||||
uses: crazy-max/ghaction-chocolatey@v2.0.0
|
||||
with:
|
||||
args: install pkgconfiglite
|
||||
|
||||
- name: Build Qtk
|
||||
shell: bash
|
||||
run: |
|
||||
cmake -S . -B build/ ${{ matrix.cmake }} && cmake --build build/ \
|
||||
--target qtk-main
|
||||
|
||||
Build-Qtk-Assimp-Targets:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest]
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.3.1/gcc_64/" -DQTK_UPDATE_SUBMODULES=OFF
|
||||
- os: macos-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH="/home/runner/work/qtk/Qt/6.3.1/gcc_64/" -DASSIMP_NEW_INTERFACE=ON -DQTK_UPDATE_SUBMODULES=OFF
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v2
|
||||
with:
|
||||
version: '6.3.1'
|
||||
|
||||
- name: Install Assimp MacOS
|
||||
if: matrix.os == 'macos-latest'
|
||||
shell: bash
|
||||
run: |
|
||||
brew install assimp
|
||||
|
||||
- name: Install Assimp Ubuntu
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
shell: bash
|
||||
run: |
|
||||
sudo apt install libassimp-dev
|
||||
|
||||
- name: Build Qtk
|
||||
shell: bash
|
||||
run: |
|
||||
cmake -S . -B build/ ${{ matrix.cmake }} && cmake --build build/ \
|
||||
--target qtk-main
|
||||
396
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,396 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
# Runs on tag so the release workflow can use its artifact.
|
||||
tags:
|
||||
- "v*"
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
|
||||
env:
|
||||
QT_VERSION: 6.6.0
|
||||
|
||||
jobs:
|
||||
Qtk:
|
||||
name: Qtk Applications
|
||||
env:
|
||||
CONFIG: -DQTK_SUBMODULES=ON -DQTK_DEBUG=OFF -DQTK_CCACHE=OFF -DQTK_GUI=ON -DQTK_PLUGINS=OFF -DQTK_EXAMPLE=ON
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
|
||||
flags: -j $(nproc)
|
||||
- os: windows-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH=D:/a/qtk/qtk/Qt/$QT_VERSION/mingw81_64/ $CONFIG
|
||||
flags: ''
|
||||
- os: macos-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
|
||||
flags: -j $(nproc)
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
version: ${{ env.QT_VERSION }}
|
||||
|
||||
- name: Install pkgconfiglite
|
||||
if: matrix.os == 'windows-latest'
|
||||
uses: crazy-max/ghaction-chocolatey@v2
|
||||
with:
|
||||
args: install pkgconfiglite --checksum e87b5ea3c9142256af60f2d5b917aa63b571e6a0 --checksum-type sha1
|
||||
- name: Install nsis
|
||||
if: matrix.os == 'windows-latest'
|
||||
uses: crazy-max/ghaction-chocolatey@v2
|
||||
with:
|
||||
args: install nsis
|
||||
|
||||
- name: Install Debian packaging dependencies
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
run: |
|
||||
sudo apt update -y
|
||||
sudo apt install libxcb-cursor0 -y
|
||||
|
||||
- name: Configure Qtk Application
|
||||
shell: bash
|
||||
run: cmake -B build/ ${{ matrix.cmake }}
|
||||
|
||||
- name: Build Qtk Application
|
||||
shell: bash
|
||||
run: cmake --build build/ --config Release --target qtk_gui ${{ matrix.flags }}
|
||||
|
||||
- name: Build Qtk Example
|
||||
if: matrix.os != 'windows-latest'
|
||||
shell: bash
|
||||
run: cmake --build build/ --config Release --target qtk_example ${{ matrix.flags }}
|
||||
|
||||
# Packaging
|
||||
|
||||
- name: Install Qtk Application
|
||||
shell: bash
|
||||
run: cmake --install build/ --config Release --component qtk_gui
|
||||
|
||||
- name: Package Qtk Application
|
||||
shell: bash
|
||||
run: cmake --build build/ --target package --config Release
|
||||
|
||||
- name: Package Qtk (DEB)
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
shell: bash
|
||||
run: |
|
||||
cd build
|
||||
cpack -C Release -G DEB
|
||||
|
||||
- name: Upload package artifacts (DEB)
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: qtk-gui-${{ matrix.os }}
|
||||
path: |
|
||||
build/packages/*.deb
|
||||
|
||||
- name: Package Qtk (WIN)
|
||||
if: matrix.os == 'windows-latest'
|
||||
shell: bash
|
||||
run: |
|
||||
cd build
|
||||
cpack -C Release -G NSIS
|
||||
|
||||
- name: Upload logs on failure (WIN)
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Build-Logs
|
||||
path: |
|
||||
D:\a\qtk\qtk\build\packages\_CPack_Packages\win64\NSIS\NSISOutput.log
|
||||
D:\a\qtk\qtk\build\CMakeFiles\CMakeOutput.log
|
||||
D:\a\qtk\qtk\build\CMakeFiles\CMakeError.log
|
||||
|
||||
- name: Upload package artifacts (WIN)
|
||||
if: matrix.os == 'windows-latest'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: qtk-gui-${{ matrix.os }}
|
||||
path: |
|
||||
build/packages/*.exe
|
||||
|
||||
- name: Package Qtk (OSX)
|
||||
if: matrix.os == 'macos-latest'
|
||||
shell: bash
|
||||
run: |
|
||||
cd build
|
||||
cpack -C Release -G TGZ
|
||||
|
||||
- name: Upload package artifacts (OSX)
|
||||
if: matrix.os == 'macos-latest'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: qtk-gui-${{ matrix.os }}
|
||||
path: |
|
||||
build/packages/*.tar.gz
|
||||
|
||||
- name: Upload Qtk install directory
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: qtk-gui-${{ matrix.os }}-archive
|
||||
path: install/*
|
||||
|
||||
# TODO: Enable after trimming resources.
|
||||
# - name: Package Qtk Application Sources
|
||||
# if: matrix.os != 'macos-latest'
|
||||
# shell: bash
|
||||
# run: |
|
||||
# cmake --build build/ --target package_source
|
||||
#
|
||||
# - name: Upload package artifacts
|
||||
# uses: actions/upload-artifact@v4
|
||||
# with:
|
||||
# name: qtk-${{ matrix.os }}-packages
|
||||
# path: |
|
||||
# build/packages/*
|
||||
# !build/packages/_CPack_Packages/*
|
||||
|
||||
Qtk-Library:
|
||||
name: Qtk library
|
||||
env:
|
||||
CONFIG: -DQTK_SUBMODULES=ON -DQTK_DEBUG=OFF -DQTK_CCACHE=OFF -DQTK_GUI=OFF -DQTK_PLUGINS=OFF -DQTK_EXAMPLE=OFF
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
|
||||
flags: -j $(nproc)
|
||||
- os: windows-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH=D:/a/qtk/qtk/Qt/$QT_VERSION/mingw81_64/ $CONFIG
|
||||
flags: ''
|
||||
- os: macos-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
|
||||
flags: -j $(nproc)
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
version: ${{ env.QT_VERSION }}
|
||||
|
||||
# Windows
|
||||
|
||||
- name: Chocolatey Action
|
||||
if: matrix.os == 'windows-latest'
|
||||
uses: crazy-max/ghaction-chocolatey@v2
|
||||
with:
|
||||
args: install pkgconfiglite --checksum e87b5ea3c9142256af60f2d5b917aa63b571e6a0 --checksum-type sha1
|
||||
- name: Install nsis
|
||||
if: matrix.os == 'windows-latest'
|
||||
uses: crazy-max/ghaction-chocolatey@v2
|
||||
with:
|
||||
args: install nsis
|
||||
|
||||
- name: Configure Qtk Library
|
||||
shell: bash
|
||||
run: cmake -B build/ ${{ matrix.cmake }}
|
||||
|
||||
- name: Build Qtk Library
|
||||
shell: bash
|
||||
run: cmake --build build/ --config Release --target qtk -- ${{ matrix.flags }}
|
||||
|
||||
# Packaging
|
||||
|
||||
- name: Install Qtk Library
|
||||
shell: bash
|
||||
run: cmake --install build/ --config Release --prefix=$(pwd)/install --component qtk
|
||||
|
||||
- name: Package Qtk Library
|
||||
shell: bash
|
||||
run: cmake --build build/ --target package --config Release
|
||||
|
||||
- name: Package Qtk Library (DEB)
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
shell: bash
|
||||
run: |
|
||||
cd build
|
||||
cpack -C Release -G DEB
|
||||
|
||||
- name: Upload package artifacts (DEB)
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: libqtk-${{ matrix.os }}
|
||||
path: |
|
||||
build/packages/*.deb
|
||||
|
||||
- name: Package Qtk Library (WIN)
|
||||
if: matrix.os == 'windows-latest'
|
||||
shell: bash
|
||||
run: |
|
||||
cd build
|
||||
cpack -C Release -G NSIS
|
||||
|
||||
- name: Upload logs on failure (WIN)
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Build-Logs
|
||||
path: |
|
||||
D:\a\qtk\qtk\build\packages\_CPack_Packages\win64\NSIS\NSISOutput.log
|
||||
D:\a\qtk\qtk\build\CMakeFiles\CMakeOutput.log
|
||||
D:\a\qtk\qtk\build\CMakeFiles\CMakeError.log
|
||||
|
||||
- name: Upload package artifacts (WIN)
|
||||
if: matrix.os == 'windows-latest'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: libqtk-${{ matrix.os }}
|
||||
path: |
|
||||
build/packages/*.exe
|
||||
|
||||
- name: Package Qtk Library (OSX)
|
||||
if: matrix.os == 'macos-latest'
|
||||
shell: bash
|
||||
run: |
|
||||
cd build
|
||||
cpack -C Release -G TGZ
|
||||
|
||||
- name: Upload package artifacts (OSX)
|
||||
if: matrix.os == 'macos-latest'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: libqtk-${{ matrix.os }}
|
||||
path: |
|
||||
build/packages/*.tar.gz
|
||||
|
||||
- name: Upload libqtk install
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: libqtk-${{ matrix.os }}-archive
|
||||
path: install/*
|
||||
|
||||
Qtk-Plugins:
|
||||
name: Qtk Qt Designer Plugins
|
||||
env:
|
||||
CONFIG: -DQTK_SUBMODULES=ON -DQTK_DEBUG=OFF -DQTK_CCACHE=OFF -DQTK_GUI=OFF -DQTK_PLUGINS=ON -DQTK_EXAMPLE=OFF
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
|
||||
flags: -j $(nproc)
|
||||
- os: windows-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH=D:/a/qtk/qtk/Qt/$QT_VERSION/mingw81_64/ $CONFIG
|
||||
flags: ''
|
||||
- os: macos-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
|
||||
flags: -j $(nproc)
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
version: ${{ env.QT_VERSION }}
|
||||
|
||||
- name: Chocolatey Action
|
||||
if: matrix.os == 'windows-latest'
|
||||
uses: crazy-max/ghaction-chocolatey@v2
|
||||
with:
|
||||
args: install pkgconfiglite --checksum e87b5ea3c9142256af60f2d5b917aa63b571e6a0 --checksum-type sha1
|
||||
|
||||
- name: Configure Qtk Plugins
|
||||
shell: bash
|
||||
run: cmake -B build/ ${{ matrix.cmake }}
|
||||
|
||||
- name: Build Qtk Plugins
|
||||
shell: bash
|
||||
run: cmake --build build/ --config Release --target qtk_plugins -- ${{ matrix.flags }}
|
||||
|
||||
# Packaging
|
||||
|
||||
- name: Install Qtk Plugins
|
||||
shell: bash
|
||||
run: cmake --install build/ --config Release --component qtk_plugins
|
||||
|
||||
Qtk-Assimp-Targets:
|
||||
name: Qtk Assimp Platform Targets
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest]
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/
|
||||
- os: macos-latest
|
||||
cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
version: ${{ env.QT_VERSION }}
|
||||
|
||||
- name: Install Assimp MacOS
|
||||
if: matrix.os == 'macos-latest'
|
||||
shell: bash
|
||||
run: |
|
||||
brew install assimp
|
||||
|
||||
- name: Install Assimp Ubuntu
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
shell: bash
|
||||
run: |
|
||||
sudo apt install libassimp-dev
|
||||
|
||||
- name: Configure Qtk
|
||||
shell: bash
|
||||
run: cmake -B build/ ${{ matrix.cmake }} -DQTK_CCACHE=OFF -DQTK_ASSIMP_NEW_INTERFACE=ON
|
||||
|
||||
- name: Build Qtk
|
||||
shell: bash
|
||||
run: cmake --build build/ --config Release
|
||||
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
needs: [Qtk, Qtk-Library, Qtk-Plugins]
|
||||
steps:
|
||||
- name: Download Installer Artifact
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: |
|
||||
build/packages/*
|
||||
install/*
|
||||
|
||||
- name: Create GitHub Release
|
||||
id: create_release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
name: Qtk ${{ github.ref_name }}
|
||||
draft: true
|
||||
prerelease: false
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
build/packages/*
|
||||
install/*
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
72
.github/workflows/linting.yml
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
name: Linting
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
Tidy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
version: '6.5.0'
|
||||
|
||||
- name: Install Assimp Ubuntu
|
||||
run: sudo apt install libassimp-dev
|
||||
|
||||
- name: Build Qtk
|
||||
run: |
|
||||
cmake -B build -DQTK_SUBMODULES=OFF -DQTK_CCACHE=OFF -DQTK_PLUGINS=OFF -DQTK_GUI=ON
|
||||
cmake --build build --target qtk_gui qtk_example -- -j $(nproc)
|
||||
|
||||
- uses: cpp-linter/cpp-linter-action@v2
|
||||
id: linter
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
# Use clang-tools 14
|
||||
version: '18'
|
||||
# Don't use clang-format with this action
|
||||
# + Set to `file` to use .clang-format (Qtk formats with clang 15)
|
||||
style: ''
|
||||
# Use .clang-tidy file
|
||||
tidy-checks: ''
|
||||
# Check the entire repo for source files to tidy
|
||||
files-changed-only: false
|
||||
# Ignore qtk build and external assimp directories
|
||||
ignore: '.github|build|extern'
|
||||
# Point to compile_commands.json produced by build
|
||||
database: 'build'
|
||||
# Use thread comments as feedback
|
||||
thread-comments: true
|
||||
# Show file annotations on GH
|
||||
file-annotations: true
|
||||
|
||||
- name: Fail CI if checks don't pass
|
||||
if: steps.linter.outputs.checks-failed != 0
|
||||
run: exit 1
|
||||
|
||||
Format:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
path:
|
||||
- 'src'
|
||||
- 'example-app'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: cpp-linter/cpp-linter-action@v2
|
||||
with:
|
||||
version: '18'
|
||||
style: 'file'
|
||||
tidy-checks: ''
|
||||
files-changed-only: false
|
||||
ignore: '.github|build|extern'
|
||||
extensions: 'cpp,h'
|
||||
files: ${{ matrix.path }}
|
||||
6
.gitignore
vendored
@@ -1,9 +1,13 @@
|
||||
# CLion
|
||||
**/.idea/**
|
||||
|
||||
# VS Code
|
||||
**/.vscode/**
|
||||
|
||||
# CMake build files
|
||||
**/cmake-build-debug/**
|
||||
**/cmake-build-*/**
|
||||
**/build/**
|
||||
install
|
||||
|
||||
# C++ objects and libs
|
||||
*.slo
|
||||
|
||||
377
CMakeLists.txt
@@ -1,227 +1,244 @@
|
||||
################################################################################
|
||||
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||||
## ##
|
||||
## Project for working with OpenGL and Qt6 widgets ##
|
||||
## ##
|
||||
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||||
## All Content (c) 2025 Shaun Reed, all rights reserved ##
|
||||
################################################################################
|
||||
cmake_minimum_required(VERSION 3.2)
|
||||
|
||||
project(
|
||||
#[[NAME]] Qtk
|
||||
VERSION 1.0
|
||||
DESCRIPTION "An example project using QT and OpenGL"
|
||||
LANGUAGES CXX C
|
||||
)
|
||||
cmake_minimum_required(VERSION 3.28)
|
||||
|
||||
################################################################################
|
||||
# Constants
|
||||
################################################################################
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
set(CMAKE_MACOSX_BUNDLE ON)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||
set(CMAKE_AUTORCC_OPTIONS --binary)
|
||||
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||
if(WIN32)
|
||||
set(CMAKE_COMPILE_WARNING_AS_ERROR OFF)
|
||||
add_compile_options(/wd4131 /wd4127)
|
||||
endif()
|
||||
message(STATUS "[Qtk] Compiling with ${CMAKE_CXX_COMPILER_ID}")
|
||||
add_compile_options(-fPIC)
|
||||
|
||||
# Qtk build options
|
||||
option(QTK_DEBUG "Enable debugger" ON)
|
||||
message(STATUS "[Qtk] Compiling with QTK_DEBUG=${QTK_DEBUG}")
|
||||
option(QTK_UPDATE_SUBMODULES "Update external project (assimp) submodule" ON)
|
||||
message(
|
||||
STATUS
|
||||
"[Qtk] Compiling with QTK_UPDATE_SUBMODULES=${QTK_UPDATE_SUBMODULES}"
|
||||
)
|
||||
|
||||
# Qt options
|
||||
set(QT_DIR "$ENV{HOME}/Code/Clones/Qt/6.3.1/gcc_64/" CACHE PATH "Path to Qt6")
|
||||
|
||||
# Options for bringing your own assimp installation; Otherwise not needed
|
||||
# + If assimp is available system-wide we can just set QTK_UPDATE_SUBMODULES OFF
|
||||
option(ASSIMP_NEW_INTERFACE "Use the assimp::assimp interface (WIN / OSX)" OFF)
|
||||
message(
|
||||
STATUS
|
||||
"[Qtk] Compiling with ASSIMP_NEW_INTERFACE=${ASSIMP_NEW_INTERFACE}"
|
||||
################################################################################
|
||||
# Project
|
||||
################################################################################
|
||||
project(
|
||||
#[[NAME]] Qtk
|
||||
VERSION 0.3
|
||||
DESCRIPTION "Qt OpenGL library and desktop application."
|
||||
LANGUAGES CXX C
|
||||
)
|
||||
|
||||
################################################################################
|
||||
# External Libraries
|
||||
# Includes
|
||||
################################################################################
|
||||
include("${CMAKE_SOURCE_DIR}/cmake/include/git_submodule.cmake")
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
# For CLion builds, point CMAKE_PREFIX_PATH to Qt6 install directory
|
||||
# + QtCreator will handle this for you if that is used instead
|
||||
list(APPEND CMAKE_PREFIX_PATH "${QT_DIR}")
|
||||
################################################################################
|
||||
# Options
|
||||
################################################################################
|
||||
option(QTK_DEBUG "Enable debugger" OFF)
|
||||
option(QTK_SUBMODULES "Update external project (assimp) submodule" OFF)
|
||||
option(QTK_EXAMPLE "Build the Qtk example desktop application" ON)
|
||||
option(QTK_CCACHE "Enable ccache" ON)
|
||||
# Install Qtk for use within Qt Creator projects only, instead of system-wide.
|
||||
option(QTK_PREFIX_QTCREATOR "Install Qtk to Qt Creator. Untested." OFF)
|
||||
# Option for bringing your own assimp installation; Otherwise not needed
|
||||
# + If assimp is available system-wide we can just set QTK_SUBMODULES OFF
|
||||
option(
|
||||
QTK_ASSIMP_NEW_INTERFACE
|
||||
"Use the assimp::assimp interface (WIN / OSX)"
|
||||
OFF
|
||||
)
|
||||
|
||||
# Qtk Component Options
|
||||
option(QTK_PLUGINS "Install Qtk plugins to Qt Designer path." OFF)
|
||||
# Options for qtk_gui
|
||||
option(QTK_GUI "Build the Qtk desktop application" ON)
|
||||
option(QTK_GUI_SCENE
|
||||
"Fetch model resources and build the GUI with an example scene." OFF
|
||||
)
|
||||
|
||||
if (QTK_CCACHE)
|
||||
set(CMAKE_CXX_COMPILER_LAUNCHER ccache)
|
||||
endif()
|
||||
|
||||
if(QTK_DEBUG OR CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$")
|
||||
set(QTK_DEBUG ON)
|
||||
set(CMAKE_BUILD_TYPE Debug)
|
||||
else()
|
||||
set(QTK_DEBUG OFF)
|
||||
set(CMAKE_BUILD_TYPE Release)
|
||||
endif()
|
||||
|
||||
# This should be set to your Qt6 installation directory.
|
||||
set(QT_INSTALL_DIR "$ENV{HOME}/Qt/6.5.0/gcc_64/lib/cmake" CACHE PATH "Path to Qt6 install.")
|
||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
||||
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install")
|
||||
endif()
|
||||
|
||||
set(QTK_RESOURCES "${CMAKE_SOURCE_DIR}/resources")
|
||||
set(QTK_OSX_ICONS ${CMAKE_SOURCE_DIR}/resources/icons/osx/kilroy.icns)
|
||||
string(TIMESTAMP YEAR "%Y")
|
||||
set(QTK_COPYRIGHT "All Content © 2021-${YEAR} Shaun Reed, all rights reserved.")
|
||||
|
||||
# Point CMAKE_PREFIX_PATH to Qt6 install directory
|
||||
# If Qtk is built within Qt Creator this is not required.
|
||||
list(APPEND CMAKE_PREFIX_PATH "${QT_INSTALL_DIR}")
|
||||
if (QTK_PREFIX_QTCREATOR)
|
||||
# TODO: This might be a bit strange and needs more testing.
|
||||
set(CMAKE_INSTALL_PREFIX "${QT_INSTALL_DIR}")
|
||||
endif()
|
||||
|
||||
set(
|
||||
QT_CREATOR_DIR
|
||||
"${QT_INSTALL_DIR}/../../Tools/QtCreator"
|
||||
CACHE PATH "Qt Creator path used to install Qtk plugins for Qt Designer."
|
||||
)
|
||||
|
||||
# Print all QTK options and their values at the end of configuration.
|
||||
# We initialize this list here so that we can append to it as needed.
|
||||
# All variables in this list will be printed at the end of configuration.
|
||||
get_cmake_property(VAR_NAMES VARIABLES)
|
||||
list(FILTER VAR_NAMES INCLUDE REGEX "^[qQ][tT][kK]_.*$")
|
||||
list(SORT VAR_NAMES)
|
||||
|
||||
################################################################################
|
||||
# External Dependencies
|
||||
################################################################################
|
||||
# Find Qt
|
||||
find_package(Qt6 COMPONENTS OpenGLWidgets)
|
||||
if (NOT Qt6_FOUND)
|
||||
find_package(Qt6 COMPONENTS Core UiPlugin OpenGLWidgets)
|
||||
qt_standard_project_setup()
|
||||
if(NOT Qt6_FOUND)
|
||||
message(
|
||||
SEND_ERROR "[Qtk] Error: Unable to find Qt6 at CMAKE_PREFIX_PATH: "
|
||||
"${CMAKE_PREFIX_PATH}"
|
||||
)
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"[Qtk] Error: Specify path to Qt6 with `cmake "
|
||||
FATAL_ERROR "[Qtk] 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()
|
||||
|
||||
if (QTK_UPDATE_SUBMODULES)
|
||||
#
|
||||
# To use custom plugins, set QT_PLUGIN_PATH environment variable before running designer
|
||||
# Or, we can install plugins to the designer for use across all projects.
|
||||
# Qt Creator on linux will look here for widget plugins in the integrated designer
|
||||
# /home/shaun/Qt/Tools/QtCreator/lib/Qt/lib
|
||||
# Qt Designer will use the following path on linux
|
||||
# /home/shaun/Qt/6.5.0/gcc_64/plugins/designer/
|
||||
# We can use this path after find_package(Qt6) to install our plugins on all systems
|
||||
# ${QT6_INSTALL_PREFIX}/${QT6_INSTALL_PLUGINS}/designer
|
||||
# And run designer at ${QT6_INSTALL_PREFIX}/bin/designer
|
||||
# Use cmake -DQTK_PLUGIN_INSTALL_DIR=/some/path to override this install path
|
||||
set(
|
||||
QTK_PLUGIN_INSTALL_DIR
|
||||
"${QT6_INSTALL_PREFIX}/${QT6_INSTALL_PLUGINS}/designer" CACHE PATH
|
||||
"Path to install Qtk plugin collection."
|
||||
)
|
||||
# See cmake configure output for values of these variables on your system
|
||||
set(
|
||||
VAR_PATHS
|
||||
CMAKE_PREFIX_PATH CMAKE_INSTALL_PREFIX QTK_PLUGIN_INSTALL_DIR QT6_INSTALL_PREFIX
|
||||
QT_INSTALL_DIR
|
||||
)
|
||||
# Add QT6_INSTALL_PLUGINS to VAR_NAMES so it is printed at end of configuration.
|
||||
list(APPEND VAR_NAMES QT6_INSTALL_PLUGINS)
|
||||
|
||||
# Find Assimp.
|
||||
if(QTK_SUBMODULES)
|
||||
if(APPLE)
|
||||
# Avoid zlib redefining fdopen, causing build failures in apple clang.
|
||||
# https://github.com/assimp/assimp/issues/6118
|
||||
add_compile_definitions(-Dfdopen=fdopen)
|
||||
endif()
|
||||
if(NOT WIN32)
|
||||
# Required to statically link.
|
||||
add_compile_options(-fPIC)
|
||||
endif()
|
||||
set(BUILD_SHARED_LIBS OFF CACHE STRING "Build static assimp libs" FORCE)
|
||||
set(ASSIMP_BUILD_ZLIB ON CACHE STRING "Build Zlib with assimp." FORCE)
|
||||
set(
|
||||
ASSIMP_INSTALL
|
||||
OFF CACHE STRING "Disable to use assimp as a submodule."
|
||||
FORCE
|
||||
)
|
||||
set(ASSIMP_NO_EXPORT ON CACHE STRING "Disable to export assimp." FORCE)
|
||||
set(ASSIMP_WARNINGS_AS_ERRORS OFF CACHE STRING "No warnings as errors." FORCE)
|
||||
set(ASSIMP_BUILD_TESTS OFF CACHE STRING "Do not build assimp tests." FORCE)
|
||||
message(STATUS "[Qtk] Updating submodules...")
|
||||
include("${CMAKE_SOURCE_DIR}/cmake/include/git_submodule.cmake")
|
||||
submodule_update("${CMAKE_CURRENT_SOURCE_DIR}/extern/assimp/assimp/")
|
||||
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/extern/assimp/assimp/")
|
||||
add_subdirectory(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/extern/assimp/assimp/"
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
install(
|
||||
TARGETS assimp zlibstatic
|
||||
EXPORT qtk_export
|
||||
COMPONENT qtk
|
||||
ARCHIVE DESTINATION lib
|
||||
LIBRARY DESTINATION lib
|
||||
RUNTIME DESTINATION bin
|
||||
)
|
||||
else()
|
||||
find_package(assimp REQUIRED)
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
find_package(OpenGL REQUIRED)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
# Qtk
|
||||
################################################################################
|
||||
add_subdirectory(src)
|
||||
|
||||
set(
|
||||
PUBLIC_HEADERS
|
||||
src/qtkwidget.h
|
||||
src/abstractscene.h
|
||||
src/camera3d.h
|
||||
src/mesh.h
|
||||
src/meshrenderer.h
|
||||
src/model.h
|
||||
src/object.h
|
||||
src/skybox.h
|
||||
src/texture.h
|
||||
src/transform3D.h
|
||||
)
|
||||
|
||||
set(
|
||||
SOURCE_FILES
|
||||
src/qtkwidget.cpp
|
||||
src/abstractscene.cpp
|
||||
src/camera3d.cpp
|
||||
src/input.cpp
|
||||
src/input.h
|
||||
src/mesh.cpp
|
||||
src/meshrenderer.cpp
|
||||
src/model.cpp
|
||||
src/object.cpp
|
||||
src/qtkapi.h
|
||||
src/skybox.cpp
|
||||
src/texture.cpp
|
||||
src/transform3D.cpp
|
||||
)
|
||||
|
||||
include(GenerateExportHeader)
|
||||
|
||||
add_library(qtk-widget STATIC ${PUBLIC_HEADERS} ${SOURCE_FILES})
|
||||
target_include_directories(qtk-widget PRIVATE src/ app/)
|
||||
|
||||
set_target_properties(qtk-widget PROPERTIES
|
||||
PUBLIC_HEADER "${PUBLIC_HEADERS}"
|
||||
VERSION ${PROJECT_VERSION}
|
||||
)
|
||||
|
||||
target_link_libraries(qtk-widget PUBLIC Qt6::OpenGLWidgets)
|
||||
target_link_libraries(qtk-widget PUBLIC Qt6::Widgets)
|
||||
|
||||
if (QTK_UPDATE_SUBMODULES OR NOT ASSIMP_NEW_INTERFACE)
|
||||
target_link_libraries(qtk-widget PUBLIC assimp)
|
||||
elseif(ASSIMP_NEW_INTERFACE)
|
||||
target_link_libraries(qtk-widget PUBLIC assimp::assimp)
|
||||
if(QTK_EXAMPLE)
|
||||
# Create a namespaced alias for linking with libqtk in the example.
|
||||
add_library(${PROJECT_NAME}::qtk ALIAS qtk)
|
||||
add_subdirectory(example-app EXCLUDE_FROM_ALL)
|
||||
endif()
|
||||
|
||||
if(QTK_DEBUG)
|
||||
message(STATUS "[Qtk] Building with QTK_DEBUG=${QTK_DEBUG}")
|
||||
target_compile_definitions(qtk-widget PUBLIC QTK_DEBUG)
|
||||
endif()
|
||||
|
||||
|
||||
if(WIN32)
|
||||
find_package(OpenGL REQUIRED)
|
||||
target_link_libraries(qtk-widget PUBLIC OpenGL::GL)
|
||||
endif()
|
||||
|
||||
# Install files
|
||||
install(TARGETS qtk-widget
|
||||
# Associate qtk-widget target with qtk-export
|
||||
EXPORT qtk-export
|
||||
# <prefix>/bin on DLL systems and <prefix>/lib on non-dll systems
|
||||
LIBRARY DESTINATION lib
|
||||
ARCHIVE DESTINATION lib/static
|
||||
RUNTIME DESTINATION bin
|
||||
PUBLIC_HEADER DESTINATION include
|
||||
)
|
||||
|
||||
# Install export
|
||||
# qtkTargets.cmake will only be installed when one of the CONFIGURATIONS is installed
|
||||
# + The generated import will only reference that qtk configuration
|
||||
install(EXPORT qtk-export
|
||||
FILE qtkTargets.cmake
|
||||
CONFIGURATIONS Debug|Release
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/cmake
|
||||
)
|
||||
|
||||
################################################################################
|
||||
# Final Application
|
||||
################################################################################
|
||||
|
||||
set(QTK_RESOURCES "${CMAKE_SOURCE_DIR}/resources")
|
||||
configure_file(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/qtkresources.h.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/src/qtkresources.h"
|
||||
@ONLY
|
||||
)
|
||||
|
||||
# Add our Qt resources.qrc file to our application
|
||||
set(QTK_APP_SOURCES app/main.cpp
|
||||
app/examplescene.cpp app/examplescene.h
|
||||
app/mainwindow.cpp app/mainwindow.h app/mainwindow.ui
|
||||
app/resourcemanager.h
|
||||
src/qtkresources.h.in
|
||||
)
|
||||
qt6_add_big_resources(QTK_APP_SOURCES resources.qrc)
|
||||
|
||||
qt_add_executable(qtk-main ${QTK_APP_SOURCES})
|
||||
target_include_directories(qtk-main PRIVATE src/ app/)
|
||||
|
||||
# Link qtk-main executable to main qtk-widget library
|
||||
target_link_libraries(qtk-main PUBLIC qtk-widget)
|
||||
|
||||
set_target_properties(qtk-main PROPERTIES
|
||||
WIN32_EXECUTABLE TRUE
|
||||
MACOSX_BUNDLE TRUE
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
)
|
||||
install(TARGETS qtk-main
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
)
|
||||
|
||||
generate_export_header(qtk-widget)
|
||||
if(WIN32)
|
||||
get_target_property(_qt6_qmake_location Qt6::qmake IMPORTED_LOCATION)
|
||||
execute_process(COMMAND "${_qt6_qmake_location}" -query QT_INSTALL_PREFIX RESULT_VARIABLE return_code OUTPUT_VARIABLE qt6_install_prefix OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
file(TO_NATIVE_PATH "${qt6_install_prefix}/bin" qt6_install_prefix)
|
||||
if(TARGET Qt6::windeployqt)
|
||||
add_custom_command(TARGET qtk-main
|
||||
POST_BUILD
|
||||
COMMAND set PATH=%PATH%$<SEMICOLON>${qt6_install_prefix}
|
||||
COMMAND Qt6::windeployqt --dir "${CMAKE_BINARY_DIR}/windeployqt" "$<TARGET_FILE_DIR:qtk-main>/$<TARGET_FILE_NAME:qtk-main>"
|
||||
)
|
||||
install(DIRECTORY "${CMAKE_BINARY_DIR}/windeployqt/" DESTINATION bin)
|
||||
# Print all QTK options and their values at the end of configuration. This also
|
||||
# prints any additional variables that we have added to VAR_NAMES and VAR_PATHS.
|
||||
foreach(VAR_NAME IN LISTS VAR_NAMES VAR_PATHS)
|
||||
if(VAR_NAME IN_LIST VAR_PATHS)
|
||||
# Print absolute if variable is path
|
||||
get_filename_component(VAR_REALPATH "${${VAR_NAME}}" REALPATH)
|
||||
message(STATUS "[Qtk] ${VAR_NAME}=${VAR_REALPATH}")
|
||||
else()
|
||||
message(STATUS "[Qtk] ${VAR_NAME}=${${VAR_NAME}}")
|
||||
endif()
|
||||
if(MSVC AND TARGET Qt6::qmake)
|
||||
set(VSUSER_FILE ${CMAKE_CURRENT_BINARY_DIR}/qtk-main.vcxproj.user)
|
||||
file(TO_NATIVE_PATH "${CMAKE_BINARY_DIR}/extern/assimp/assimp/bin" assimp_bin)
|
||||
file(WRITE ${VSUSER_FILE} "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
|
||||
file(APPEND ${VSUSER_FILE} "<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n")
|
||||
file(APPEND ${VSUSER_FILE} " <PropertyGroup>\n")
|
||||
file(APPEND ${VSUSER_FILE} " <LocalDebuggerEnvironment>Path=$(SolutionDir)\\lib\\$(Configuration);${qt6_install_prefix};${assimp_bin};$(Path)\n")
|
||||
file(APPEND ${VSUSER_FILE} "$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>\n")
|
||||
file(APPEND ${VSUSER_FILE} " <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>\n")
|
||||
file(APPEND ${VSUSER_FILE} " </PropertyGroup>\n")
|
||||
file(APPEND ${VSUSER_FILE} "</Project>\n")
|
||||
endforeach()
|
||||
message(STATUS "[Qtk] Installation prefix: ${CMAKE_INSTALL_PREFIX}")
|
||||
message(STATUS "[Qtk] Found Qt6: ${Qt6Core_VERSION}")
|
||||
|
||||
# qt_generate_deploy_app_script is supported on Linux in QtCore >= 6.5.0.
|
||||
# qt_generate_deploy_app_script supports Windows and OSX in QtCore >= 6.3.
|
||||
# https://doc.qt.io/qt-6.5/qt-generate-deploy-app-script.html
|
||||
# https://doc.qt.io/archives/qt-6.4/qt-generate-deploy-app-script.html
|
||||
# The application can still build and run, we just can't install.
|
||||
if(QTK_GUI OR QTK_EXAMPLE)
|
||||
if(UNIX AND NOT APPLE)
|
||||
# Ubuntu 24.04 provides QtCore 6.4.2 in qt-base-dev.
|
||||
# This version of qt_generate_deploy_app_script does not support Linux.
|
||||
if (Qt6_VERSION VERSION_LESS "6.5.0")
|
||||
message(WARNING "[Qtk] Installation is only supported on Qt >=6.5.\n")
|
||||
endif()
|
||||
elseif(APPLE OR WIN32)
|
||||
# Predates qt_generate_deploy_app_script.
|
||||
if (Qt6_VERSION VERSION_LESS "6.3.0")
|
||||
message(WARNING "[Qtk] Installation is only supported on Qt >=6.5.\n")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
434
README.md
@@ -1,105 +1,413 @@
|
||||
# Qtk
|
||||
|
||||
Practice project for learning about using OpenGL in Qt widget applications.
|
||||
Model loader using [Assimp](https://assimp.org/) within a Qt widget application.
|
||||
[](https://github.com/shaunrd0/qtk/actions/workflows/build.yml)
|
||||
[](https://github.com/shaunrd0/qtk/actions/workflows/linting.yml)
|
||||
|
||||
You can import your own models within `app/examplescene.cpp`, inside the
|
||||
`ExampleScene::init()` function. Rotations and translations
|
||||
happen in `ExampleScene::update()`.
|
||||
The Qtk desktop application provides a model loader using [Assimp](https://assimp.org/) within a Qt widget application.
|
||||
You can fly around the scene using WASD while holding down the left or right mouse button.
|
||||
[QtkWidget](./src/designer-plugins/qtkwidget.h) is the primary QOpenGLWidget used to render the scene and handle input.
|
||||
|
||||
To get textures loading on models look into [material files](http://www.paulbourke.net/dataformats/mtl/)
|
||||
and see some examples in the `resources/models/` directory.
|
||||
The underlying shared library [libqtk](./src/qtk) wraps QOpenGL objects in convenience classes that leverage
|
||||
lower-level OpenGL APIs to handle the rendering process manually. Many of these classes offer
|
||||
ways to expand the low-level OpenGL logic within a Qt application without having to set up much scaffolding.
|
||||
|
||||
The Qtk GUI is built using custom [Qt Designer plugins](https://doc.qt.io/qt-6/designer-creating-custom-widgets.html). These can be installed to Qt Designer for
|
||||
use in other Qt applications, or built exclusively for Qtk. See [Build Options](#build-options) for more details.
|
||||
|
||||
Object names can be double-clicked in the tree view panel for quick camera navigation.
|
||||
Properties of the object, like shader code and translation / scale, can be viewed and modified in the side panel.
|
||||
|
||||

|
||||
|
||||
All side panels and toolbars are dockable widgets that can be popped out
|
||||
and reorganized as needed. Panels can also be stacked to create a docked widget with
|
||||
tabs. The central widget that provides the camera view into the scene cannot be
|
||||
detached from the main window in this way.
|
||||
|
||||

|
||||
|
||||
The small triangles floating near 3D models represent the light source being used for the shader.
|
||||
These appear on models using phong, specular, and diffuse lighting techniques.
|
||||
|
||||
The example scene contains basic examples like texture mapping to make a crate from simple cube geometry.
|
||||
This scene is used in the following screenshots, and can be built locally by enabling
|
||||
the `QTK_GUI_SCENE` [Build Option](#build-options) described below. Because this scene
|
||||
uses large 3D model resources, this option is disabled by default.
|
||||
|
||||
The default scene with this option disabled is empty, but comes with a default skybox.
|
||||
Models can be added to the scene by clicking and dragging an `.obj` into the scene view.
|
||||
|
||||

|
||||
|
||||
Examples of Ambient, Diffuse, and Specular GLSL shaders.
|
||||
|
||||
| Ambient | Diffuse | Specular |
|
||||
|-------------------------------------------------------|-------------------------------------------------------|--------------------------------------------------------|
|
||||
| <img src="resources/screenshots/screen-ambient.png"/> | <img src="resources/screenshots/screen-diffuse.png"/> | <img src="resources/screenshots/screen-specular.png"/> |
|
||||
|
||||
And more advanced techniques like Phong lighting (ambient + diffuse + specular) and normal mapping.
|
||||
|
||||

|
||||
|
||||
| Normal Mapping Disabled | Normal Mapping Enabled |
|
||||
|------------------------------------------------------|--------------------------------------------------------|
|
||||
| <img src="resources/screenshots/spartan-phong.png"/> | <img src="resources/screenshots/spartan-normals.png"/> |
|
||||
|
||||
See the `View` toolbar menu to enable debug console widgets for open scenes or reopen previously closed panels.
|
||||
|
||||
Key features that are planned:
|
||||
|
||||
- [x] Runtime loading of `.obj` or similar 3D models.
|
||||
- [x] Drag-and-drop interaction for adding objects to the scene.
|
||||
- [x] Shader / object properties panel to modify related settings.
|
||||
- [x] Reduce size of application resources and git references.
|
||||
- [ ] Runtime reloading of modified GLSL shaders attached to objects within scenes.
|
||||
- [ ] Multiple views of a scene at one time.
|
||||
- [ ] Camera control modes such as panning, orbiting, or following objects.
|
||||
- [ ] Save / load scene data. The current model requires writing C++ code.
|
||||
- [ ] Basic text editor for quickly modifying shaders attached to objects.
|
||||
|
||||
For examples of using libqtk, see the [example-app](./example-app)
|
||||
project in the root of this repository.
|
||||
|
||||
To get textures loading on models look
|
||||
into [material files](http://www.paulbourke.net/dataformats/mtl/)
|
||||
and see some examples at [qtk-resources/resources/models](https://git.shaunreed.com/shaunrd0/qtk-resources/src/branch/master/models).
|
||||
|
||||
### Source Builds
|
||||
|
||||
Builds are configured for CLion or [Qt Creator](https://github.com/qt-creator/qt-creator).
|
||||
Simply open the root `CMakeLists.txt` with either of these editors and configurations will be loaded.
|
||||
Qtk was developed and tested using CLion
|
||||
and [Qt Creator](https://github.com/qt-creator/qt-creator).
|
||||
Simply open the root `CMakeLists.txt` with either of these editors and default
|
||||
configurations will be loaded. To simplify providing Qt to the build, Qt Creator
|
||||
is the recommended option.
|
||||
|
||||
This project has been ported to Qt6, which is not yet available in Ubuntu apt repositories.
|
||||
To run this project, you will *need* to install [Qt6 Open Source Binaries](https://www.qt.io/download-qt-installer) for your system.
|
||||
Be sure to take note of the Qt6 installation directory, as we will need it to correctly set our `CMAKE_PREFIX_PATH` in the next steps.
|
||||
If you have manually installed [Qt6 Open Source Binaries](https://www.qt.io/download-qt-installer)
|
||||
for your system, be sure to correctly set your `CMAKE_PREFIX_PATH` in the next steps.
|
||||
On Ubuntu 24.04 the default installation directory to use for this path using Qt 6.5.0 is `$HOME/Qt/6.5.0/gcc_64/lib/cmake`.
|
||||
|
||||
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 $(nproc --ignore=2) --target qtk-main
|
||||
./qtk/build/qtk-main
|
||||
```
|
||||
|
||||
By default, the build will initialize Assimp as a git submodule and build from source.
|
||||
We can turn this off by setting the `-DQTK_UPDATE_SUBMODULES=OFF` flag when running CMake.
|
||||
This will greatly increase build speed, but we will need to make sure Assimp is available either system-wide or using a custom `CMAKE_PREFIX_PATH`.
|
||||
Using `-DQTK_UPDATE_SUBMODULES=ON` supports providing assimp on cross-platform builds (Windows / Mac / Linux) and may be easier to configure.
|
||||
The Ubuntu apt repositories contain all the packages we need to build all targets.
|
||||
To build Qtk desktop application with the scene in the screenshots below run the following commands.
|
||||
|
||||
```bash
|
||||
sudo apt update -y && sudo apt install freeglut3-dev libassimp-dev cmake build-essential git
|
||||
git clone https://gitlab.com/shaunrd0/qtk
|
||||
cmake -DQTK_UPDATE_SUBMODULES=OFF -DCMAKE_PREFIX_PATH=$HOME/Qt/6.3.1/gcc_64 -S qtk/ -B qtk/build/ && cmake --build qtk/build/ -j $(nproc --ignore=2) --target qtk-main
|
||||
# We can also provide a path to assimp -
|
||||
#cmake -DQTK_UPDATE_SUBMODULES=OFF -DCMAKE_PREFIX_PATH=$HOME/Qt/6.3.1/gcc_64;/path/to/assimp/ -S qtk/ -B qtk/build/ && cmake --build qtk/build/ -j $(nproc --ignore=2) --target qtk-main
|
||||
./qtk/build/qtk-main
|
||||
sudo apt update && sudo apt install cmake build-essential git ccache libxkbcommon-dev libassimp-dev qt6-base-dev qt6-tools-dev zlib1g-dev
|
||||
cmake -DQTK_GUI_SCENE=ON -B build
|
||||
cmake --build build
|
||||
./build/bin/qtk_gui
|
||||
```
|
||||
|
||||
If you are building on **Windows / Mac** and bringing your own installation of Assimp, consider setting the `-DASSIMP_NEW_INTERFACE` build flag.
|
||||
#### Build Options
|
||||
|
||||
Qtk is composed of three separate components.
|
||||
|
||||
* The shared library [libqtk](./src/qtk) provides classes that leverage QOpenGL functionality
|
||||
while still using lower-level OpenGL APIs to customize the rendering process.
|
||||
Many of these classes can be further expanded, such as [Qtk::Scene](./src/qtk/scene.h).
|
||||
This taget, `qtk` in cmake, is always selected to build and install as
|
||||
it is required by all other components in this project.
|
||||
* The [Qtk desktop application](./src/app) is built using libqtk within a Qt application.
|
||||
This target, `qtk_gui` in cmake, is optional and can be controlled using the `QTK_GUI` option below.
|
||||
* The GUI for the Qtk desktop application is constructed using a [custom set of Qt Designer widget plugins](./src/designer-plugins) that are also built using libqtk.
|
||||
If `QTK_GUI` is disabled this target (`qtk_plugins`) is optional and can be controlled using the `QTK_PLUGINS` options below.
|
||||
|
||||
|
||||
| Name | Description | Default |
|
||||
|--------------------------|--------------------------------------------------------------|:--------|
|
||||
| QTK_DEBUG | Enable debug mode. | OFF |
|
||||
| QTK_SUBMODULES | Use git submodules to fetch assimp dependency. | OFF |
|
||||
| QTK_EXAMPLE | Build the libqtk example desktop application. | ON |
|
||||
| QTK_CCACHE | Enable CCACHE. | ON |
|
||||
| QTK_ASSIMP_NEW_INTERFACE | Use the assimp::assimp interface. Recommended for WIN / OSX. | OFF |
|
||||
| QTK_PLUGINS* | Install Qtk plugins to Qt Designer. | OFF |
|
||||
| QTK_GUI | Build and install Qtk desktop application. | ON |
|
||||
| QTK_GUI_SCENE | Fetch external 3D model resources for example scene. | OFF |
|
||||
|
||||
*The Qtk plugins are always built if `QTK_GUI` is enabled. Disabling this option
|
||||
with QTK_GUI set will not mark the plugins for installation if we do
|
||||
`cmake --install build/` without selecting a component. If both `QTK_GUI` and
|
||||
`QTK_PLUGINS` are unset, neither will be built.
|
||||
|
||||
If you are building on **Windows / Mac**, consider setting
|
||||
the `-DQTK_ASSIMP_NEW_INTERFACE` cmake build option.
|
||||
|
||||
By default, the build will not initialize Assimp as a git submodule and build
|
||||
from source.
|
||||
We can turn this on by setting the `-DQTK_SUBMODULES=ON` flag when running
|
||||
CMake.
|
||||
Building using this option will fetch and build Assimp for us, but builds will
|
||||
take longer as a result.
|
||||
Using `-DQTK_SUBMODULES=ON` supports providing assimp on cross-platform builds (
|
||||
Windows / Mac / Linux) and may be easier to configure.
|
||||
|
||||
```bash
|
||||
cmake -DASSIMP_NEW_INTERFACE=ON -DQTK_UPDATE_SUBMODULES=OFF -DCMAKE_PREFIX_PATH=$HOME/Qt/6.3.1/gcc_64;/path/to/assimp/ -S qtk/ -B qtk/build/ && cmake --build qtk/build/ -j $(nproc --ignore=2) --target qtk-main
|
||||
cmake -B build-all -DQTK_GUI=ON -DQTK_PLUGINS=ON -DQTK_EXAMPLE=ON -DQTK_SUBMODULES=ON -DCMAKE_PREFIX_PATH=$HOME/Qt/6.6.0/gcc_64
|
||||
```
|
||||
|
||||
#### Qtk Components
|
||||
|
||||
### Controls
|
||||
As described in [Build Options](#build-options), Qtk is composed of three separate components.
|
||||
Each component can be individually selected for building or installation.
|
||||
|
||||
You can fly around the scene if you hold the right mouse button and use WASD.
|
||||
If you see a small triangle floating by a model it represents the light source
|
||||
that is being used for the shader rendering the model. These appear on models
|
||||
using phong, specular, and diffuse lighting techniques.
|
||||
For this example we will configure the build with all options enabled.
|
||||
In the separate sections below we can install individual components with cmake.
|
||||
|
||||

|
||||
```bash
|
||||
sudo apt update -y && sudo apt install cmake build-essential git ccache libxkbcommon-dev libassimp-dev qt6-base-dev qt6-tools-dev -y
|
||||
git clone https://github.com/shaunrd0/qtk
|
||||
cd qtk
|
||||
# Configure the build with all components enabled
|
||||
cmake -B build-all -DQTK_GUI=ON -DQTK_PLUGINS=ON -DQTK_EXAMPLE=ON -DCMAKE_PREFIX_PATH=$HOME/Qt/6.6.0/gcc_64
|
||||
# Build all targets
|
||||
cmake --build build-all/
|
||||
````
|
||||
|
||||
Spartan with no normals -
|
||||
Now that we have all the components fully built, the following sections will
|
||||
install each component individually.
|
||||
If you want to uninstall previously installed components, run the following command.
|
||||
|
||||

|
||||
```bash
|
||||
sudo xargs rm -v < install_manifest.txt
|
||||
```
|
||||
|
||||
Spartan with normals -
|
||||
##### Qtk Library
|
||||
|
||||

|
||||
Shared libqtk library for working with lower-level OpenGL to customize the rendering process.
|
||||
We can install this library on a system path or a custom path and then
|
||||
set `CMAKE_PREFIX_PATH` to point to this location when building an application
|
||||
using libqtk.
|
||||
|
||||
Here we will install to the `/usr/local/` path.
|
||||
|
||||
### QtkWidget in Qt Creator
|
||||
```bash
|
||||
# Install libqtk only
|
||||
cmake --build build-all/ --target qtk -- -j $(nproc)
|
||||
cmake --install build-all/ --component qtk --prefix=/usr/local
|
||||
-- Install configuration: "Release"
|
||||
-- Installing: /usr/local/lib/cmake/Qtk/QtkConfig.cmake
|
||||
-- Installing: /usr/local/lib/cmake/Qtk/QtkConfigVersion.cmake
|
||||
-- Installing: /usr/local/lib/cmake/Qtk/QtkTargets.cmake
|
||||
-- Installing: /usr/local/lib/cmake/Qtk/QtkTargets-release.cmake
|
||||
-- Installing: /usr/local/lib/static/libqtk.a
|
||||
-- Installing: /usr/local/include/qtk/camera3d.h
|
||||
-- Installing: /usr/local/include/qtk/input.h
|
||||
-- Installing: /usr/local/include/qtk/meshrenderer.h
|
||||
-- Installing: /usr/local/include/qtk/model.h
|
||||
-- Installing: /usr/local/include/qtk/modelmesh.h
|
||||
-- Installing: /usr/local/include/qtk/object.h
|
||||
-- Installing: /usr/local/include/qtk/qtkapi.h
|
||||
-- Installing: /usr/local/include/qtk/qtkiostream.h
|
||||
-- Installing: /usr/local/include/qtk/qtkiosystem.h
|
||||
-- Installing: /usr/local/include/qtk/scene.h
|
||||
-- Installing: /usr/local/include/qtk/shape.h
|
||||
-- Installing: /usr/local/include/qtk/skybox.h
|
||||
-- Installing: /usr/local/include/qtk/texture.h
|
||||
-- Installing: /usr/local/include/qtk/transform3D.h
|
||||
```
|
||||
|
||||
The `QtkWidget` class is exported as a shared library for use in Qt Creator's design mode.
|
||||
We can add more QtkWidgets to view and render the scene from multiple perspectives.
|
||||
There is still some work to be done here, so there isn't a builtin way to add an additional view within the application.
|
||||
##### Qtk GUI
|
||||
|
||||

|
||||
The Qtk desktop application can be built and installed with the following commands.
|
||||
|
||||
After building Qtk, we can drag and drop an `OpenGL Widget` onto the `mainwindow.ui`.
|
||||
Then right-click the new OpenGLWidget and `Promote To->QtkWidget` to add a second view.
|
||||
```bash
|
||||
cmake --build build-all/ --target qtk_gui -- -j $(nproc)
|
||||
# Install Qtk desktop application (output removed)
|
||||
# Installation prefix path must be absolute, since Qtk uses Qt deploy tools.
|
||||
cmake --install build-all/ --component qtk_gui --prefix=$(pwd)/install
|
||||
./install/bin/qtk_gui
|
||||
```
|
||||
|
||||

|
||||
If any errors are encountered loading plugins, we can debug plugin loading by
|
||||
setting the following environment variable
|
||||
|
||||
If we demote or delete all widgets in `mainwindow.ui` and rebuild the project, Qt Creator will drop `QtkWidget` from the list of possible promoted widgets.
|
||||
Add an `OpenGL Widget` to the UI, right-click it and navigate to `Promote Widget...` and enter the information below.
|
||||
```bash
|
||||
QT_DEBUG_PLUGINS=1 ./install/bin/qtk_gui
|
||||
```
|
||||
|
||||

|
||||
##### Qtk Plugin Collection
|
||||
|
||||
After you fill out the `New Promoted Class` form, click `Add` *and*`Promote`, then rebuild.
|
||||
After following these steps Qt Creator will list `QtkWidget` as an option to promote `OpenGL Widgets` again.
|
||||
This project defines a collection of widget plugins for use with Qt Designer.
|
||||
These plugins were used to build the interface for the Qtk desktop application.
|
||||
Qt Designer will list Qtk widgets in the side panel when editing a UI file
|
||||
within the designer.
|
||||
Qtk widgets will also render and behave correctly within the UI preview in
|
||||
designer.
|
||||
The widgets in the Qtk collection were created by implementing
|
||||
the [QDesignerCustomWidgetInterface](https://doc.qt.io/qt-6/qdesignercustomwidgetinterface.html#details)
|
||||
and [QDesignerCustomWidgetCollectionInterface](https://doc.qt.io/qt-6/qdesignercustomwidgetcollectioninterface.html)
|
||||
interfaces.
|
||||
|
||||
To build and install the Qtk plugin collection -
|
||||
|
||||
```bash
|
||||
cmake --build build-all/ --target qtk_plugins -- -j $(nproc)
|
||||
# Install Qtk widget collection to use Qt Designer
|
||||
# The path here should be initialized during build configuration, so no need for --prefix
|
||||
cmake --install build-all/ --component qtk_plugins
|
||||
-- Install configuration: "Release"
|
||||
-- Up-to-date: /home/shaun/Qt/6.6.0/gcc_64/../../Tools/QtCreator/lib/Qt/lib/libqtk.a
|
||||
-- Up-to-date: /home/shaun/Qt/6.6.0/gcc_64/../../Tools/QtCreator/lib/Qt/lib/libqtk_plugin_library.a
|
||||
-- Up-to-date: /home/shaun/Qt/6.6.0/gcc_64/../../Tools/QtCreator/lib/Qt/plugins/designer/libqtk_collection.so
|
||||
```
|
||||
|
||||
#### Example libqtk Application
|
||||
|
||||
There is a simple example of using libqtk in the [example-app/](example-app)
|
||||
directory. The example can be built standalone using `find_package` or as a
|
||||
target within any qtk build.
|
||||
|
||||
```bash
|
||||
# Build the example from a configured qtk build tree
|
||||
cmake --build build-all/ --target qtk_example -- -j $(nproc)
|
||||
cmake --install build-all/ --component qtk_example --prefix=install
|
||||
./install/bin/qtk_example
|
||||
```
|
||||
|
||||
See the README in the [example-app/](example-app) subdirectory for instructions
|
||||
on standalone builds.
|
||||
|
||||
#### Development
|
||||
|
||||
This project is using `clang-format` version `>=15.0.5`.
|
||||
On Ubuntu 24.04, clang-format 18 is available to install in apt repositories.
|
||||
|
||||
```bash
|
||||
sudo apt install clang-format clang-tidy
|
||||
```
|
||||
|
||||
If `clang-format --version` is any earlier than `15.0.0`, running `clang-format` will fail because this project uses configuration options made available since `15.0.0`.
|
||||
|
||||
```bash
|
||||
clang-format --version
|
||||
Ubuntu clang-format version 18.1.3 (1ubuntu1)
|
||||
```
|
||||
|
||||
CLion has integration for IDE code reformatting actions with `clang-format`.
|
||||
If you're using CLion, the `.clang-format` configuration will be picked up by CLion automatically.
|
||||
|
||||
This repository provides the [`tools/format.sh`](./tools/format.sh) helper script to run `clang-tidy` and `clang-format` on Ubuntu 24.04.
|
||||
Running the script will build Qtk, so it's important to ensure you can manually build from source first.
|
||||
|
||||
If you'd still like to run these tools manually, see the instructions below.
|
||||
|
||||
`clang-tidy` can be run with the following commands.
|
||||
|
||||
```bash
|
||||
# Move to the root of the repo
|
||||
cd qtk
|
||||
# Build
|
||||
cmake -B build && cmake --build build -- -j $(nproc)
|
||||
```
|
||||
|
||||
```bash
|
||||
export SOURCES=src/**/*.cpp src/**/*.h example-app/*.cpp example-app/*.h
|
||||
run-clang-tidy -p build/ -j $(nproc --ignore=1) -fix -config-file=.clang-tidy $SOURCES
|
||||
```
|
||||
|
||||
Last we need to run `clang-format`, this can be done with the command directly.
|
||||
This will reformat all the code in the repository.
|
||||
|
||||
```bash
|
||||
clang-format -i --style=file:.clang-format $SOURCES
|
||||
```
|
||||
|
||||
`clang-format` can be run with git integration (or CLion if you prefer).
|
||||
Git will only reformat the lines you modified, which can be useful.
|
||||
|
||||
```bash
|
||||
# If we want to format the last N commits
|
||||
# git clang-format HEAD~N
|
||||
# 3 commits
|
||||
git clang-format HEAD~3
|
||||
changed files:
|
||||
app/examplescene.h
|
||||
app/mainwindow.h
|
||||
src/abstractscene.cpp
|
||||
src/skybox.h
|
||||
src/texture.cpp
|
||||
src/texture.h
|
||||
src/transform3D.h
|
||||
```
|
||||
|
||||
##### Packaging
|
||||
|
||||
Packaging for Qtk is in early development.
|
||||
This section documents how to package Qtk, but only source builds have been
|
||||
verified on Windows / Mac / Linux.
|
||||
For this reason, it is recommended to install Qtk by strictly building from
|
||||
source at this time.
|
||||
|
||||
Below are the steps to package a Qtk release.
|
||||
|
||||
```bash
|
||||
cd /path/to/qtk && cmake -B build
|
||||
# Package Qtk
|
||||
cmake --build build --target package
|
||||
# Package Qtk including source files
|
||||
cmake --build build --target package_source
|
||||
```
|
||||
|
||||
Alternatively, we can use `cpack` directly -
|
||||
|
||||
```bash
|
||||
cd /path/to/qtk && cmake -B build
|
||||
# Generate all install packages
|
||||
cpack -C Release
|
||||
# Generate a specific archive package (ZIP)
|
||||
cpack -C Release -G ZIP
|
||||
# Generate a specific archive package (TGZ)
|
||||
cpack -C Release -G TGZ
|
||||
# Generate debian package (DEB)
|
||||
cpack -C Release -G DEB
|
||||
# Generate NSIS install package (NSIS)
|
||||
cpack -C Release -G NSIS
|
||||
```
|
||||
|
||||
Any of the above options can be appended with `--trace-expand` to debug package
|
||||
generation issues.
|
||||
The contents of all packages will depend on how the build was configured.
|
||||
|
||||
To generate packages for Qtk desktop application, we should
|
||||
set `-DQTK_GUI=ON`. If this option is not set we will only package libqtk.
|
||||
|
||||
The NSIS installer will allow component-specific path modification for all of
|
||||
these installation components through a Windows GUI install application.
|
||||
|
||||
##### Resources
|
||||
|
||||
Some useful links and resources that I have found while working on this project.
|
||||
|
||||
[Qt Designer UI file format](https://doc.qt.io/qt-6/designer-ui-file-format.html)
|
||||
|
||||
[QtPlugin Import / Export plugins](https://doc.qt.io/qt-6/qtplugin.html)
|
||||
|
||||
[KDAB](https://www.kdab.com/)
|
||||
|
||||
## Model Artists
|
||||
|
||||
"Alien Hominid" (https://skfb.ly/onStx) by Nwilly_art is licensed under Creative Commons Attribution (http://creativecommons.org/licenses/by/4.0/).
|
||||
"Alien Hominid" (https://skfb.ly/onStx) by Nwilly_art is licensed under Creative
|
||||
Commons Attribution (http://creativecommons.org/licenses/by/4.0/).
|
||||
|
||||
"Scythe World Of Warcraft" (https://skfb.ly/6UooG) by Warcraft-3D-Models is licensed under Creative Commons Attribution (http://creativecommons.org/licenses/by/4.0/).
|
||||
"Scythe World Of Warcraft" (https://skfb.ly/6UooG) by Warcraft-3D-Models is
|
||||
licensed under Creative Commons
|
||||
Attribution (http://creativecommons.org/licenses/by/4.0/).
|
||||
|
||||
"Spartan Armour MKV - Halo Reach" (https://skfb.ly/6QVvM) by McCarthy3D is licensed under Creative Commons Attribution (http://creativecommons.org/licenses/by/4.0/).
|
||||
"Spartan Armour MKV - Halo Reach" (https://skfb.ly/6QVvM) by McCarthy3D is
|
||||
licensed under Creative Commons
|
||||
Attribution (http://creativecommons.org/licenses/by/4.0/).
|
||||
|
||||
"Survival Guitar Backpack (Low Poly)" (https://skfb.ly/6RnCB) by Berk Gedik is licensed under Creative Commons Attribution (http://creativecommons.org/licenses/by/4.0/).
|
||||
Model by Berk Gedik, from: https://sketchfab.com/3d-models/survival-guitar-backpack-low-poly-799f8c4511f84fab8c3f12887f7e6b36
|
||||
Modified (learnopengl.com) material assignment (Joey de Vries) for easier load in OpenGL model loading chapter, and renamed albedo to diffuse and metallic to specular to match non-PBR lighting setup.
|
||||
"Survival Guitar Backpack (Low Poly)" (https://skfb.ly/6RnCB) by Berk Gedik is
|
||||
licensed under Creative Commons
|
||||
Attribution (http://creativecommons.org/licenses/by/4.0/).
|
||||
Model by Berk Gedik,
|
||||
from: https://sketchfab.com/3d-models/survival-guitar-backpack-low-poly-799f8c4511f84fab8c3f12887f7e6b36
|
||||
Modified (learnopengl.com) material assignment (Joey de Vries) for easier load
|
||||
in OpenGL model loading chapter, and renamed albedo to diffuse and metallic to
|
||||
specular to match non-PBR lighting setup.
|
||||
|
||||
"Terror-bird (NHMW-Geo 2012/0007/0001)" (https://skfb.ly/onAWy) by Natural History Museum Vienna is licensed under Creative Commons Attribution-NonCommercial (http://creativecommons.org/licenses/by-nc/4.0/).
|
||||
"Terror-bird (NHMW-Geo 2012/0007/0001)" (https://skfb.ly/onAWy) by Natural
|
||||
History Museum Vienna is licensed under Creative Commons
|
||||
Attribution-NonCommercial (http://creativecommons.org/licenses/by-nc/4.0/).
|
||||
|
||||
"Golden Lion Sitting OBJ Low Poly FREE" (https://skfb.ly/onZAH) by LordSamueliSolo is licensed under Creative Commons Attribution (http://creativecommons.org/licenses/by/4.0/).
|
||||
"Golden Lion Sitting OBJ Low Poly FREE" (https://skfb.ly/onZAH) by
|
||||
LordSamueliSolo is licensed under Creative Commons
|
||||
Attribution (http://creativecommons.org/licenses/by/4.0/).
|
||||
|
||||
@@ -1,744 +0,0 @@
|
||||
/*##############################################################################
|
||||
## Author: Shaun Reed ##
|
||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
||||
## About: Classes for managing objects and data within a scene ##
|
||||
## ##
|
||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
|
||||
#include <abstractscene.h>
|
||||
#include <camera3d.h>
|
||||
#include <meshrenderer.h>
|
||||
#include <model.h>
|
||||
#include <resourcemanager.h>
|
||||
#include <examplescene.h>
|
||||
#include <texture.h>
|
||||
|
||||
using namespace Qtk;
|
||||
|
||||
/*******************************************************************************
|
||||
* Constructors, Destructors
|
||||
******************************************************************************/
|
||||
|
||||
ExampleScene::ExampleScene()
|
||||
{
|
||||
Camera().transform().setTranslation(0.0f, 0.0f, 20.0f);
|
||||
Camera().transform().setRotation(-5.0f, 0.0f, 1.0f, 0.0f);
|
||||
}
|
||||
|
||||
ExampleScene::~ExampleScene()
|
||||
{
|
||||
delete mTestPhong;
|
||||
delete mTestSpecular;
|
||||
delete mTestDiffuse;
|
||||
delete mTestAmbient;
|
||||
for (auto & mesh : mMeshes) delete mesh;
|
||||
for (auto & model : mModels) delete model;
|
||||
delete mSkybox;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Public Member Functions
|
||||
******************************************************************************/
|
||||
|
||||
void ExampleScene::init()
|
||||
{
|
||||
Qtk::Skybox * sb = new Qtk::Skybox("Skybox");
|
||||
setSkybox(sb);
|
||||
|
||||
// Initialize Phong example cube
|
||||
mTestPhong = new Qtk::MeshRenderer("phong", Qtk::Cube());
|
||||
mTestPhong->mTransform.setTranslation(3.0f, 0.0f, -2.0f);
|
||||
mTestPhong->setShaders(":/solid-phong.vert", ":/solid-phong.frag");
|
||||
mTestPhong->init();
|
||||
mTestPhong->mProgram.bind();
|
||||
mTestPhong->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f));
|
||||
mTestPhong->setUniform("uLightColor", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mTestPhong->setUniform("uAmbientStrength", 0.2f);
|
||||
mTestPhong->setUniform("uSpecularStrength", 0.50f);
|
||||
mTestPhong->setUniform("uSpecularShine", 256);
|
||||
|
||||
mTestPhong->mVAO.bind();
|
||||
mTestPhong->mNBO.create();
|
||||
mTestPhong->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
||||
mTestPhong->mNBO.bind();
|
||||
mTestPhong->mNBO.allocate(mTestPhong->normals().data(),
|
||||
mTestPhong->normals().size()
|
||||
* sizeof(mTestPhong->normals()[0]));
|
||||
mTestPhong->mProgram.enableAttributeArray(1);
|
||||
mTestPhong->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
mTestPhong->mNBO.release();
|
||||
mTestPhong->mVAO.release();
|
||||
mTestPhong->mProgram.release();
|
||||
|
||||
|
||||
// Initialize Ambient example cube
|
||||
mTestAmbient = new Qtk::MeshRenderer("ambient", Cube());
|
||||
mTestAmbient->mTransform.setTranslation(7.0f, 0.0f, -2.0f);
|
||||
mTestAmbient->setShaders(":/solid-ambient.vert", ":/solid-ambient.frag");
|
||||
mTestAmbient->init();
|
||||
mTestAmbient->mProgram.bind();
|
||||
mTestAmbient->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f));
|
||||
mTestAmbient->setUniform("uLightColor", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mTestAmbient->setUniform("uAmbientStrength", 0.2f);
|
||||
|
||||
mTestAmbient->mVAO.bind();
|
||||
mTestAmbient->mNBO.create();
|
||||
mTestAmbient->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
||||
mTestAmbient->mNBO.bind();
|
||||
mTestAmbient->mNBO.allocate(mTestAmbient->normals().data(),
|
||||
mTestAmbient->normals().size()
|
||||
* sizeof(mTestAmbient->normals()[0]));
|
||||
mTestAmbient->mProgram.enableAttributeArray(1);
|
||||
mTestAmbient->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
mTestAmbient->mNBO.release();
|
||||
mTestAmbient->mVAO.release();
|
||||
mTestAmbient->mProgram.release();
|
||||
|
||||
// Initialize Diffuse example cube
|
||||
mTestDiffuse = new Qtk::MeshRenderer("diffuse", Cube());
|
||||
mTestDiffuse->mTransform.setTranslation(9.0f, 0.0f, -2.0f);
|
||||
mTestDiffuse->setShaders(":/solid-diffuse.vert", ":/solid-diffuse.frag");
|
||||
mTestDiffuse->init();
|
||||
mTestDiffuse->mProgram.bind();
|
||||
mTestDiffuse->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f));
|
||||
mTestDiffuse->setUniform("uLightColor", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mTestDiffuse->setUniform("uAmbientStrength", 0.2f);
|
||||
|
||||
mTestDiffuse->mVAO.bind();
|
||||
mTestDiffuse->mNBO.create();
|
||||
mTestDiffuse->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
||||
mTestDiffuse->mNBO.bind();
|
||||
mTestDiffuse->mNBO.allocate(mTestDiffuse->normals().data(),
|
||||
mTestDiffuse->normals().size()
|
||||
* sizeof(mTestDiffuse->normals()[0]));
|
||||
mTestDiffuse->mProgram.enableAttributeArray(1);
|
||||
mTestDiffuse->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
mTestDiffuse->mNBO.release();
|
||||
mTestDiffuse->mVAO.release();
|
||||
mTestDiffuse->mProgram.release();
|
||||
|
||||
// Initialize Specular example cube
|
||||
mTestSpecular = new Qtk::MeshRenderer("specular", Cube());
|
||||
mTestSpecular->mTransform.setTranslation(11.0f, 0.0f, -2.0f);
|
||||
mTestSpecular->setShaders(":/solid-specular.vert", ":/solid-specular.frag");
|
||||
mTestSpecular->init();
|
||||
mTestSpecular->mProgram.bind();
|
||||
mTestSpecular->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f));
|
||||
mTestSpecular->setUniform("uLightColor", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mTestSpecular->setUniform("uAmbientStrength", 0.2f);
|
||||
mTestSpecular->setUniform("uSpecularStrength", 0.50f);
|
||||
mTestSpecular->setUniform("uSpecularShine", 256);
|
||||
|
||||
mTestSpecular->mVAO.bind();
|
||||
mTestSpecular->mNBO.create();
|
||||
mTestSpecular->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
||||
mTestSpecular->mNBO.bind();
|
||||
mTestSpecular->mNBO.allocate(mTestSpecular->normals().data(),
|
||||
mTestSpecular->normals().size()
|
||||
* sizeof(mTestSpecular->normals()[0]));
|
||||
mTestSpecular->mProgram.enableAttributeArray(1);
|
||||
mTestSpecular->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
mTestSpecular->mNBO.release();
|
||||
mTestSpecular->mVAO.release();
|
||||
mTestSpecular->mProgram.release();
|
||||
|
||||
//
|
||||
// Model loading
|
||||
|
||||
mModels.push_back(new Qtk::Model("backpack", ":/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 Qtk::Model("bird", ":/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 Qtk::Model("lion", ":/models/lion/lion.obj"));
|
||||
mModels.back()->mTransform.setTranslation(-3.0f, -1.0f, -10.0f);
|
||||
mModels.back()->mTransform.scale(0.15f);
|
||||
|
||||
mModels.push_back(new Qtk::Model("alien", ":/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 Qtk::Model("scythe", ":/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 Qtk::Model("masterChief", ":/models/spartan/spartan.obj"));
|
||||
mModels.back()->mTransform.setTranslation(-1.5f, 0.5f, -2.0f);
|
||||
|
||||
|
||||
//
|
||||
// Building example mesh objects
|
||||
|
||||
// Render an alien with specular
|
||||
// Test alien Model with phong lighting and specular mapping
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("alienTestLight", Triangle(Qtk::QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(4.0f, 1.5f, 10.0f);
|
||||
mMeshes.back()->mTransform.scale(0.25f);
|
||||
// This function changes values we have allocated in a buffer, so init() after
|
||||
mMeshes.back()->setColor(GREEN);
|
||||
mMeshes.back()->init();
|
||||
|
||||
mModels.push_back(
|
||||
new Qtk::Model("alienTest", ":/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));
|
||||
mModels.back()->setUniform("uMaterial.diffuse", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mModels.back()->setUniform("uMaterial.specular", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mModels.back()->setUniform("uMaterial.ambientStrength", 0.8f);
|
||||
mModels.back()->setUniform("uMaterial.diffuseStrength", 0.8f);
|
||||
mModels.back()->setUniform("uMaterial.specularStrength", 1.0f);
|
||||
mModels.back()->setUniform("uMaterial.shine", 32.0f);
|
||||
|
||||
mModels.back()->setUniform("uLight.ambient", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mModels.back()->setUniform("uLight.diffuse", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mModels.back()->setUniform("uLight.specular", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
|
||||
|
||||
// Test spartan Model with phong lighting, specular and normal mapping
|
||||
mMeshes.push_back(
|
||||
new Qtk::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
|
||||
mMeshes.back()->setColor(GREEN);
|
||||
mMeshes.back()->init();
|
||||
|
||||
mModels.push_back(
|
||||
new Qtk::Model("spartanTest", ":/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));
|
||||
mModels.back()->setUniform("uMaterial.diffuse", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mModels.back()->setUniform("uMaterial.specular", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mModels.back()->setUniform("uMaterial.ambientStrength", 1.0f);
|
||||
mModels.back()->setUniform("uMaterial.diffuseStrength", 1.0f);
|
||||
mModels.back()->setUniform("uMaterial.specularStrength", 1.0f);
|
||||
mModels.back()->setUniform("uMaterial.shine", 128.0f);
|
||||
mModels.back()->setUniform("uLight.ambient", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mModels.back()->setUniform("uLight.diffuse", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mModels.back()->setUniform("uLight.specular", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
|
||||
|
||||
// Test basic cube with phong.vert and phong.frag shaders
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("testLight", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(5.0f, 1.25f, 10.0f);
|
||||
mMeshes.back()->mTransform.scale(0.25f);
|
||||
mMeshes.back()->setDrawType(GL_LINE_LOOP);
|
||||
// This function changes values we have allocated in a buffer, so init() after
|
||||
mMeshes.back()->setColor(GREEN);
|
||||
mMeshes.back()->init();
|
||||
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("testPhong", Cube(QTK_DRAW_ARRAYS)));
|
||||
mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, 10.0f);
|
||||
mMeshes.back()->setShaders(":/phong.vert", ":/phong.frag");
|
||||
mMeshes.back()->setColor(QVector3D(0.0f, 0.25f, 0.0f));
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
||||
mMeshes.back()->mNBO.release();
|
||||
mMeshes.back()->mVAO.release();
|
||||
|
||||
mMeshes.back()->setUniform("uMaterial.ambient", QVector3D(0.0f, 0.3f, 0.0f));
|
||||
mMeshes.back()->setUniform("uMaterial.diffuse", QVector3D(0.0f, 0.2f, 0.0f));
|
||||
|
||||
mMeshes.back()->setUniform("uMaterial.specular", QVector3D(1.0f, 1.0f, 1.0f));
|
||||
mMeshes.back()->setUniform("uMaterial.ambientStrength", 1.0f);
|
||||
mMeshes.back()->setUniform("uMaterial.diffuseStrength", 1.0f);
|
||||
mMeshes.back()->setUniform("uMaterial.specularStrength", 1.0f);
|
||||
mMeshes.back()->setUniform("uMaterial.shine", 64.0f);
|
||||
mMeshes.back()->setUniform("uLight.ambient", QVector3D(0.25f, 0.2f, 0.075f));
|
||||
mMeshes.back()->setUniform("uLight.diffuse", QVector3D(0.75f, 0.6f, 0.22f));
|
||||
mMeshes.back()->setUniform("uLight.specular", QVector3D(0.62f, 0.55f, 0.37f));
|
||||
mMeshes.back()->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f));
|
||||
|
||||
mMeshes.back()->mProgram.release();
|
||||
|
||||
//
|
||||
// Create simple shapes using MeshRenderer class and data in mesh.h
|
||||
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("rightTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(-5.0f, 0.0f, -2.0f);
|
||||
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("centerCube", Cube(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(-7.0f, 0.0f, -2.0f);
|
||||
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("leftTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(-9.0f, 0.0f, -2.0f);
|
||||
mMeshes.back()->setDrawType(GL_LINE_LOOP);
|
||||
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("topTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(-7.0f, 2.0f, -2.0f);
|
||||
mMeshes.back()->mTransform.scale(0.25f);
|
||||
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("bottomTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(-7.0f, -2.0f, -2.0f);
|
||||
mMeshes.back()->mTransform.scale(0.25f);
|
||||
mMeshes.back()->setDrawType(GL_LINE_LOOP);
|
||||
// This function changes values we have allocated in a buffer, so init() after
|
||||
mMeshes.back()->setColor(GREEN);
|
||||
mMeshes.back()->init();
|
||||
|
||||
//
|
||||
// Testing for normals, texture coordinates
|
||||
|
||||
// RGB Normals cube to show normals are correct with QTK_DRAW_ARRAYS
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("rgbNormalsCubeArraysTest", Cube(QTK_DRAW_ARRAYS)));
|
||||
mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, 4.0f);
|
||||
mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
||||
mMeshes.back()->mProgram.release();
|
||||
mMeshes.back()->mNBO.release();
|
||||
mMeshes.back()->mVAO.release();
|
||||
|
||||
// RGB Normals cube to show normals are correct with QTK_DRAW_ELEMENTS_NORMALS
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("rgbNormalsCubeElementsTest", Cube(QTK_DRAW_ELEMENTS_NORMALS)));
|
||||
mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, 2.0f);
|
||||
mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
||||
mMeshes.back()->mProgram.release();
|
||||
mMeshes.back()->mNBO.release();
|
||||
mMeshes.back()->mVAO.release();
|
||||
|
||||
// Texturing a cube using texture coordinates and glDrawArrays
|
||||
// + Texturing with UVs using glDrawElements requires QTK_DRAW_ELEMENTS_NORMALS
|
||||
// + UVs required duplicating element position data from QTK_DRAW_ELEMENTS
|
||||
// + This is because the same position must use different UV coordinates
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("uvCubeArraysTest", Cube(QTK_DRAW_ARRAYS)));
|
||||
mMeshes.back()->mTransform.setTranslation(-3.0f, 0.0f, -2.0f);
|
||||
mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag");
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->setTexture(Texture::initTexture2D(":/crate.png"));
|
||||
mMeshes.back()->setUniform("uTexture", 0);
|
||||
mMeshes.back()->texture().bind();
|
||||
|
||||
mMeshes.back()->texture().release();
|
||||
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.destroy();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.texCoords().data(),
|
||||
mMeshes.back()->mShape.texCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.texCoords()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
2, sizeof(QVector2D));
|
||||
mMeshes.back()->mNBO.release();
|
||||
mMeshes.back()->mVAO.release();
|
||||
mMeshes.back()->mProgram.release();
|
||||
|
||||
// Test drawing a cube with texture coordinates using glDrawElements
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("uvCubeElementsTest", Cube(QTK_DRAW_ELEMENTS_NORMALS)));
|
||||
mMeshes.back()->mTransform.setTranslation(-1.7f, 0.0f, -2.0f);
|
||||
mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag");
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->texCoords().data(),
|
||||
mMeshes.back()->texCoords().size()
|
||||
* sizeof(mMeshes.back()->texCoords()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
mMeshes.back()->setTexture(Texture::initTexture2D(":/crate.png"));
|
||||
|
||||
mMeshes.back()->mProgram.setUniformValue("uTexture", 0);
|
||||
mMeshes.back()->mProgram.release();
|
||||
mMeshes.back()->mNBO.release();
|
||||
mMeshes.back()->mVAO.release();
|
||||
mMeshes.back()->mTransform.rotate(45.0f, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
// Texturing a cube using a cube map
|
||||
// + Cube map texturing works with both QTK_DRAW_ARRAYS and QTK_DRAW_ELEMENTS
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("testCubeMap", Cube(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(-3.0f, 1.0f, -2.0f);
|
||||
mMeshes.back()->mTransform.setRotation(45.0f, 0.0f, 1.0f, 0.0f);
|
||||
mMeshes.back()->setShaders(":/texture-cubemap.vert", ":/texture-cubemap.frag");
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->setTexture(Texture::initCubeMap(":/crate.png"));
|
||||
mMeshes.back()->setUniform("uTexture", 0);
|
||||
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.destroy();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.texCoords().data(),
|
||||
mMeshes.back()->mShape.texCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.texCoords()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
2, sizeof(QVector2D));
|
||||
mMeshes.back()->mNBO.release();
|
||||
mMeshes.back()->mVAO.release();
|
||||
mMeshes.back()->mProgram.release();
|
||||
|
||||
// Create a cube with custom shaders
|
||||
// + Apply RGB normals shader and spin the cube for a neat effect
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("rgbNormalsCube", Cube(QTK_DRAW_ARRAYS)));
|
||||
mMeshes.back()->mTransform.setTranslation(5.0f, 2.0f, -2.0f);
|
||||
mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
||||
mMeshes.back()->mProgram.release();
|
||||
mMeshes.back()->mNBO.release();
|
||||
mMeshes.back()->mVAO.release();
|
||||
|
||||
// RGB Normals triangle to show normals are correct with QTK_DRAW_ARRAYS
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("rgbTriangleArraysTest", Triangle(QTK_DRAW_ARRAYS)));
|
||||
mMeshes.back()->mTransform.setTranslation(7.0f, 0.0f, 2.0f);
|
||||
mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
mMeshes.back()->mNBO.release();
|
||||
mMeshes.back()->mVAO.release();
|
||||
mMeshes.back()->mProgram.release();
|
||||
|
||||
// RGB Normals triangle to show normals are correct with QTK_DRAW_ELEMENTS
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("rgbTriangleElementsTest",
|
||||
Triangle(QTK_DRAW_ELEMENTS_NORMALS)));
|
||||
mMeshes.back()->mTransform.setTranslation(7.0f, 0.0f, 4.0f);
|
||||
mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
mMeshes.back()->mNBO.release();
|
||||
mMeshes.back()->mVAO.release();
|
||||
mMeshes.back()->mProgram.release();
|
||||
|
||||
// Test drawing triangle with glDrawArrays with texture coordinates
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("testTriangleArraysUV", Triangle(QTK_DRAW_ARRAYS)));
|
||||
mMeshes.back()->mTransform.setTranslation(-3.0f, 2.0f, -2.0f);
|
||||
mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag");
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->setTexture(Texture::initTexture2D(":/crate.png"));
|
||||
mMeshes.back()->setUniform("uTexture", 0);
|
||||
mMeshes.back()->texture().bind();
|
||||
|
||||
mMeshes.back()->texture().release();
|
||||
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.destroy();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.texCoords().data(),
|
||||
mMeshes.back()->mShape.texCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.texCoords()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
2, sizeof(QVector2D));
|
||||
mMeshes.back()->mNBO.release();
|
||||
mMeshes.back()->mVAO.release();
|
||||
mMeshes.back()->mProgram.release();
|
||||
|
||||
// Test drawing triangle with glDrawElements with texture coordinates
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("testTriangleElementsUV",
|
||||
Triangle(QTK_DRAW_ELEMENTS_NORMALS)));
|
||||
mMeshes.back()->mTransform.setTranslation(-2.5f, 0.0f, -1.0f);
|
||||
mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag");
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->setTexture(Texture::initTexture2D(":/crate.png"));
|
||||
mMeshes.back()->setUniform("uTexture", 0);
|
||||
mMeshes.back()->texture().bind();
|
||||
|
||||
mMeshes.back()->texture().release();
|
||||
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.destroy();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.texCoords().data(),
|
||||
mMeshes.back()->mShape.texCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.texCoords()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
2, sizeof(QVector2D));
|
||||
mMeshes.back()->mNBO.release();
|
||||
mMeshes.back()->mVAO.release();
|
||||
mMeshes.back()->mProgram.release();
|
||||
|
||||
//
|
||||
// Lighting cube examples
|
||||
|
||||
// Example of a cube with no lighting applied
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("noLight", Cube(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, -2.0f);
|
||||
mMeshes.back()->setShaders(":/solid-perspective.vert",
|
||||
":/solid-perspective.frag");
|
||||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
mMeshes.back()->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f));
|
||||
mMeshes.back()->mProgram.release();
|
||||
|
||||
// Create objects that represent light sources for lighting examples
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("phongLight", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(3.0f, 2.0f, -2.0f);
|
||||
mMeshes.back()->mTransform.scale(0.25f);
|
||||
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("diffuseLight", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(9.0f, 2.0f, -2.0f);
|
||||
mMeshes.back()->mTransform.scale(0.25f);
|
||||
|
||||
mMeshes.push_back(
|
||||
new Qtk::MeshRenderer("specularLight", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mMeshes.back()->mTransform.setTranslation(11.0f, 2.0f, -2.0f);
|
||||
mMeshes.back()->mTransform.scale(0.25f);
|
||||
}
|
||||
|
||||
void ExampleScene::draw()
|
||||
{
|
||||
Scene::draw();
|
||||
|
||||
mTestPhong->mProgram.bind();
|
||||
mTestPhong->setUniform("uModelInverseTransposed",
|
||||
mTestPhong->mTransform.toMatrix().normalMatrix());
|
||||
mTestPhong->setUniform(
|
||||
"uLightPosition",
|
||||
MeshRenderer::getInstance("phongLight")->mTransform.translation());
|
||||
mTestPhong->setUniform("uCameraPosition",
|
||||
ExampleScene::Camera().transform().translation());
|
||||
mTestPhong->mProgram.release();
|
||||
mTestPhong->draw();
|
||||
|
||||
mTestAmbient->mProgram.bind();
|
||||
mTestAmbient->setUniform("uCameraPosition",
|
||||
ExampleScene::Camera().transform().translation());
|
||||
mTestAmbient->mProgram.release();
|
||||
mTestAmbient->draw();
|
||||
|
||||
mTestDiffuse->mProgram.bind();
|
||||
mTestDiffuse->setUniform("uModelInverseTransposed",
|
||||
mTestDiffuse->mTransform.toMatrix().normalMatrix());
|
||||
mTestDiffuse->setUniform(
|
||||
"uLightPosition",
|
||||
MeshRenderer::getInstance("diffuseLight")->mTransform.translation());
|
||||
mTestDiffuse->setUniform("uCameraPosition", ExampleScene::Camera().transform().translation());
|
||||
mTestDiffuse->mProgram.release();
|
||||
mTestDiffuse->draw();
|
||||
|
||||
mTestSpecular->mProgram.bind();
|
||||
mTestSpecular->setUniform(
|
||||
"uModelInverseTransposed",
|
||||
mTestSpecular->mTransform.toMatrix().normalMatrix());
|
||||
mTestSpecular->setUniform(
|
||||
"uLightPosition",
|
||||
MeshRenderer::getInstance("specularLight")->mTransform.translation());
|
||||
mTestSpecular->setUniform("uCameraPosition", ExampleScene::Camera().transform().translation());
|
||||
mTestSpecular->mProgram.release();
|
||||
mTestSpecular->draw();
|
||||
}
|
||||
|
||||
void ExampleScene::update()
|
||||
{
|
||||
auto position = MeshRenderer::getInstance("alienTestLight")->mTransform.translation();
|
||||
Model::getInstance("alienTest")->setUniform(
|
||||
"uLight.position", position);
|
||||
Model::getInstance("alienTest")->setUniform(
|
||||
"uCameraPosition", ExampleScene::Camera().transform().translation());
|
||||
auto posMatrix = Model::getInstance("alienTest")->mTransform.toMatrix();
|
||||
Model::getInstance("alienTest")->setUniform(
|
||||
"uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||
Model::getInstance("alienTest")->setUniform(
|
||||
"uMVP.model", posMatrix);
|
||||
Model::getInstance("alienTest")->setUniform(
|
||||
"uMVP.view", ExampleScene::Camera().toMatrix());
|
||||
Model::getInstance("alienTest")->setUniform(
|
||||
"uMVP.projection", ExampleScene::Projection());
|
||||
Model::getInstance("alienTest")->mTransform.rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
position = MeshRenderer::getInstance("spartanTestLight")->mTransform.translation();
|
||||
Model::getInstance("spartanTest")->setUniform(
|
||||
"uLight.position", position);
|
||||
Model::getInstance("spartanTest")->setUniform(
|
||||
"uCameraPosition", ExampleScene::Camera().transform().translation());
|
||||
posMatrix = Model::getInstance("spartanTest")->mTransform.toMatrix();
|
||||
Model::getInstance("spartanTest")->setUniform(
|
||||
"uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||
Model::getInstance("spartanTest")->setUniform(
|
||||
"uMVP.model", posMatrix);
|
||||
Model::getInstance("spartanTest")->setUniform(
|
||||
"uMVP.view", ExampleScene::Camera().toMatrix());
|
||||
Model::getInstance("spartanTest")->setUniform(
|
||||
"uMVP.projection", ExampleScene::Projection());
|
||||
Model::getInstance("spartanTest")->mTransform.rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
|
||||
|
||||
MeshRenderer::getInstance("testPhong")->mTransform.rotate(
|
||||
0.75f, 1.0f, 0.5f, 0.0f);
|
||||
MeshRenderer::getInstance("testPhong")->mProgram.bind();
|
||||
position = MeshRenderer::getInstance("testLight")->mTransform.translation();
|
||||
MeshRenderer::getInstance("testPhong")->setUniform(
|
||||
"uLight.position", position);
|
||||
MeshRenderer::getInstance("testPhong")->setUniform(
|
||||
"uCameraPosition", ExampleScene::Camera().transform().translation());
|
||||
posMatrix = MeshRenderer::getInstance("testPhong")->mTransform.toMatrix();
|
||||
MeshRenderer::getInstance("testPhong")->setUniform(
|
||||
"uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||
MeshRenderer::getInstance("testPhong")->setUniform(
|
||||
"uMVP.model", posMatrix);
|
||||
MeshRenderer::getInstance("testPhong")->setUniform(
|
||||
"uMVP.view", ExampleScene::Camera().toMatrix());
|
||||
MeshRenderer::getInstance("testPhong")->setUniform(
|
||||
"uMVP.projection", ExampleScene::Projection());
|
||||
MeshRenderer::getInstance("testPhong")->mProgram.release();
|
||||
|
||||
// Rotate lighting example cubes
|
||||
mTestPhong->mTransform.rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
||||
MeshRenderer::getInstance("noLight")->mTransform.rotate(
|
||||
0.75f, 0.5f, 0.3f, 0.2f);
|
||||
mTestAmbient->mTransform.rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
||||
mTestDiffuse->mTransform.rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
||||
mTestSpecular->mTransform.rotate(0.75f, 0.5f, 0.3f, 0.2f);
|
||||
|
||||
// Examples of various translations and rotations
|
||||
|
||||
// Rotate in multiple directions simultaneously
|
||||
MeshRenderer::getInstance("rgbNormalsCube")->mTransform.rotate(
|
||||
0.75f, 0.2f, 0.4f, 0.6f);
|
||||
|
||||
// Pitch forward and roll sideways
|
||||
MeshRenderer::getInstance("leftTriangle")->mTransform.rotate(
|
||||
0.75f, 1.0f, 0.0f, 0.0f);
|
||||
MeshRenderer::getInstance("rightTriangle")->mTransform.rotate(
|
||||
0.75f, 0.0f, 0.0f, 1.0f);
|
||||
|
||||
// Move between two positions over time
|
||||
static float translateX = 0.025f;
|
||||
float limit = -9.0f; // Origin position.x - 2.0f
|
||||
float posX =
|
||||
MeshRenderer::getInstance("topTriangle")->mTransform.translation().x();
|
||||
if (posX < limit || posX > limit + 4.0f) {
|
||||
translateX = -translateX;
|
||||
}
|
||||
MeshRenderer::getInstance("topTriangle")->mTransform.translate(
|
||||
translateX, 0.0f, 0.0f);
|
||||
MeshRenderer::getInstance("bottomTriangle")->mTransform.translate(
|
||||
-translateX, 0.0f, 0.0f);
|
||||
// And lets rotate the triangles in two directions at once
|
||||
MeshRenderer::getInstance("topTriangle")->mTransform.rotate(
|
||||
0.75f, 0.2f, 0.0f, 0.4f);
|
||||
MeshRenderer::getInstance("bottomTriangle")->mTransform.rotate(
|
||||
0.75f, 0.0f, 0.2f, 0.4f);
|
||||
// And make the bottom triangle green, instead of RGB
|
||||
|
||||
// Rotate center cube in several directions simultaneously
|
||||
// + Not subject to gimbal lock since we are using quaternions :)
|
||||
MeshRenderer::getInstance("centerCube")->mTransform.rotate(
|
||||
0.75f, 0.2f, 0.4f, 0.6f);
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/*##############################################################################
|
||||
## Author: Shaun Reed ##
|
||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
||||
## About: Classes for managing objects and data within a scene ##
|
||||
## ##
|
||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
|
||||
#ifndef QTK_EXAMPLE_SCENE_H
|
||||
#define QTK_EXAMPLE_SCENE_H
|
||||
|
||||
#include <abstractscene.h>
|
||||
#include <camera3d.h>
|
||||
#include <skybox.h>
|
||||
|
||||
#include <QMatrix4x4>
|
||||
|
||||
|
||||
class ExampleScene : public Qtk::Scene {
|
||||
public:
|
||||
ExampleScene();
|
||||
~ExampleScene();
|
||||
|
||||
virtual void init();
|
||||
virtual void draw() override;
|
||||
virtual void update();
|
||||
|
||||
private:
|
||||
|
||||
Qtk::MeshRenderer * mTestPhong;
|
||||
Qtk::MeshRenderer * mTestSpecular;
|
||||
Qtk::MeshRenderer * mTestDiffuse;
|
||||
Qtk::MeshRenderer * mTestAmbient;
|
||||
};
|
||||
|
||||
#endif // QTK_EXAMPLE_SCENE_H
|
||||
40
app/main.cpp
@@ -1,40 +0,0 @@
|
||||
/*##############################################################################
|
||||
## Author: Shaun Reed ##
|
||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
||||
## About: Main program for practice using Qt6 widgets and OpenGL ##
|
||||
## ##
|
||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
|
||||
#include <QApplication>
|
||||
#include <QLabel>
|
||||
|
||||
#include <qtkwidget.h>
|
||||
#include <mainwindow.h>
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
|
||||
// Set OpenGL Version information
|
||||
// Note: This format must be set before show() is called.
|
||||
QSurfaceFormat format;
|
||||
format.setRenderableType(QSurfaceFormat::OpenGL);
|
||||
format.setProfile(QSurfaceFormat::CoreProfile);
|
||||
format.setVersion(4,5);
|
||||
// Set the number of samples used for glEnable(GL_MULTISAMPLING)
|
||||
format.setSamples(4);
|
||||
// Set the size of the depth bufer for glEnable(GL_DEPTH_TEST)
|
||||
format.setDepthBufferSize(16);
|
||||
#ifdef QTK_DEBUG
|
||||
format.setOption(QSurfaceFormat::DebugContext);
|
||||
#endif // QTK_DEBUG
|
||||
|
||||
// Create window for Qt application using custom mainwindow.h
|
||||
MainWindow w;
|
||||
w.show();
|
||||
|
||||
return a.exec();
|
||||
}
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
#include <mainwindow.h>
|
||||
#include <qtkwidget.h>
|
||||
#include "ui_mainwindow.h"
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::MainWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
// For use in design mode using Qt Creator
|
||||
// + We can use the `ui` member to access nested widgets by name
|
||||
for (const auto widget : ui->qWidget->children()) {
|
||||
auto qtkWidget = dynamic_cast<Qtk::QtkWidget*>(widget);
|
||||
if (qtkWidget != nullptr) {
|
||||
std::string key = qtkWidget->objectName().toStdString();
|
||||
if (mScenes[key] == nullptr) {
|
||||
mScenes[qtkWidget->objectName().toStdString()] = new ExampleScene();
|
||||
}
|
||||
qtkWidget->setScene(mScenes[qtkWidget->objectName().toStdString()]);
|
||||
}
|
||||
}
|
||||
setWindowIcon(QIcon("../resources/icon.png"));
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
#include <QMainWindow>
|
||||
|
||||
#include "qtk-widget_export.h"
|
||||
#include <examplescene.h>
|
||||
|
||||
|
||||
namespace Ui {
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class QTK_WIDGET_EXPORT MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = nullptr);
|
||||
~MainWindow();
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
std::unordered_map<std::string, Qtk::Scene*> mScenes;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
@@ -1,114 +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>800</width>
|
||||
<height>600</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Qtk - MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<widget class="QWidget" name="qWidget" native="true">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>801</width>
|
||||
<height>561</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="Qtk::QtkWidget" name="openGLWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>10</y>
|
||||
<width>781</width>
|
||||
<height>541</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menubar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>22</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuTest">
|
||||
<property name="title">
|
||||
<string>File</string>
|
||||
</property>
|
||||
<addaction name="actionOpen"/>
|
||||
<addaction name="actionSave_2"/>
|
||||
<addaction name="actionSave_as"/>
|
||||
<addaction name="actionExit"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuView">
|
||||
<property name="title">
|
||||
<string>View</string>
|
||||
</property>
|
||||
<addaction name="actionShow_Console"/>
|
||||
</widget>
|
||||
<addaction name="menuTest"/>
|
||||
<addaction name="menuView"/>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
<action name="actionOtherTest">
|
||||
<property name="text">
|
||||
<string>Save</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSave">
|
||||
<property name="text">
|
||||
<string>Save</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionOpen">
|
||||
<property name="text">
|
||||
<string>Open...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSave_2">
|
||||
<property name="text">
|
||||
<string>Save</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSave_as">
|
||||
<property name="text">
|
||||
<string>Save as...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionExit">
|
||||
<property name="text">
|
||||
<string>Exit</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionShow_Console">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Show Console</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Qtk::QtkWidget</class>
|
||||
<extends>QOpenGLWidget</extends>
|
||||
<header>qtkwidget.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -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>
|
||||
|
||||
#include <src/qtkresources.h>
|
||||
|
||||
#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] == ':' ? QTK_RESOURCES + path.substr(1) : path;
|
||||
}
|
||||
} RM;
|
||||
|
||||
#endif //QTK_RESOURCEMANAGER_H
|
||||
@@ -10,7 +10,7 @@ find_package(Git)
|
||||
# _PATH: Path to git submodule location that we want to update
|
||||
# + submodule_update(extern/assimp)
|
||||
function(submodule_update _PATH)
|
||||
if (NOT QTK_UPDATE_SUBMODULES)
|
||||
if (NOT QTK_SUBMODULES)
|
||||
return()
|
||||
endif()
|
||||
|
||||
|
||||
13
cmake/templates/Config.cmake.in
Normal file
@@ -0,0 +1,13 @@
|
||||
@PACKAGE_INIT@
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/QtkTargets.cmake")
|
||||
|
||||
set_and_check(QTK_EXECUTABLE "${PACKAGE_PREFIX_DIR}/bin/qtk_gui")
|
||||
set_and_check(QTK_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include")
|
||||
set_and_check(QTK_LIBRARIES "${PACKAGE_PREFIX_DIR}/lib")
|
||||
|
||||
set_and_check(Qtk_EXECUTABLE "${PACKAGE_PREFIX_DIR}/bin/qtk_gui")
|
||||
set_and_check(Qtk_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include")
|
||||
set_and_check(Qtk_LIBRARIES "${PACKAGE_PREFIX_DIR}/lib")
|
||||
|
||||
check_required_components(Qtk)
|
||||
103
example-app/CMakeLists.txt
Normal file
@@ -0,0 +1,103 @@
|
||||
################################################################################
|
||||
## Example client project using qtk ##
|
||||
## ##
|
||||
## Author: Shaun Reed | Contact: shaunrd0@gmail.com | URL: www.shaunreed.com ##
|
||||
## All Content (c) 2025 Shaun Reed, all rights reserved ##
|
||||
################################################################################
|
||||
cmake_minimum_required(VERSION 3.23)
|
||||
|
||||
################################################################################
|
||||
# Constants
|
||||
################################################################################
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||
add_compile_options(/wd4131 /wd4127)
|
||||
endif()
|
||||
|
||||
# If you did not install Qtk on a system path, point cmake to installation.
|
||||
set(
|
||||
QTK_PATH ../build/install/lib/cmake/Qtk
|
||||
CACHE PATH "Path to installation of Qtk"
|
||||
FORCE
|
||||
)
|
||||
|
||||
# If you did not install Qt6 on a system path, point cmake to installation.
|
||||
set(QT_INSTALL_DIR "$ENV{HOME}/Qt/6.5.0/gcc_64/" CACHE PATH "Path to Qt6")
|
||||
|
||||
################################################################################
|
||||
# Project
|
||||
################################################################################
|
||||
project(
|
||||
#[[NAME]] QtkClient
|
||||
VERSION 0.1
|
||||
DESCRIPTION "An example project using Qtk"
|
||||
LANGUAGES CXX C
|
||||
)
|
||||
|
||||
list(APPEND CMAKE_PREFIX_PATH "${QTK_PATH}")
|
||||
list(APPEND CMAKE_PREFIX_PATH "${QT_INSTALL_DIR}")
|
||||
|
||||
# Print all QTK variables
|
||||
if (NOT Qtk_IS_TOP_LEVEL)
|
||||
get_cmake_property(VAR_NAMES VARIABLES)
|
||||
list(FILTER VAR_NAMES INCLUDE REGEX "^Q[tT][kK]_.*$")
|
||||
list(SORT VAR_NAMES)
|
||||
foreach(VAR_NAME ${VAR_NAMES})
|
||||
message(STATUS "[Qtk] ${VAR_NAME}=${${VAR_NAME}}")
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# Allow add_subdirectory on this project to use target ALIAS if available.
|
||||
# If this example project is opened standalone we will use find_package.
|
||||
if(NOT TARGET Qtk::qtk)
|
||||
find_package(Qtk 0.3 REQUIRED)
|
||||
endif()
|
||||
|
||||
find_package(Qt6 COMPONENTS Core Widgets OpenGLWidgets REQUIRED)
|
||||
|
||||
set(
|
||||
EXAMPLE_SOURCES
|
||||
main.cpp
|
||||
examplescene.cpp examplescene.h
|
||||
examplewidget.cpp examplewidget.h
|
||||
)
|
||||
|
||||
configure_file(
|
||||
#[[INPUT]] "${CMAKE_CURRENT_SOURCE_DIR}/resources.h.in"
|
||||
#[[OUTPUT]] "${CMAKE_CURRENT_BINARY_DIR}/resources.h"
|
||||
@ONLY
|
||||
)
|
||||
|
||||
qt_add_executable(qtk_example ${EXAMPLE_SOURCES})
|
||||
target_link_libraries(qtk_example PUBLIC Qt6::Widgets Qt6::OpenGLWidgets Qt6::Core)
|
||||
target_link_libraries(qtk_example PUBLIC Qtk::qtk)
|
||||
target_include_directories(qtk_example PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
|
||||
# qt_generate_deploy_app_script supports Windows and OSX in QtCore >= 6.3.
|
||||
# qt_generate_deploy_app_script is supported on Linux in QtCore >= 6.5.0.
|
||||
if((Qt6_VERSION VERSION_GREATER_EQUAL "6.3.0" AND (WIN32 OR APPLE))
|
||||
OR Qt6_VERSION VERSION_GREATER_EQUAL "6.5.0")
|
||||
install(
|
||||
TARGETS qtk_example
|
||||
COMPONENT qtk_example
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION lib
|
||||
ARCHIVE DESTINATION lib/static
|
||||
RUNTIME DESTINATION bin
|
||||
)
|
||||
qt_generate_deploy_app_script(
|
||||
TARGET qtk_example
|
||||
OUTPUT_SCRIPT QTK_EXAMPLE_DEPLOY_SCRIPT
|
||||
NO_UNSUPPORTED_PLATFORM_ERROR
|
||||
)
|
||||
install(SCRIPT ${QTK_EXAMPLE_DEPLOY_SCRIPT} COMPONENT qtk_example)
|
||||
elseif(NOT Qtk_IS_TOP_LEVEL)
|
||||
message(WARNING "[Qtk] Installation is only supported on Qt >=6.5.\n")
|
||||
endif()
|
||||
73
example-app/README.md
Normal file
@@ -0,0 +1,73 @@
|
||||
This is an example application that is using the Qtk API to create custom Qt
|
||||
OpenGL widgets. This is very similar to `QtkWidget` in the Qtk desktop
|
||||
application source code, but could be modified for different uses if needed.
|
||||
|
||||
There are no camera controls supported in this example. The camera is fixed.
|
||||
If these controls are desired, they can be implemented by the client.
|
||||
|
||||
You can import your own models within `examplescene.cpp`, inside the
|
||||
`ExampleScene::init()` function. Rotations and translations
|
||||
are applied in `ExampleScene::update()`.
|
||||
|
||||
The syntax for adding shapes and models is seen in the example below.
|
||||
This would result in a scene with a red cube and a miniature spartan model
|
||||
placed on top.
|
||||
|
||||
```C++
|
||||
void ExampleScene::init() {
|
||||
// Add a skybox to the scene using default cube map images and settings.
|
||||
setSkybox(new Qtk::Skybox("Skybox"));
|
||||
|
||||
/* Create a red cube with a mini master chief on top. */
|
||||
auto myCube = new MeshRenderer("My cube", Cube(Qtk::QTK_DRAW_ELEMENTS));
|
||||
myCube->setColor(RED);
|
||||
mMeshes.push_back(myCube);
|
||||
|
||||
auto mySpartan = new Model("My spartan", "/path/to/spartan/spartan.obj");
|
||||
mySpartan->getTransform().setTranslation(0.0f, 0.5f, 0.0f);
|
||||
mySpartan->getTransform().setScale(0.5f);
|
||||
mModels.push_back(mySpartan);
|
||||
}
|
||||
```
|
||||
|
||||
If we want to make our spartan spin, we need to apply rotation in `update`
|
||||
|
||||
```C++
|
||||
void ExampleScene::update() {
|
||||
auto mySpartan = Model::getInstance("My spartan");
|
||||
mySpartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
auto myCube = MeshRenderer::getInstance("My cube");
|
||||
myCube->getTransform().rotate(-0.75f, 0.0f, 1.0f, 0.0f);
|
||||
}
|
||||
```
|
||||
|
||||
Other examples can be found in the source files for this example project.
|
||||
|
||||
## Build Instructions
|
||||
|
||||
Currently, this application requires manual build and installation of Qtk.
|
||||
In the future, once a release is published, I will be able to use `FetchContent`
|
||||
or similar cmake functionality to remove this requirement.
|
||||
|
||||
For Qtk build instructions, see the README in the root of this repository.
|
||||
|
||||
```bash
|
||||
cmake -S /path/to/qtk/example-app/ -B /path/to/qtk/example-app/build
|
||||
cmake --build /path/to/qtk/example-app/build
|
||||
```
|
||||
|
||||
If Qtk was not installed system-wide, we can set `QTK_PATH` to point to the
|
||||
custom installation directory.
|
||||
|
||||
```bash
|
||||
cmake -S /path/to/qtk/example-app/ -B /path/to/qtk/example-app/build -DQTK_PATH=/path/to/qtk/install/
|
||||
cmake --build /path/to/qtk/example-app/build --target qtk_example -- -j $(nproc)
|
||||
cmake --install build/ --component qtk_example
|
||||
```
|
||||
|
||||
After this, we can run the example application -
|
||||
|
||||
```bash
|
||||
./path/to/qtk/example-app/build/install/bin/example
|
||||
```
|
||||
94
example-app/examplescene.cpp
Normal file
@@ -0,0 +1,94 @@
|
||||
/*##############################################################################
|
||||
## Author: Shaun Reed ##
|
||||
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||
## About: Example Qtk scene ##
|
||||
## ##
|
||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
|
||||
#include "examplescene.h"
|
||||
#include <resources.h>
|
||||
|
||||
using namespace Qtk;
|
||||
|
||||
ExampleScene::ExampleScene()
|
||||
{
|
||||
setSceneName("Example Scene");
|
||||
getCamera().getTransform().setTranslation(-8.0f, 0.0f, 10.0f);
|
||||
getCamera().getTransform().setRotation(-5.0f, 0.0f, 1.0f, 0.0f);
|
||||
}
|
||||
|
||||
ExampleScene::~ExampleScene() = default;
|
||||
|
||||
void ExampleScene::init()
|
||||
{
|
||||
setSkybox(new Qtk::Skybox);
|
||||
|
||||
auto mesh = addObject(
|
||||
new Qtk::MeshRenderer("rightTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mesh->getTransform().setTranslation(-5.0f, 0.0f, -2.0f);
|
||||
|
||||
// QTK_DRAW_ARRAYS is the default for generic shapes in qtk/shape.h
|
||||
addObject(new Qtk::MeshRenderer("centerCube", Cube(QTK_DRAW_ARRAYS)))
|
||||
->getTransform()
|
||||
.setTranslation(-7.0f, 0.0f, -2.0f);
|
||||
|
||||
mesh = addObject(
|
||||
new Qtk::MeshRenderer("leftTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mesh->getTransform().setTranslation(-9.0f, 0.0f, -2.0f);
|
||||
mesh->setDrawType(GL_LINE_LOOP);
|
||||
|
||||
mesh = addObject(
|
||||
new Qtk::MeshRenderer("topTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mesh->getTransform().setTranslation(-7.0f, 2.0f, -2.0f);
|
||||
mesh->getTransform().scale(0.25f);
|
||||
|
||||
mesh = addObject(
|
||||
new Qtk::MeshRenderer("bottomTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
||||
mesh->getTransform().setTranslation(-7.0f, -2.0f, -2.0f);
|
||||
mesh->getTransform().scale(0.25f);
|
||||
mesh->setDrawType(GL_LINE_LOOP);
|
||||
mesh->setColor(GREEN);
|
||||
}
|
||||
|
||||
void ExampleScene::draw()
|
||||
{
|
||||
// The base class method _must_ be called first, before additional logic.
|
||||
Scene::draw();
|
||||
|
||||
// No additional custom draw logic for this example.
|
||||
// QtkScene in Qtk desktop application is an example using custom draw logic.
|
||||
}
|
||||
|
||||
void ExampleScene::update()
|
||||
{
|
||||
auto top_triangle = MeshRenderer::getInstance("topTriangle");
|
||||
auto bottom_triangle = MeshRenderer::getInstance("bottomTriangle");
|
||||
|
||||
// Pitch forward and roll sideways
|
||||
MeshRenderer::getInstance("leftTriangle")
|
||||
->getTransform()
|
||||
.rotate(0.75f, 1.0f, 0.0f, 0.0f);
|
||||
MeshRenderer::getInstance("rightTriangle")
|
||||
->getTransform()
|
||||
.rotate(0.75f, 0.0f, 0.0f, 1.0f);
|
||||
|
||||
// Make the top and bottom triangles slide left-to-right.
|
||||
static float translateX = 0.025f;
|
||||
float limit = -9.0f; // Origin position.x - 2.0f
|
||||
float posX = top_triangle->getTransform().getTranslation().x();
|
||||
if (posX < limit || posX > limit + 4.0f) {
|
||||
translateX = -translateX;
|
||||
}
|
||||
|
||||
top_triangle->getTransform().translate(translateX, 0.0f, 0.0f);
|
||||
bottom_triangle->getTransform().translate(-translateX, 0.0f, 0.0f);
|
||||
|
||||
// Apply some rotation to the triangles as they move left-to-right.
|
||||
top_triangle->getTransform().rotate(0.75f, 0.2f, 0.0f, 0.4f);
|
||||
bottom_triangle->getTransform().rotate(0.75f, 0.0f, 0.2f, 0.4f);
|
||||
|
||||
MeshRenderer::getInstance("centerCube")
|
||||
->getTransform()
|
||||
.rotate(0.75f, 0.2f, 0.4f, 0.6f);
|
||||
}
|
||||
41
example-app/examplescene.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/*##############################################################################
|
||||
## Author: Shaun Reed ##
|
||||
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||
## About: Example Qtk scene ##
|
||||
## ##
|
||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
|
||||
#ifndef QTK_EXAMPLE_SCENE_H
|
||||
#define QTK_EXAMPLE_SCENE_H
|
||||
|
||||
#include <qtk/scene.h>
|
||||
|
||||
class ExampleScene : public Qtk::Scene
|
||||
{
|
||||
public:
|
||||
explicit ExampleScene();
|
||||
|
||||
~ExampleScene();
|
||||
|
||||
/**
|
||||
* Override the initialization logic for the scene.
|
||||
* This method should up the scene's objects, skybox, etc.
|
||||
*/
|
||||
void init() override;
|
||||
|
||||
/**
|
||||
* Optionally override the draw method for the scene.
|
||||
*
|
||||
* This is just here for example, it should be omitted entirely if we don't
|
||||
* want to provide a custom implementation for the ExampleScene.
|
||||
*/
|
||||
void draw() override;
|
||||
|
||||
/**
|
||||
* Update objects in the scene for translation or rotation.
|
||||
*/
|
||||
void update() override;
|
||||
};
|
||||
|
||||
#endif // QTK_EXAMPLE_SCENE_H
|
||||
62
example-app/examplewidget.cpp
Normal file
@@ -0,0 +1,62 @@
|
||||
/*##############################################################################
|
||||
## Author: Shaun Reed ##
|
||||
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||
## About: Example Qtk widget ##
|
||||
## ##
|
||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
|
||||
#include <qtk/scene.h>
|
||||
|
||||
#include "examplewidget.h"
|
||||
|
||||
ExampleWidget::ExampleWidget(QWidget * parent) :
|
||||
QOpenGLWidget(parent), mScene(new ExampleScene)
|
||||
{
|
||||
// NOTE: The decorator pattern is used to save / load scenes in Qtk currently.
|
||||
// The initializer above sets mScene to the concrete decorator ExampleScene.
|
||||
// Qtk::SceneEmpty provides an empty scene as the concrete component.
|
||||
// ExampleScene is defined in client source, deriving Qtk::SceneInterface.
|
||||
|
||||
QSurfaceFormat format;
|
||||
format.setRenderableType(QSurfaceFormat::OpenGL);
|
||||
format.setProfile(QSurfaceFormat::CoreProfile);
|
||||
format.setVersion(4, 6);
|
||||
format.setSamples(4);
|
||||
format.setDepthBufferSize(16);
|
||||
setFormat(format);
|
||||
setFocusPolicy(Qt::ClickFocus);
|
||||
}
|
||||
|
||||
void ExampleWidget::initializeGL()
|
||||
{
|
||||
initializeOpenGLFunctions();
|
||||
connect(this, SIGNAL(frameSwapped()), this, SLOT(update()));
|
||||
glEnable(GL_MULTISAMPLE);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_TRUE);
|
||||
glDepthFunc(GL_LEQUAL);
|
||||
glDepthRange(0.1f, 1.0f);
|
||||
glClearDepth(1.0f);
|
||||
glClearColor(0.0f, 0.25f, 0.0f, 0.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
}
|
||||
|
||||
void ExampleWidget::resizeGL(int width, int height)
|
||||
{
|
||||
Qtk::Scene::getProjectionMatrix().setToIdentity();
|
||||
Qtk::Scene::getProjectionMatrix().perspective(
|
||||
45.0f, float(width) / float(height), 0.1f, 1000.0f);
|
||||
}
|
||||
|
||||
void ExampleWidget::paintGL()
|
||||
{
|
||||
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
|
||||
mScene->draw();
|
||||
}
|
||||
|
||||
void ExampleWidget::update()
|
||||
{
|
||||
mScene->update();
|
||||
QWidget::update();
|
||||
}
|
||||
39
example-app/examplewidget.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*##############################################################################
|
||||
## Author: Shaun Reed ##
|
||||
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||
## About: Example Qtk widget ##
|
||||
## ##
|
||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
|
||||
#ifndef QTKCLIENT_EXAMPLEWIDGET_H
|
||||
#define QTKCLIENT_EXAMPLEWIDGET_H
|
||||
|
||||
#include <QOpenGLFunctions>
|
||||
#include <QOpenGLWidget>
|
||||
|
||||
#include "examplescene.h"
|
||||
|
||||
class ExampleWidget : public QOpenGLWidget, protected QOpenGLFunctions
|
||||
{
|
||||
Q_OBJECT;
|
||||
|
||||
public:
|
||||
explicit ExampleWidget(QWidget * parent = nullptr);
|
||||
|
||||
~ExampleWidget() = default;
|
||||
|
||||
void initializeGL() override;
|
||||
|
||||
void resizeGL(int width, int height) override;
|
||||
|
||||
void paintGL() override;
|
||||
|
||||
protected slots:
|
||||
void update();
|
||||
|
||||
private:
|
||||
Qtk::Scene * mScene;
|
||||
};
|
||||
|
||||
#endif // QTKCLIENT_EXAMPLEWIDGET_H
|
||||
@@ -1,23 +1,23 @@
|
||||
/*##############################################################################
|
||||
## Author: Shaun Reed ##
|
||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
||||
## About: Main window for Qt6 OpenGL widget application ##
|
||||
## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ##
|
||||
## About: Example Qt desktop application using Qtk ##
|
||||
## ##
|
||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
#ifndef QTK_QTKAPI_H
|
||||
#define QTK_QTKAPI_H
|
||||
|
||||
#include <QtCore/QtGlobal>
|
||||
#include <QApplication>
|
||||
#include <QMainWindow>
|
||||
|
||||
#ifdef QTK_SHARED
|
||||
# if defined(QTK_EXPORT)
|
||||
# define QTKAPI Q_DECL_EXPORT
|
||||
# else
|
||||
# define QTKAPI Q_DECL_IMPORT
|
||||
# endif
|
||||
#else
|
||||
# define QTKAPI
|
||||
#endif
|
||||
#include "examplewidget.h"
|
||||
|
||||
#endif //QTK_QTKAPI_H
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
|
||||
auto window = new QMainWindow;
|
||||
window->setCentralWidget(new ExampleWidget);
|
||||
window->show();
|
||||
|
||||
app.exec();
|
||||
}
|
||||
6
example-app/resources.h.in
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef QTK_RESOURCES_H_IN_H
|
||||
#define QTK_RESOURCES_H_IN_H
|
||||
|
||||
#define QTK_EXAMPLE_SOURCE_DIR "@CMAKE_SOURCE_DIR@"
|
||||
|
||||
#endif // QTK_RESOURCES_H_IN_H
|
||||
2
extern/assimp/assimp
vendored
@@ -1,81 +0,0 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<!--3DModel test shader-->
|
||||
<file alias="model.frag">resources/shaders/fragment/model.frag</file>
|
||||
<file alias="model.vert">resources/shaders/vertex/model.vert</file>
|
||||
<!--Phong test shader-->
|
||||
<file alias="phong.frag">resources/shaders/fragment/phong.frag</file>
|
||||
<file alias="phong.vert">resources/shaders/vertex/phong.vert</file>
|
||||
|
||||
|
||||
<!--Simple Solid Shader-->
|
||||
<file alias="solid.frag">resources/shaders/fragment/solid.frag</file>
|
||||
<file alias="solid.vert">resources/shaders/vertex/solid.vert</file>
|
||||
|
||||
<!--Solid Color Shader-->
|
||||
<file alias="solid-perspective.frag">resources/shaders/fragment/solid-perspective.frag</file>
|
||||
<file alias="solid-perspective.vert">resources/shaders/vertex/solid-perspective.vert</file>
|
||||
|
||||
<!--Multi-color Shader-->
|
||||
<file alias="multi-color.frag">resources/shaders/fragment/multi-color.frag</file>
|
||||
<file alias="multi-color.vert">resources/shaders/vertex/multi-color.vert</file>
|
||||
|
||||
<!--RGB Normals Shader-->
|
||||
<file alias="rgb-normals.frag">resources/shaders/fragment/rgb-normals.frag</file>
|
||||
<file alias="rgb-normals.vert">resources/shaders/vertex/rgb-normals.vert</file>
|
||||
|
||||
<!--CubeMap Texture Shader-->
|
||||
<file alias="texture-cubemap.frag">resources/shaders/fragment/texture-cubemap.frag</file>
|
||||
<file alias="texture-cubemap.vert">resources/shaders/vertex/texture-cubemap.vert</file>
|
||||
|
||||
<!--2D Texture Shader-->
|
||||
<file alias="texture2d.frag">resources/shaders/fragment/texture2d.frag</file>
|
||||
<file alias="texture2d.vert">resources/shaders/vertex/texture2d.vert</file>
|
||||
|
||||
|
||||
<!--Ambient Shader-->
|
||||
<file alias="solid-ambient.frag">resources/shaders/fragment/solid-ambient.frag</file>
|
||||
<file alias="solid-ambient.vert">resources/shaders/vertex/solid-ambient.vert</file>
|
||||
<!--Diffuse Shader-->
|
||||
<file alias="solid-diffuse.frag">resources/shaders/fragment/solid-diffuse.frag</file>
|
||||
<file alias="solid-diffuse.vert">resources/shaders/vertex/solid-diffuse.vert</file>
|
||||
<!--Specular Shader-->
|
||||
<file alias="solid-specular.frag">resources/shaders/fragment/solid-specular.frag</file>
|
||||
<file alias="solid-specular.vert">resources/shaders/vertex/solid-specular.vert</file>
|
||||
<!--Basic Phong Shader-->
|
||||
<file alias="solid-phong.frag">resources/shaders/fragment/solid-phong.frag</file>
|
||||
<file alias="solid-phong.vert">resources/shaders/vertex/solid-phong.vert</file>
|
||||
|
||||
|
||||
<!--3DModel Basic Shader-->
|
||||
<file alias="model-basic.frag">resources/shaders/fragment/model-basic.frag</file>
|
||||
<file alias="model-basic.vert">resources/shaders/vertex/model-basic.vert</file>
|
||||
|
||||
<!--3DModel shader with specular mapping-->
|
||||
<file alias="model-specular.frag">resources/shaders/fragment/model-specular.frag</file>
|
||||
<file alias="model-specular.vert">resources/shaders/vertex/model-specular.vert</file>
|
||||
|
||||
<!--3DModel shader with normal mapping-->
|
||||
<file alias="model-normals.frag">resources/shaders/fragment/model-normals.frag</file>
|
||||
<file alias="model-normals.vert">resources/shaders/vertex/model-normals.vert</file>
|
||||
|
||||
|
||||
|
||||
<!-- Skybox Shaders-->
|
||||
<file alias="skybox.frag">resources/skybox/skybox.frag</file>
|
||||
<file alias="skybox.vert">resources/skybox/skybox.vert</file>
|
||||
|
||||
|
||||
<!--Texture Images-->
|
||||
<file alias="crate.png">resources/images/crate.png</file>
|
||||
<file alias="stone.png">resources/images/stone.png</file>
|
||||
<file alias="wood.png">resources/images/wood.png</file>
|
||||
<!-- Skybox Images-->
|
||||
<file alias="back.png">resources/skybox/back.png</file>
|
||||
<file alias="bottom.png">resources/skybox/bottom.png</file>
|
||||
<file alias="front.png">resources/skybox/front.png</file>
|
||||
<file alias="left.png">resources/skybox/left.png</file>
|
||||
<file alias="right.png">resources/skybox/right.png</file>
|
||||
<file alias="top.png">resources/skybox/top.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
165
resources/fontawesome-free-6.2.1-desktop/LICENSE.txt
Normal file
@@ -0,0 +1,165 @@
|
||||
Fonticons, Inc. (https://fontawesome.com)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Font Awesome Free License
|
||||
|
||||
Font Awesome Free is free, open source, and GPL friendly. You can use it for
|
||||
commercial projects, open source projects, or really almost whatever you want.
|
||||
Full Font Awesome Free license: https://fontawesome.com/license/free.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
|
||||
|
||||
The Font Awesome Free download is licensed under a Creative Commons
|
||||
Attribution 4.0 International License and applies to all icons packaged
|
||||
as SVG and JS file types.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# Fonts: SIL OFL 1.1 License
|
||||
|
||||
In the Font Awesome Free download, the SIL OFL license applies to all icons
|
||||
packaged as web and desktop font files.
|
||||
|
||||
Copyright (c) 2022 Fonticons, Inc. (https://fontawesome.com)
|
||||
with Reserved Font Name: "Font Awesome".
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
SIL OPEN FONT LICENSE
|
||||
Version 1.1 - 26 February 2007
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting — in part or in whole — any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# Code: MIT License (https://opensource.org/licenses/MIT)
|
||||
|
||||
In the Font Awesome Free download, the MIT license applies to all non-font and
|
||||
non-icon files.
|
||||
|
||||
Copyright 2022 Fonticons, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without limitation the rights to use, copy,
|
||||
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# Attribution
|
||||
|
||||
Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font
|
||||
Awesome Free files already contain embedded comments with sufficient
|
||||
attribution, so you shouldn't need to do anything additional when using these
|
||||
files normally.
|
||||
|
||||
We've kept attribution comments terse, so we ask that you do not actively work
|
||||
to remove them from files, especially code. They're a great way for folks to
|
||||
learn about Font Awesome.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# Brand Icons
|
||||
|
||||
All brand icons are trademarks of their respective owners. The use of these
|
||||
trademarks does not indicate endorsement of the trademark holder by Font
|
||||
Awesome, nor vice versa. **Please do not use brand logos for any purpose except
|
||||
to represent the company, product, or service to which they refer.**
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M439.55 236.05L244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
|
||||
|
After Width: | Height: | Size: 749 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M224 256c-35.2 0-64 28.8-64 64c0 35.2 28.8 64 64 64c35.2 0 64-28.8 64-64C288 284.8 259.2 256 224 256zM433.1 129.1l-83.9-83.9C341.1 37.06 328.8 32 316.1 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V163.9C448 151.2 442.9 138.9 433.1 129.1zM128 80h144V160H128V80zM400 416c0 8.836-7.164 16-16 16H64c-8.836 0-16-7.164-16-16V96c0-8.838 7.164-16 16-16h16v104c0 13.25 10.75 24 24 24h192C309.3 208 320 197.3 320 184V83.88l78.25 78.25C399.4 163.2 400 164.8 400 166.3V416z"/></svg>
|
||||
|
After Width: | Height: | Size: 789 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M572.6 270.3l-96 192C471.2 473.2 460.1 480 447.1 480H64c-35.35 0-64-28.66-64-64V96c0-35.34 28.65-64 64-64h117.5c16.97 0 33.25 6.742 45.26 18.75L275.9 96H416c35.35 0 64 28.66 64 64v32h-48V160c0-8.824-7.178-16-16-16H256L192.8 84.69C189.8 81.66 185.8 80 181.5 80H64C55.18 80 48 87.18 48 96v288l71.16-142.3C124.6 230.8 135.7 224 147.8 224h396.2C567.7 224 583.2 249 572.6 270.3z"/></svg>
|
||||
|
After Width: | Height: | Size: 664 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M160 400C160 408.8 152.8 416 144 416C135.2 416 128 408.8 128 400V192C128 183.2 135.2 176 144 176C152.8 176 160 183.2 160 192V400zM240 400C240 408.8 232.8 416 224 416C215.2 416 208 408.8 208 400V192C208 183.2 215.2 176 224 176C232.8 176 240 183.2 240 192V400zM320 400C320 408.8 312.8 416 304 416C295.2 416 288 408.8 288 400V192C288 183.2 295.2 176 304 176C312.8 176 320 183.2 320 192V400zM317.5 24.94L354.2 80H424C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H416V432C416 476.2 380.2 512 336 512H112C67.82 512 32 476.2 32 432V128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94H317.5zM151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1C174.5 48 171.1 49.34 170.5 51.56L151.5 80zM80 432C80 449.7 94.33 464 112 464H336C353.7 464 368 449.7 368 432V128H80V432z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M234.5 5.7c13.9-5 29.1-5 43.1 0l192 68.6C495 83.4 512 107.5 512 134.6V377.4c0 27-17 51.2-42.5 60.3l-192 68.6c-13.9 5-29.1 5-43.1 0l-192-68.6C17 428.6 0 404.5 0 377.4V134.6c0-27 17-51.2 42.5-60.3l192-68.6zM256 66L82.3 128 256 190l173.7-62L256 66zm32 368.6l160-57.1v-188L288 246.6v188z"/></svg>
|
||||
|
After Width: | Height: | Size: 574 B |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
BIN
resources/icons/linux/kilroy-128.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
resources/icons/linux/kilroy-16.png
Normal file
|
After Width: | Height: | Size: 398 B |
BIN
resources/icons/linux/kilroy-256.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
resources/icons/linux/kilroy-32.png
Normal file
|
After Width: | Height: | Size: 755 B |
BIN
resources/icons/linux/kilroy-48.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
resources/icons/linux/kilroy-64.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
11
resources/icons/linux/linux-icons.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
# $1: Input path to an image to use for generating icons.
|
||||
# Helper script to generate qtk's icons for Linux given a path to an input PNG.
|
||||
sudo apt install imagemagick
|
||||
|
||||
convert "$1" -resize 256x256 kilroy-256.png
|
||||
convert "$1" -resize 128x128 kilroy-128.png
|
||||
convert "$1" -resize 64x64 kilroy-64.png
|
||||
convert "$1" -resize 48x48 kilroy-48.png
|
||||
convert "$1" -resize 32x32 kilroy-32.png
|
||||
convert "$1" -resize 16x16 kilroy-16.png
|
||||
BIN
resources/icons/osx/kilroy.icns
Normal file
BIN
resources/icons/osx/kilroy_128.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
resources/icons/osx/kilroy_16.png
Normal file
|
After Width: | Height: | Size: 512 B |
BIN
resources/icons/osx/kilroy_256.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
resources/icons/osx/kilroy_32.png
Normal file
|
After Width: | Height: | Size: 869 B |
BIN
resources/icons/osx/kilroy_48.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/icons/osx/kilroy_splash.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
15
resources/icons/osx/osx-icons.sh
Executable file
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# $1: Input path to an image to use for generating icons.
|
||||
# Helper script to generate qtk's icons for OSX given a path to an input PNG.
|
||||
sudo apt install icnsutils imagemagick
|
||||
|
||||
convert "$1" -resize 32x32 kilroy_32.png
|
||||
convert "$1" -resize 16x16 kilroy_16.png
|
||||
convert "$1" -resize 48x48 kilroy_48.png
|
||||
convert "$1" -resize 128x128 kilroy_128.png
|
||||
convert "$1" -resize 256x256 kilroy_256.png
|
||||
# For the application bundle in OSX.
|
||||
png2icns png2icns kilroy.icns kilroy_*.png
|
||||
|
||||
# For the splash image in DMG installers.
|
||||
convert "$1" -resize 800x600! kilroy_splash.png
|
||||
BIN
resources/icons/win/kilroy.ico
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
resources/icons/win/kilroy_splash.bmp
Normal file
|
After Width: | Height: | Size: 201 KiB |
10
resources/icons/win/win-icons.sh
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
# $1: Input path to an image to use for generating icons.
|
||||
# Helper script to generate qtk's icons for Windows given a path to an input PNG.
|
||||
sudo apt install imagemagick
|
||||
|
||||
# For the NSIS (un)installer executable shortcut icon.
|
||||
convert "$1" -resize 256x256,128x128,64x64,48x48,32x32,16x16 -background transparent -colors 256 kilroy.ico
|
||||
|
||||
# For the NSIS installer splash screen.
|
||||
convert "$1" -resize 164x314! -background white -flatten kilroy_splash.bmp
|
||||
21
resources/minimal_resources.qrc
Normal file
@@ -0,0 +1,21 @@
|
||||
<RCC>
|
||||
<qresource prefix="/textures">
|
||||
<file alias="crate.png">images/crate.png</file>
|
||||
<file alias="stone.png">images/stone.png</file>
|
||||
<file alias="wood.png">images/wood.png</file>
|
||||
<file>skybox/back.png</file>
|
||||
<file>skybox/bottom.png</file>
|
||||
<file>skybox/front.png</file>
|
||||
<file>skybox/left.png</file>
|
||||
<file>skybox/right.png</file>
|
||||
<file>skybox/top.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="/icons">
|
||||
<file>fontawesome-free-6.2.1-desktop/svgs/solid/cube.svg</file>
|
||||
<file>fontawesome-free-6.2.1-desktop/svgs/regular/trash-can.svg</file>
|
||||
<file>fontawesome-free-6.2.1-desktop/svgs/regular/folder-open.svg</file>
|
||||
<file>fontawesome-free-6.2.1-desktop/svgs/regular/floppy-disk.svg</file>
|
||||
<file>fontawesome-free-6.2.1-desktop/svgs/brands/git-alt.svg</file>
|
||||
<file alias="icon.png">icons/icon.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -1,55 +0,0 @@
|
||||
# Blender MTL File: 'None'
|
||||
# Material Count: 4
|
||||
|
||||
newmtl AlienHominid
|
||||
Ns 225.000000
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.800000 0.533344 0.000000
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
Ni 1.450000
|
||||
d 1.000000
|
||||
illum 2
|
||||
map_Bump normal.png
|
||||
map_Kd diffuse.png
|
||||
map_Ns roughness.png
|
||||
refl specular.png
|
||||
|
||||
newmtl Blaster
|
||||
Ns 225.000000
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.800000 0.800000 0.800000
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
Ni 1.450000
|
||||
d 1.000000
|
||||
illum 2
|
||||
map_Bump blaster_normal.png
|
||||
map_Kd blaster_diffuse.png
|
||||
map_Ke blaster_emissive.png
|
||||
map_Ns blaster_roughness.png
|
||||
refl blaster_specular.png
|
||||
|
||||
newmtl Screenshot_2021-04-19_194508
|
||||
Ns 225.000000
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.800000 0.800000 0.800000
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
Ni 1.450000
|
||||
d 1.000000
|
||||
illum 2
|
||||
map_Kd smoke.png
|
||||
map_d smoke.png
|
||||
|
||||
newmtl Untitled-1
|
||||
Ns 77.904748
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.800000 0.800000 0.800000
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
Ni 1.450000
|
||||
d 1.000000
|
||||
illum 2
|
||||
map_Kd Untitled-1.png
|
||||
map_d Untitled-1.png
|
||||
|
Before Width: | Height: | Size: 14 MiB |
|
Before Width: | Height: | Size: 455 KiB |
|
Before Width: | Height: | Size: 9.4 MiB |
|
Before Width: | Height: | Size: 5.2 MiB |
|
Before Width: | Height: | Size: 2.8 MiB |
|
Before Width: | Height: | Size: 8.8 MiB |
|
Before Width: | Height: | Size: 10 MiB |
|
Before Width: | Height: | Size: 4.0 MiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 1.8 MiB |
@@ -1,16 +0,0 @@
|
||||
# Blender MTL File: 'None'
|
||||
# Material Count: 1
|
||||
|
||||
newmtl Scene_-_Root
|
||||
Ns 225.000000
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.800000 0.800000 0.800000
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.0 0.0 0.0
|
||||
Ni 1.450000
|
||||
d 1.000000
|
||||
illum 2
|
||||
map_Kd diffuse.jpg
|
||||
map_Bump normal.png
|
||||
map_Ks specular.jpg
|
||||
|
||||
|
Before Width: | Height: | Size: 5.8 MiB |
|
Before Width: | Height: | Size: 14 MiB |
|
Before Width: | Height: | Size: 4.2 MiB |
@@ -1,3 +0,0 @@
|
||||
Model by Berk Gedik, from: https://sketchfab.com/3d-models/survival-guitar-backpack-low-poly-799f8c4511f84fab8c3f12887f7e6b36
|
||||
|
||||
Modified material assignment (Joey de Vries) for easier load in OpenGL model loading chapter, and renamed albedo to diffuse and metallic to specular to match non-PBR lighting setup.
|
||||
|
Before Width: | Height: | Size: 6.4 MiB |
@@ -1,7 +0,0 @@
|
||||
newmtl material_0
|
||||
map_bump normal.jpg
|
||||
norm normal.jpg
|
||||
map_Kd diffuse.jpg
|
||||
occlusion occlusion.jpg
|
||||
Pm 0
|
||||
Pr 0.793152
|
||||
|
Before Width: | Height: | Size: 11 MiB |
|
Before Width: | Height: | Size: 3.3 MiB |
|
Before Width: | Height: | Size: 1.7 MiB |
@@ -1,12 +0,0 @@
|
||||
# Blender v2.82 (sub 7) OBJ File: ''
|
||||
# www.blender.org
|
||||
mtllib floor.mtl
|
||||
o floor
|
||||
v -1.000000 -0.000000 1.000000
|
||||
v 1.000000 -0.000000 1.000000
|
||||
v 1.000000 0.000000 -1.000000
|
||||
v -1.000000 0.000000 -1.000000
|
||||
vn 0.0000 1.0000 0.0000
|
||||
usemtl Default_OBJ
|
||||
s off
|
||||
f 1//1 2//1 3//1 4//1
|
||||
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 254 KiB |
@@ -1,16 +0,0 @@
|
||||
# Blender MTL File: 'None'
|
||||
# Material Count: 1
|
||||
|
||||
newmtl Lion
|
||||
Ns 500.000001
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.800000 0.800000 0.800000
|
||||
Ks 0.800000 0.800000 0.800000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
Ni 1.450000
|
||||
d 1.000000
|
||||
illum 2
|
||||
map_Bump normal.jpg
|
||||
map_Kd diffuse.jpg
|
||||
map_Ns roughness.jpg
|
||||
refl specular.jpg
|
||||
|
Before Width: | Height: | Size: 484 KiB |
|
Before Width: | Height: | Size: 562 KiB |
|
Before Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 133 KiB |
@@ -1,8 +0,0 @@
|
||||
# WaveFront *.mtl file (generated by CINEMA 4D)
|
||||
|
||||
newmtl item/objectcomponents/weapon/staff_2h_artifactdeadwind_d_03.m2_Geoset_000
|
||||
Ka 0.25 0.25 0.25
|
||||
Kd 1 1 1
|
||||
map_Kd diffuse.png
|
||||
illum 7
|
||||
|
||||
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 4.0 MiB |
|
Before Width: | Height: | Size: 807 KiB |
|
Before Width: | Height: | Size: 5.9 MiB |
|
Before Width: | Height: | Size: 1.5 MiB |
|
Before Width: | Height: | Size: 614 KiB |
|
Before Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 4.8 MiB |
|
Before Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 4.5 MiB |
|
Before Width: | Height: | Size: 2.2 MiB |
|
Before Width: | Height: | Size: 885 KiB |