Cleanup
All checks were successful
Run ReCI Build Test / Explore-Gitea-Actions (push) Successful in 7m9s

This commit is contained in:
2024-11-12 11:31:18 -05:00
parent 95de887499
commit 83a9baea34
14 changed files with 226 additions and 187 deletions

2
.gitignore vendored
View File

@@ -1,2 +1,4 @@
/cmake-build-debug /cmake-build-debug
/.idea /.idea
/assets/test_files

View File

@@ -81,6 +81,7 @@ set_target_properties(JGL PROPERTIES LINKER_LANGUAGE CXX)
include_directories( include_directories(
${ReWindow_SOURCE_DIR}/include ${ReWindow_SOURCE_DIR}/include
${Event_SOURCE_DIR}/include ${Event_SOURCE_DIR}/include
${glad_SOURCE_DIR}/include
) )
target_include_directories(JGL PUBLIC target_include_directories(JGL PUBLIC
@@ -89,7 +90,6 @@ target_include_directories(JGL PUBLIC
${ReImage_SOURCE_DIR}/include ${ReImage_SOURCE_DIR}/include
${mcolor_SOURCE_DIR}/include ${mcolor_SOURCE_DIR}/include
${J3ML_SOURCE_DIR}/include ${J3ML_SOURCE_DIR}/include
${glad_SOURCE_DIR}/include
${jlog_SOURCE_DIR}/include ${jlog_SOURCE_DIR}/include
) )
@@ -97,15 +97,15 @@ add_executable(JGL_Demo main.cpp)
#set_target_properties(JGL_Demo PROPERTIES LINK_FLAGS "-Wl,-rpath,./lib") #set_target_properties(JGL_Demo PROPERTIES LINK_FLAGS "-Wl,-rpath,./lib")
if (UNIX AND NOT APPLE) if (UNIX AND NOT APPLE)
target_include_directories(JGL PRIVATE ${FREETYPE_INCLUDE_DIRS}) target_include_directories(JGL PRIVATE ${FREETYPE_INCLUDE_DIRS} )
target_link_libraries(JGL PRIVATE ${FREETYPE_LIBRARIES}) target_link_libraries(JGL PRIVATE ${FREETYPE_LIBRARIES} glad)
target_link_libraries(JGL PUBLIC ${OPENGL_LIBRARIES} mcolor J3ML glad jlog ReImage) target_link_libraries(JGL PUBLIC ${OPENGL_LIBRARIES} mcolor J3ML jlog ReImage)
endif() endif()
if (WIN32) if (WIN32)
target_include_directories(JGL PRIVATE ${freetype_SOURCE_DIR}/include) target_include_directories(JGL PRIVATE ${freetype_SOURCE_DIR}/include)
target_link_libraries(JGL PRIVATE freetype) target_link_libraries(JGL PRIVATE freetype glad)
target_link_libraries(JGL PUBLIC ${OPENGL_LIBRARIES} mcolor J3ML glad jlog ReImage) target_link_libraries(JGL PUBLIC ${OPENGL_LIBRARIES} mcolor J3ML glad jlog ReImage)
endif() endif()
target_link_libraries(JGL_Demo PUBLIC JGL ReWindowLibrary Event) target_link_libraries(JGL_Demo PUBLIC JGL ReWindowLibrary Event glad)

175
Doxyfile
View File

@@ -1,4 +1,4 @@
# Doxyfile 1.9.6 # Doxyfile 1.9.4
# This file describes the settings to be used by the documentation system # This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project. # doxygen (www.doxygen.org) for a project.
@@ -19,8 +19,7 @@
# configuration file: # configuration file:
# doxygen -x [configFile] # doxygen -x [configFile]
# Use doxygen to compare the used configuration file with the template # Use doxygen to compare the used configuration file with the template
# configuration file without replacing the environment variables or CMake type # configuration file without replacing the environment variables:
# replacement variables:
# doxygen -x_noenv [configFile] # doxygen -x_noenv [configFile]
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
@@ -42,7 +41,7 @@ DOXYFILE_ENCODING = UTF-8
# title of most generated pages and in a few other places. # title of most generated pages and in a few other places.
# The default value is: My Project. # The default value is: My Project.
PROJECT_NAME = JGL PROJECT_NAME = "Josh's Graphics Library"
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This # The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version # could be handy for archiving the generated documentation or if some version
@@ -54,21 +53,21 @@ PROJECT_NUMBER =
# for a project that appears at the top of each page and should give viewer a # for a project that appears at the top of each page and should give viewer a
# quick idea about the purpose of the project. Keep the description short. # quick idea about the purpose of the project. Keep the description short.
PROJECT_BRIEF = "Linear Algebra, Geometry, and Algorithms in C++" PROJECT_BRIEF =
# With the PROJECT_LOGO tag one can specify a logo or an icon that is included # With the PROJECT_LOGO tag one can specify a logo or an icon that is included
# in the documentation. The maximum height of the logo should not exceed 55 # in the documentation. The maximum height of the logo should not exceed 55
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
# the logo to the output directory. # the logo to the output directory.
PROJECT_LOGO = logo_light_small.png PROJECT_LOGO =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is # into which the generated documentation will be written. If a relative path is
# entered, it will be relative to the location where doxygen was started. If # entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used. # left blank the current directory will be used.
OUTPUT_DIRECTORY = . OUTPUT_DIRECTORY = "../../JGL DOXY"
# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 # If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
# sub-directories (in 2 levels) under the output directory of each output format # sub-directories (in 2 levels) under the output directory of each output format
@@ -79,14 +78,14 @@ OUTPUT_DIRECTORY = .
# control the number of sub-directories. # control the number of sub-directories.
# The default value is: NO. # The default value is: NO.
CREATE_SUBDIRS = NO CREATE_SUBDIRS = YES
# Controls the number of sub-directories that will be created when # Controls the number of sub-directories that will be created when
# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every # CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
# level increment doubles the number of directories, resulting in 4096 # level increment doubles the number of directories, resulting in 4096
# directories at level 8 which is the default and also the maximum value. The # directories at level 8 which is the default and also the maximum value. The
# sub-directories are organized in 2 levels, the first level always has a fixed # sub-directories are organized in 2 levels, the first level always has a fixed
# number of 16 directories. # numer of 16 directories.
# Minimum value: 0, maximum value: 8, default value: 8. # Minimum value: 0, maximum value: 8, default value: 8.
# This tag requires that the tag CREATE_SUBDIRS is set to YES. # This tag requires that the tag CREATE_SUBDIRS is set to YES.
@@ -568,8 +567,7 @@ HIDE_UNDOC_MEMBERS = NO
# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy. If set # undocumented classes that are normally visible in the class hierarchy. If set
# to NO, these classes will be included in the various overviews. This option # to NO, these classes will be included in the various overviews. This option
# will also hide undocumented C++ concepts if enabled. This option has no effect # has no effect if EXTRACT_ALL is enabled.
# if EXTRACT_ALL is enabled.
# The default value is: NO. # The default value is: NO.
HIDE_UNDOC_CLASSES = NO HIDE_UNDOC_CLASSES = NO
@@ -607,10 +605,9 @@ INTERNAL_DOCS = NO
# Windows (including Cygwin) and MacOS, users should typically set this option # Windows (including Cygwin) and MacOS, users should typically set this option
# to NO, whereas on Linux or other Unix flavors it should typically be set to # to NO, whereas on Linux or other Unix flavors it should typically be set to
# YES. # YES.
# Possible values are: SYSTEM, NO and YES. # The default value is: system dependent.
# The default value is: SYSTEM.
CASE_SENSE_NAMES = SYSTEM CASE_SENSE_NAMES = NO
# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
# their full class and namespace scopes in the documentation. If set to YES, the # their full class and namespace scopes in the documentation. If set to YES, the
@@ -860,14 +857,6 @@ WARN_IF_INCOMPLETE_DOC = YES
WARN_NO_PARAMDOC = NO WARN_NO_PARAMDOC = NO
# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about
# undocumented enumeration values. If set to NO, doxygen will accept
# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag
# will automatically be disabled.
# The default value is: NO.
WARN_IF_UNDOC_ENUM_VAL = NO
# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
@@ -926,21 +915,10 @@ INPUT = include \
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv # libiconv (or the iconv built into libc) for the transcoding. See the libiconv
# documentation (see: # documentation (see:
# https://www.gnu.org/software/libiconv/) for the list of possible encodings. # https://www.gnu.org/software/libiconv/) for the list of possible encodings.
# See also: INPUT_FILE_ENCODING
# The default value is: UTF-8. # The default value is: UTF-8.
INPUT_ENCODING = UTF-8 INPUT_ENCODING = UTF-8
# This tag can be used to specify the character encoding of the source files
# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
# character encoding on a per file pattern basis. Doxygen will compare the file
# name with each pattern and apply the encoding instead of the default
# INPUT_ENCODING) if there is a match. The character encodings are a list of the
# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding
# "INPUT_ENCODING" for further information on supported encodings.
INPUT_FILE_ENCODING =
# If the value of the INPUT tag contains directories, you can use the # If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories. # *.h) to filter out the source-files in the directories.
@@ -1089,11 +1067,6 @@ IMAGE_PATH =
# code is scanned, but not when the output code is generated. If lines are added # code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly. # or removed, the anchors will not be placed correctly.
# #
# Note that doxygen will use the data processed and written to standard output
# for further processing, therefore nothing else, like debug statements or used
# commands (so in case of a Windows batch file always use @echo OFF), should be
# written to standard output.
#
# Note that for custom extensions or not directly supported extensions you also # Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not # need to set EXTENSION_MAPPING for the extension otherwise the files are not
# properly processed by doxygen. # properly processed by doxygen.
@@ -1135,15 +1108,6 @@ FILTER_SOURCE_PATTERNS =
USE_MDFILE_AS_MAINPAGE = USE_MDFILE_AS_MAINPAGE =
# The Fortran standard specifies that for fixed formatted Fortran code all
# characters from position 72 are to be considered as comment. A common
# extension is to allow longer lines before the automatic comment starts. The
# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
# be processed before the automatic comment starts.
# Minimum value: 7, maximum value: 10000, default value: 72.
FORTRAN_COMMENT_AFTER = 72
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to source browsing # Configuration options related to source browsing
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
@@ -1281,11 +1245,10 @@ CLANG_DATABASE_PATH =
ALPHABETICAL_INDEX = YES ALPHABETICAL_INDEX = YES
# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) # In case all classes in a project start with a common prefix, all classes will
# that should be ignored while generating the index headers. The IGNORE_PREFIX # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
# tag works for classes, function and member names. The entity will be placed in # can be used to specify a prefix (or a list of prefixes) that should be ignored
# the alphabetical list under the first letter of the entity name that remains # while generating the index headers.
# after removing the prefix.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
IGNORE_PREFIX = IGNORE_PREFIX =
@@ -1364,15 +1327,10 @@ HTML_STYLESHEET =
# Doxygen will copy the style sheet files to the output directory. # Doxygen will copy the style sheet files to the output directory.
# Note: The order of the extra style sheet files is of importance (e.g. the last # Note: The order of the extra style sheet files is of importance (e.g. the last
# style sheet in the list overrules the setting of the previous ones in the # style sheet in the list overrules the setting of the previous ones in the
# list). # list). For an example see the documentation.
# Note: Since the styling of scrollbars can currently not be overruled in
# Webkit/Chromium, the styling will be left out of the default doxygen.css if
# one or more extra stylesheets have been specified. So if scrollbar
# customization is desired it has to be added explicitly. For an example see the
# documentation.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_EXTRA_STYLESHEET = HTML_EXTRA_STYLESHEET = ../../doxygen_theme_flat_design/src/doxygen-style.css
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note # other source files which should be copied to the HTML output directory. Note
@@ -1382,20 +1340,11 @@ HTML_EXTRA_STYLESHEET =
# files will be copied as-is; there are no commands or markers available. # files will be copied as-is; there are no commands or markers available.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_EXTRA_FILES = HTML_EXTRA_FILES = ../../doxygen_theme_flat_design/src/img/opened-folder.png \
../../doxygen_theme_flat_design/src/img/on_sync.png \
# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output ../../doxygen_theme_flat_design/src/img/off_sync.png \
# should be rendered with a dark or light theme. ../../doxygen_theme_flat_design/src/img/document.png \
# Possible values are: LIGHT always generate light mode output, DARK always ../../doxygen_theme_flat_design/src/img/closed-folder.png
# generate dark mode output, AUTO_LIGHT automatically set the mode according to
# the user preference, use light mode if no preference is set (the default),
# AUTO_DARK automatically set the mode according to the user preference, use
# dark mode if no preference is set and TOGGLE allow to user to switch between
# light and dark mode via a button.
# The default value is: AUTO_LIGHT.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE = AUTO_DARK
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to # will adjust the colors in the style sheet and background images according to
@@ -1406,7 +1355,7 @@ HTML_COLORSTYLE = AUTO_DARK
# Minimum value: 0, maximum value: 359, default value: 220. # Minimum value: 0, maximum value: 359, default value: 220.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_HUE = 220 HTML_COLORSTYLE_HUE = 337
# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
# in the HTML output. For a value of 0 the output will use gray-scales only. A # in the HTML output. For a value of 0 the output will use gray-scales only. A
@@ -1414,7 +1363,7 @@ HTML_COLORSTYLE_HUE = 220
# Minimum value: 0, maximum value: 255, default value: 100. # Minimum value: 0, maximum value: 255, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_SAT = 15
# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
# luminance component of the colors in the HTML output. Values below 100 # luminance component of the colors in the HTML output. Values below 100
@@ -1425,7 +1374,7 @@ HTML_COLORSTYLE_SAT = 100
# Minimum value: 40, maximum value: 240, default value: 80. # Minimum value: 40, maximum value: 240, default value: 80.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_GAMMA = 80 HTML_COLORSTYLE_GAMMA = 169
# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
# page will contain the date and time when the page was generated. Setting this # page will contain the date and time when the page was generated. Setting this
@@ -1695,7 +1644,7 @@ DISABLE_INDEX = NO
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_TREEVIEW = YES GENERATE_TREEVIEW = NO
# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the # When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
# FULL_SIDEBAR option determines if the side bar is limited to only the treeview # FULL_SIDEBAR option determines if the side bar is limited to only the treeview
@@ -1760,6 +1709,17 @@ HTML_FORMULA_FORMAT = png
FORMULA_FONTSIZE = 10 FORMULA_FONTSIZE = 10
# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
# generated for formulas are transparent PNGs. Transparent PNGs are not
# supported properly for IE 6.0, but are supported on all modern browsers.
#
# Note that when changing this option you need to delete any form_*.png files in
# the HTML output directory before the changes have effect.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
FORMULA_TRANSPARENT = YES
# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
# to create new LaTeX commands to be used in formulas as building blocks. See # to create new LaTeX commands to be used in formulas as building blocks. See
# the section "Including formulas" for details. # the section "Including formulas" for details.
@@ -1859,7 +1819,7 @@ MATHJAX_CODEFILE =
# The default value is: YES. # The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
SEARCHENGINE = YES SEARCHENGINE = NO
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be # When the SERVER_BASED_SEARCH tag is enabled the search engine will be
# implemented using a web server instead of a web client using JavaScript. There # implemented using a web server instead of a web client using JavaScript. There
@@ -2465,7 +2425,7 @@ HIDE_UNDOC_RELATIONS = YES
# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
# Bell Labs. The other options in this section have no effect if this option is # Bell Labs. The other options in this section have no effect if this option is
# set to NO # set to NO
# The default value is: NO. # The default value is: YES.
HAVE_DOT = YES HAVE_DOT = YES
@@ -2479,38 +2439,26 @@ HAVE_DOT = YES
DOT_NUM_THREADS = 0 DOT_NUM_THREADS = 0
# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of # When you want a differently looking font in the dot files that doxygen
# subgraphs. When you want a differently looking font in the dot files that # generates you can specify the font name using DOT_FONTNAME. You need to make
# doxygen generates you can specify fontname, fontcolor and fontsize attributes. # sure dot is able to find the font, which can be done by putting it in a
# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node, # standard location or by setting the DOTFONTPATH environment variable or by
# Edge and Graph Attributes specification</a> You need to make sure dot is able # setting DOT_FONTPATH to the directory containing the font.
# to find the font, which can be done by putting it in a standard location or by # The default value is: Helvetica.
# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
# directory containing the font. Default graphviz fontsize is 14.
# The default value is: fontname=Helvetica,fontsize=10.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" DOT_FONTNAME = Helvetica
# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can # The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a # dot graphs.
# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about # Minimum value: 4, maximum value: 24, default value: 10.
# arrows shapes.</a>
# The default value is: labelfontname=Helvetica,labelfontsize=10.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" DOT_FONTSIZE = 10
# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes # By default doxygen will tell dot to use the default font as specified with
# around nodes set 'shape=plain' or 'shape=plaintext' <a # DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a> # the path where dot can find it using this tag.
# The default value is: shape=box,height=0.2,width=0.4.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
# You can set the path where dot can find font specified with fontname in
# DOT_COMMON_ATTR and others dot attributes.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTPATH = DOT_FONTPATH =
@@ -2666,8 +2614,9 @@ DIR_GRAPH_MAX_DEPTH = 1
# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
# to make the SVG files visible in IE 9+ (other browsers do not have this # to make the SVG files visible in IE 9+ (other browsers do not have this
# requirement). # requirement).
# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, # Possible values are: png, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd,
# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and # gif, gif:cairo, gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd,
# png:cairo, png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
# png:gdiplus:gdiplus. # png:gdiplus:gdiplus.
# The default value is: png. # The default value is: png.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
@@ -2753,6 +2702,18 @@ DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0 MAX_DOT_GRAPH_DEPTH = 0
# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
# background. This is disabled by default, because dot on Windows does not seem
# to support this out of the box.
#
# Warning: Depending on the platform used, enabling this option may lead to
# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
# read).
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_TRANSPARENT = NO
# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This # files in one run (i.e. multiple -o and -T options on the command line). This
# makes dot run faster, but since only newer versions of dot (>1.8.10) support # makes dot run faster, but since only newer versions of dot (>1.8.10) support

View File

@@ -26,6 +26,7 @@
#include <J3ML/Geometry/Sphere.hpp> #include <J3ML/Geometry/Sphere.hpp>
#include <J3ML/Geometry/Capsule.hpp> #include <J3ML/Geometry/Capsule.hpp>
#include <J3ML/Geometry/Triangle2D.hpp> #include <J3ML/Geometry/Triangle2D.hpp>
#include <JGL/types/Font.h>
/// OpenGL Wrapper for rendering 2D & 3D graphics in both a 2D and 3D context. /// OpenGL Wrapper for rendering 2D & 3D graphics in both a 2D and 3D context.
namespace JGL { namespace JGL {
@@ -33,10 +34,14 @@ namespace JGL {
using namespace J3ML::Geometry; using namespace J3ML::Geometry;
[[nodiscard]] bool Init(const Vector2& window_size, float fovY, float far_plane);
/// @param window_size /// @param window_size
void Update(const Vector2& window_size); void Update(const Vector2& window_size);
inline void PurgeFontCache() { JGL::fontCache.purgeCache(); } inline void PurgeFontCache() { JGL::fontCache.purgeCache(); }
std::array<GLfloat, 16> OpenGLPerspectiveProjectionRH(float fovY, float aspect, float z_near, float z_far); std::array<GLfloat, 16> OpenGLPerspectiveProjectionRH(float fovY, float aspect, float z_near, float z_far);
/// Returns true if the graphics driver meets the requirements (GL Version & Extensions). /// Returns true if the graphics driver meets the requirements (GL Version & Extensions).
bool MeetsRequirements(); bool MeetsRequirements();
/// Drawing functions for primitive 2D Shapes. /// Drawing functions for primitive 2D Shapes.
@@ -308,9 +313,6 @@ namespace JGL {
/// Drawing functions for primitive 3D Shapes. /// Drawing functions for primitive 3D Shapes.
namespace J3D { namespace J3D {
/// Initializes internals for 3D rendering. Probably will be rethought later.
void Init(const Vector2 &window_size, float fov, float far_plane);
/// Helper function to conveniently change the Field-Of-View. /// Helper function to conveniently change the Field-Of-View.
void ChangeFOV(float fov); void ChangeFOV(float fov);

View File

@@ -14,7 +14,7 @@ extern "C" typedef struct FT_LibraryRec_* FT_Library;
namespace JGL namespace JGL
{ {
/// Initializes FreeType engine. Remember to call this during program initialization. //bool Init();
bool InitTextEngine(); bool InitTextEngine();
/// A Font class implementation. /// A Font class implementation.

View File

@@ -7,13 +7,14 @@
namespace JGL { namespace JGL {
class Bone; class Bone;
class SkeletalVertex; class SkeletalVertexAttribute;
class Skeleton; class Skeleton;
class KeyFrame; class KeyFrame;
class Animation; class Animation;
class AnimationState;
} }
class JGL::SkeletalVertex : public Vector3 { class JGL::SkeletalVertexAttribute {
private: private:
std::array<int, 4> bone_ids = { 0, 0, 0, 0 }; std::array<int, 4> bone_ids = { 0, 0, 0, 0 };
std::array<float, 4> bone_weights = { 0, 0, 0, 0 }; std::array<float, 4> bone_weights = { 0, 0, 0, 0 };
@@ -21,9 +22,9 @@ public:
[[nodiscard]] std::array<int, 4> GetAffectingBoneIDs() const; [[nodiscard]] std::array<int, 4> GetAffectingBoneIDs() const;
[[nodiscard]] std::array<float, 4> GetAffectingBoneWeights() const; [[nodiscard]] std::array<float, 4> GetAffectingBoneWeights() const;
public: public:
SkeletalVertex() = default; SkeletalVertexAttribute() = default;
/// These cannpt be longer than 4. /// These cannpt be longer than 4.
SkeletalVertex(const Vector3& rhs, const std::vector<int>& bone_ids, const std::vector<float>& bone_weights); SkeletalVertexAttribute(const std::vector<int>& ids, const std::vector<float>& weights);
}; };
class JGL::Bone { class JGL::Bone {
@@ -90,17 +91,34 @@ public:
class JGL::Animation { class JGL::Animation {
private: private:
float length; int id = -1;
// Not all animations have names.
std::string name;
float length = 0;
std::vector<KeyFrame> key_frames; std::vector<KeyFrame> key_frames;
std::vector<SkeletalVertexAttribute> vertex_attributes{};
public: public:
[[nodiscard]] float GetDuratrion() const; [[nodiscard]] float GetDuratrion() const;
[[nodiscard]] std::vector<KeyFrame> GetKeyFrames() const; [[nodiscard]] std::vector<KeyFrame> GetKeyFrames() const;
[[nodiscard]] int GetID() const;
[[nodiscard]] std::string GetName() const;
[[nodiscard]] std::vector<SkeletalVertexAttribute> GetSkeletalVertexAttributes() const;
public: public:
void AppendKeyFrame(const KeyFrame& new_key); void AppendKeyFrame(const KeyFrame& new_key);
void SetDuration(float duration); void SetDuration(float duration);
void SetID(int identifier);
void SetName(const std::string& name_id);
public: public:
explicit Animation(float duration, const std::vector<KeyFrame>& key_frames = {});
~Animation() = default; ~Animation() = default;
Animation(int id, float duration, const std::vector<KeyFrame>& key_frames, const std::vector<SkeletalVertexAttribute>& skeletal_vertex_attributes,
const std::string& name = "");
}; };
class JGL::AnimationState {
private:
int animation_id = -1;
float animation_time = 0;
public:
};

View File

@@ -38,7 +38,7 @@ public:
/// Returns the number of elements in the list. /// Returns the number of elements in the list.
[[nodiscard]] long GetLength() const; [[nodiscard]] long GetLength() const;
/// Returns the size of the data in bytes. /// Returns the size of the data in bytes.
[[nodiscard]] size_t GetSize() const; [[nodiscard]] size_t GetDataSize() const;
/** Get VBO data back from the GPU. This is *bad* because the CPU is going to wait /** Get VBO data back from the GPU. This is *bad* because the CPU is going to wait
* for the transfer to finish. Has limited use other than testing. */ * for the transfer to finish. Has limited use other than testing. */
[[nodiscard]] std::vector<GLfloat> GetDataF() const; [[nodiscard]] std::vector<GLfloat> GetDataF() const;

View File

@@ -2,8 +2,8 @@
#include <vector> #include <vector>
#include <JGL/types/VRamList.h> #include <JGL/types/VRamList.h>
#include <JGL/types/Skeleton.h>
#include <J3ML/LinearAlgebra/Vector3.hpp> #include <J3ML/LinearAlgebra/Vector3.hpp>
#include <J3ML/Geometry/Triangle.hpp>
#include <J3ML/Geometry/Sphere.hpp> #include <J3ML/Geometry/Sphere.hpp>
#include <J3ML/Geometry/AABB.hpp> #include <J3ML/Geometry/AABB.hpp>
#include <J3ML/Geometry/OBB.hpp> #include <J3ML/Geometry/OBB.hpp>
@@ -15,7 +15,7 @@ namespace JGL {
typedef Vector3 Normal; typedef Vector3 Normal;
/// 2D positions that describe how a texture is to be wrapped around a 3D object. /// 2D positions that describe how a texture is to be wrapped around a 3D object.
typedef Vector2 TextureCoordinate; typedef Vector2 TextureCoordinate;
/// A 3D model. /// Container for storing 3D models in v-ram, system memory, or both.
class VertexArray; class VertexArray;
} }
@@ -26,20 +26,21 @@ private:
protected: protected:
virtual void CreateMESphere(); virtual void CreateMESphere();
virtual void CreateMEOBB(); virtual void CreateMEOBB();
protected:
std::vector<Animation> animations{};
protected: protected:
VRamList vertices; VRamList vertices;
VRamList indices; VRamList indices;
VRamList normals; VRamList normals;
VRamList texture_coordinates; VRamList texture_coordinates;
protected: protected:
/** Intended for low quality version in system memory for calculations to be done on the CPU. /** For models which are not animated, This is intended for a low quality version in
* In some scenarios like complex collision, You'd have to loop over every vertex. * system memory for calculations to be done on the CPU. For models that are, the default pose of the model is here.
* It makes more sense for performance and memory reasons to store a *much* lower quality version in system memory.
*/ */
std::vector<Vertex> local_vertices; std::vector<Vertex> local_vertices{};
std::vector<unsigned int> local_indices; std::vector<unsigned int> local_indices{};
std::vector<TextureCoordinate> local_texture_coordinates; std::vector<TextureCoordinate> local_texture_coordinates{};
std::vector<Normal> local_normals; std::vector<Normal> local_normals{};
public: public:
/** Don't use these for anything other than drawing because the GPU is gonna spin during read-back */ /** Don't use these for anything other than drawing because the GPU is gonna spin during read-back */
[[nodiscard]] VRamList GetVertices() const; [[nodiscard]] VRamList GetVertices() const;
@@ -52,6 +53,9 @@ public:
[[nodiscard]] std::vector<unsigned int> GetLocalIndices() const; [[nodiscard]] std::vector<unsigned int> GetLocalIndices() const;
[[nodiscard]] std::vector<TextureCoordinate> GetLocalTextureCoordinates() const; [[nodiscard]] std::vector<TextureCoordinate> GetLocalTextureCoordinates() const;
[[nodiscard]] std::vector<Normal> GetLocalNormals() const; [[nodiscard]] std::vector<Normal> GetLocalNormals() const;
public:
/// Returns true if the VertexArray does not have any animations.
bool Static();
public: public:
/// Provides the minimally enclosing bounding sphere of the vertex array given information from the instance. /// Provides the minimally enclosing bounding sphere of the vertex array given information from the instance.
/// @param scale The scale of the instance. /// @param scale The scale of the instance.
@@ -80,7 +84,15 @@ public:
[[nodiscard]] AABB GetMEAABB(const Matrix4x4& instance_matrix, bool translate = false) const; [[nodiscard]] AABB GetMEAABB(const Matrix4x4& instance_matrix, bool translate = false) const;
public: public:
/// Vertices are required, Everything else is optional. /// Vertices are required, Everything else is optional.
VertexArray(const Vector3* vertex_positions, const long& vp_length, const unsigned int* vertex_indices = nullptr, const long& vi_length = 0, const Normal* vertex_normals = nullptr, const long& vn_length = 0, VertexArray(const Vertex* vertex_positions, const long& vp_length, const unsigned int* vertex_indices = nullptr, const long& vi_length = 0,
const TextureCoordinate* texture_coordinates = nullptr, const long& vt_length = 0); const Normal* vertex_normals = nullptr, const long& vn_length = 0, const TextureCoordinate* texture_coordinates = nullptr, const long& vt_length = 0);
/// Vertices are required, Everything else is optional.
explicit VertexArray(const std::vector<Vertex>& vertex_positions, const std::vector<unsigned int>& vertex_indices = {},
const std::vector<Normal>& vertex_normals = {}, const std::vector<TextureCoordinate>& texture_coordinates = {});
}; };
using namespace JGL;
static VertexArray Animate(int animation_id, float animation_time);
static VertexArray Animate(const AnimationState& anim_state);

View File

@@ -106,13 +106,10 @@ class JGLDemoWindow : public ReWindow::RWindow
public: public:
void initGL() { void initGL() {
camera = new Camera; camera = new Camera;
gladLoadGL();
if (!JGL::MeetsRequirements())
Logger::Warning("The graphics driver does not meet the minimum requirements to run this program.");
JGL::InitTextEngine(); if (!JGL::Init(getSize(), 75, 100))
JGL::Update(getSize()); Logger::Fatal("Initialization failed.");
J3D::Init(getSize(), 90, 100);
FreeSans = JGL::Font("assets/fonts/FreeSans.ttf"); FreeSans = JGL::Font("assets/fonts/FreeSans.ttf");
Jupiteroid = JGL::Font("assets/fonts/Jupiteroid.ttf"); Jupiteroid = JGL::Font("assets/fonts/Jupiteroid.ttf");
@@ -139,8 +136,8 @@ public:
void display() { void display() {
float dt = 1.f / fps; float dt = 1.f / fps;
JGL::Update(getSize()); JGL::Update(getSize());
if (fov_increasing) if (fov_increasing)
fov += 0.025; fov += 0.025;
else else

View File

@@ -9,7 +9,8 @@
#include <J3ML/Geometry/AABB.hpp> #include <J3ML/Geometry/AABB.hpp>
#include <J3ML/Geometry/Sphere.hpp> #include <J3ML/Geometry/Sphere.hpp>
#include <J3ML/Geometry/OBB.hpp> #include <J3ML/Geometry/OBB.hpp>
#include "JGL/types/VRamList.h" #include <JGL/types/VRamList.h>
#include <JGL/types/Font.h>
JGL::RenderTarget* render_target = nullptr; JGL::RenderTarget* render_target = nullptr;
GLfloat oldColor[4] = {0, 0, 0, 1}; GLfloat oldColor[4] = {0, 0, 0, 1};
@@ -30,9 +31,26 @@ bool wasBlendEnabled = false;
bool wasColorArrayEnabled = false; bool wasColorArrayEnabled = false;
GLint activeTextureUnit = 0; GLint activeTextureUnit = 0;
float j3d_far_plane = 0;
float j3d_fov = 0;
Vector2 wS;
namespace JGL { namespace JGL {
using namespace J3ML; using namespace J3ML;
Vector2 wS;
bool Init(const Vector2& window_size, float fovY, float far_plane) {
gladLoadGL();
if (!MeetsRequirements()) {
Logger::Error("The graphics driver does not meet the minimum requirements to run this program.");
return false;
}
InitTextEngine();
wS = window_size;
j3d_fov = fovY;
j3d_far_plane = far_plane;
return true;
}
void Update(const Vector2& window_size) { void Update(const Vector2& window_size) {
wS = window_size; wS = window_size;
@@ -959,17 +977,6 @@ namespace JGL {
return result; return result;
} }
bool j3d_initialized = false;
float j3d_far_plane = 0;
float j3d_fov = 0;
void J3D::Init(const J3ML::LinearAlgebra::Vector2& window_size, float fov, float far_plane) {
wS = window_size;
j3d_far_plane = far_plane;
j3d_fov = fov;
j3d_initialized = true;
}
void J3D::ChangeFOV(float fov) { void J3D::ChangeFOV(float fov) {
j3d_fov = fov; j3d_fov = fov;
} }
@@ -979,8 +986,6 @@ namespace JGL {
} }
void J3D::Begin() { void J3D::Begin() {
if (!j3d_initialized)
throw std::runtime_error("You have to run J3D::Init before rendering 3D elements.");
auto aspect = (float) wS.x / (float) wS.y; auto aspect = (float) wS.x / (float) wS.y;
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);

View File

@@ -3,7 +3,7 @@
#include <string> #include <string>
#include <iostream> #include <iostream>
#include <glad/glad.h> #include <glad/glad.h>
#include <jlog/Logger.hpp> #include <JGL/logger/logger.h>
#if __linux__ #if __linux__
#include <freetype2/ft2build.h> #include <freetype2/ft2build.h>
@@ -32,7 +32,7 @@ namespace JGL::Detail
// Keep note of this, might cause problems later? // Keep note of this, might cause problems later?
if (ft != nullptr) if (ft != nullptr)
throw std::runtime_error("Error::FREETYPE: FT_Library was initialized but is already initialized."); Logger::Fatal("Error::FREETYPE: FT_Library was initialized but is already initialized.");
if (FT_Init_FreeType(&ft)) if (FT_Init_FreeType(&ft))
return true; return true;
@@ -52,23 +52,20 @@ namespace JGL::Detail
} }
} }
namespace JGL namespace JGL {
{
bool InitTextEngine() bool InitTextEngine() {
{
return Detail::InitTextEngine(); return Detail::InitTextEngine();
} }
Font::Font(const std::filesystem::path& path) Font::Font(const std::filesystem::path& path) {
{
if (Detail::ft == nullptr) if (Detail::ft == nullptr)
throw new std::runtime_error("Error::FREETYPE: FT_Library was not initialized before attempting to load a font!"); throw std::runtime_error("Error::FREETYPE: FT_Library was not initialized before attempting to load a font!");
Font font; Font font;
if (FT_New_Face(Detail::ft, path.string().c_str(), 0, &face)) { if (FT_New_Face(Detail::ft, path.string().c_str(), 0, &face)) {
std::cout << "Error::FREETYPE: Failed to load font!" << std::endl; std::cout << "Error::FREETYPE: Failed to load font!" << std::endl;
throw new std::runtime_error("Error::FREETYPE: Failed to load font!"); throw std::runtime_error("Error::FREETYPE: Failed to load font!");
//return -1; //return -1;
} }
unsigned int newIndex = 0; unsigned int newIndex = 0;

View File

@@ -4,16 +4,15 @@
using namespace JGL; using namespace JGL;
std::array<int, 4> JGL::SkeletalVertex::GetAffectingBoneIDs() const { std::array<int, 4> JGL::SkeletalVertexAttribute::GetAffectingBoneIDs() const {
return bone_ids; return bone_ids;
} }
std::array<float, 4> JGL::SkeletalVertex::GetAffectingBoneWeights() const { std::array<float, 4> JGL::SkeletalVertexAttribute::GetAffectingBoneWeights() const {
return bone_weights; return bone_weights;
} }
JGL::SkeletalVertex::SkeletalVertex(const Vector3& rhs, const std::vector<int>& bone_ids, const std::vector<float>& bone_weights) { JGL::SkeletalVertexAttribute::SkeletalVertexAttribute(const std::vector<int>& ids, const std::vector<float>& weights) {
x = rhs.x; y = rhs.y; z = rhs.z;
if (bone_ids.size() > 4 || bone_weights.size() > 4) if (bone_ids.size() > 4 || bone_weights.size() > 4)
Logger::Fatal("Initialization of a skeletal vertex that is effected by more than 4 bones."); Logger::Fatal("Initialization of a skeletal vertex that is effected by more than 4 bones.");
@@ -52,8 +51,8 @@ std::vector<int> JGL::Bone::GetChildren() const {
return children; return children;
} }
void Bone::SetParent(int parent_id) { void Bone::SetParent(int parent_identifier) {
this->parent_id = parent_id; parent_id = parent_identifier;
} }
void Bone::AppendChild(int new_child) { void Bone::AppendChild(int new_child) {
@@ -141,9 +140,13 @@ KeyFrame::KeyFrame(const Skeleton& pose, float time_stamp) {
this->time_stamp = time_stamp; this->time_stamp = time_stamp;
} }
Animation::Animation(float duration, const std::vector<KeyFrame>& key_frames) { Animation::Animation(int id, float duration, const std::vector<KeyFrame>& key_frames, const std::vector<SkeletalVertexAttribute>& skeletal_vertex_attributes,
const std::string& name) {
length = duration; length = duration;
this->key_frames = key_frames; this->key_frames = key_frames;
this->id = id;
this->name = name;
this->vertex_attributes = skeletal_vertex_attributes;
} }
float Animation::GetDuratrion() const { float Animation::GetDuratrion() const {
@@ -161,3 +164,23 @@ void Animation::AppendKeyFrame(const KeyFrame& new_key) {
void Animation::SetDuration(float duration) { void Animation::SetDuration(float duration) {
length = duration; length = duration;
} }
int Animation::GetID() const {
return id;
}
std::string Animation::GetName() const {
return name;
}
void Animation::SetID(int identifier) {
id = identifier;
}
void Animation::SetName(const std::string& name_id) {
name = name_id;
}
std::vector<SkeletalVertexAttribute> Animation::GetSkeletalVertexAttributes() const {
return vertex_attributes;
}

View File

@@ -55,7 +55,7 @@ long JGL::VRamList::GetLength() const {
return num_elements; return num_elements;
} }
size_t JGL::VRamList::GetSize() const { size_t JGL::VRamList::GetDataSize() const {
if (element_array_buffer) if (element_array_buffer)
return sizeof(GLuint) * num_elements; return sizeof(GLuint) * num_elements;
return sizeof(GLfloat) * num_elements; return sizeof(GLfloat) * num_elements;
@@ -67,14 +67,11 @@ void JGL::VRamList::SetData(void* data, const long& length) {
if (should_resize) { if (should_resize) {
glDeleteBuffers(1, &list_handle); glDeleteBuffers(1, &list_handle);
list_handle = 0; list_handle = 0;
element_array_buffer ? load((GLuint*) data, sizeof(GLuint) * length) : load((GLfloat*) data, sizeof(GLfloat) * length);
if (!element_array_buffer)
load((GLfloat*) data, sizeof(GLfloat) * length);
else
load((GLuint*) data, sizeof(GLuint) * length);
return; return;
} }
// if (!should resize)
GLint current_buffer = 0; GLint current_buffer = 0;
GLenum buffer_type = GL_ARRAY_BUFFER; GLenum buffer_type = GL_ARRAY_BUFFER;
GLenum buffer_binding = GL_ARRAY_BUFFER_BINDING; GLenum buffer_binding = GL_ARRAY_BUFFER_BINDING;
@@ -107,14 +104,14 @@ void JGL::VRamList::UpdateData(void* data, const long& offset, const long& lengt
auto list_data = GetDataUI(); auto list_data = GetDataUI();
list_data.resize(list_data.size() + oob_delta); list_data.resize(list_data.size() + oob_delta);
memcpy(list_data.data() + (offset * sizeof(GLuint)), data, length * sizeof(GLuint)); memcpy(list_data.data() + (offset * sizeof(GLuint)), data, length * sizeof(GLuint));
SetData(list_data.data(), list_data.size()); return SetData(list_data.data(), list_data.size());
}
else {
auto list_data = GetDataF();
list_data.resize(list_data.size() + oob_delta);
memcpy(list_data.data() + (offset * sizeof(GLfloat)), data, length * sizeof(GLfloat));
SetData(list_data.data(), list_data.size());
} }
// if (!element_array_buffer)
auto list_data = GetDataF();
list_data.resize(list_data.size() + oob_delta);
memcpy(list_data.data() + (offset * sizeof(GLfloat)), data, length * sizeof(GLfloat));
return SetData(list_data.data(), list_data.size());
} }
GLint current_buffer = 0; GLint current_buffer = 0;

View File

@@ -164,3 +164,28 @@ VertexArray::VertexArray(const Vector3* vertex_positions, const long& vp_length,
} }
} }
VertexArray::VertexArray(const std::vector<Vertex>& vertex_positions, const std::vector<unsigned int>& vertex_indices,
const std::vector<Normal>& vertex_normals, const std::vector<TextureCoordinate>& texture_coordinates) {
vertices = VRamList(vertex_positions.data(), vertex_positions.size());
local_vertices = vertex_positions;
if (!vertex_indices.empty()) {
indices = VRamList(vertex_indices.data(), vertex_indices.size());
local_indices = vertex_indices;
}
if (!vertex_normals.empty()) {
normals = VRamList(vertex_normals.data(), vertex_normals.size());
local_normals = vertex_normals;
}
if (!texture_coordinates.empty()){
this->texture_coordinates = VRamList(texture_coordinates.data(), texture_coordinates.size());
local_texture_coordinates = texture_coordinates;
}
}
bool VertexArray::Static() {
return animations.empty();
}