aboutsummaryrefslogtreecommitdiffstats
path: root/dev/MinGfx
diff options
context:
space:
mode:
authorunknown <paulx161@umn.edu>2021-02-03 14:22:28 -0600
committerunknown <paulx161@umn.edu>2021-02-03 14:22:28 -0600
commit9b83919815f6a6ce5d73da1c28483970d0ca5589 (patch)
tree4558864445dccc1605e5315e0bb11c46d2018da1 /dev/MinGfx
parentAdded worksheet and support code for assignment 2 (diff)
downloadcsci4611-9b83919815f6a6ce5d73da1c28483970d0ca5589.tar
csci4611-9b83919815f6a6ce5d73da1c28483970d0ca5589.tar.gz
csci4611-9b83919815f6a6ce5d73da1c28483970d0ca5589.tar.bz2
csci4611-9b83919815f6a6ce5d73da1c28483970d0ca5589.tar.lz
csci4611-9b83919815f6a6ce5d73da1c28483970d0ca5589.tar.xz
csci4611-9b83919815f6a6ce5d73da1c28483970d0ca5589.tar.zst
csci4611-9b83919815f6a6ce5d73da1c28483970d0ca5589.zip
added dev/MinGfx/
Diffstat (limited to 'dev/MinGfx')
-rw-r--r--dev/MinGfx/.gitignore38
-rw-r--r--dev/MinGfx/CMakeLists.txt395
-rw-r--r--dev/MinGfx/LICENSE.txt2
-rw-r--r--dev/MinGfx/README.md15
-rw-r--r--dev/MinGfx/cmake/AutoBuild.cmake584
-rw-r--r--dev/MinGfx/cmake/AutoBuildNanoGUI.cmake96
-rw-r--r--dev/MinGfx/cmake/AutoBuildOpenGL.cmake47
-rw-r--r--dev/MinGfx/cmake/MessageMacros.cmake17
-rw-r--r--dev/MinGfx/cmake/MinGfxConfig.cmake.in7
-rw-r--r--dev/MinGfx/cmake/Modules/FindDoxygen.cmake1166
-rw-r--r--dev/MinGfx/cmake/Modules/FindNanoGUI.cmake62
-rw-r--r--dev/MinGfx/data/Futura_Medium_BT.ttfbin0 -> 39762 bytes
-rw-r--r--dev/MinGfx/data/teapot.obj8210
-rw-r--r--dev/MinGfx/data/test.pngbin0 -> 923834 bytes
-rw-r--r--dev/MinGfx/doc/Doxyfile.in312
-rw-r--r--dev/MinGfx/doc/DoxygenLayout.xml194
-rw-r--r--dev/MinGfx/doc/api.md64
-rw-r--r--dev/MinGfx/doc/customdoxygen.css524
-rw-r--r--dev/MinGfx/doc/footer.html21
-rw-r--r--dev/MinGfx/doc/header.html55
-rw-r--r--dev/MinGfx/doc/index.html2
-rw-r--r--dev/MinGfx/doc/installation.md200
-rw-r--r--dev/MinGfx/doc/mainpage.md27
-rw-r--r--dev/MinGfx/docs/html/aabb_8h.html117
-rw-r--r--dev/MinGfx/docs/html/aabb_8h_source.html185
-rw-r--r--dev/MinGfx/docs/html/annotated.html119
-rw-r--r--dev/MinGfx/docs/html/api.html168
-rw-r--r--dev/MinGfx/docs/html/api_8md.html87
-rw-r--r--dev/MinGfx/docs/html/bc_s.pngbin0 -> 633 bytes
-rw-r--r--dev/MinGfx/docs/html/bdwn.pngbin0 -> 139 bytes
-rw-r--r--dev/MinGfx/docs/html/bvh_8h.html111
-rw-r--r--dev/MinGfx/docs/html/bvh_8h_source.html177
-rw-r--r--dev/MinGfx/docs/html/classes.html132
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_a_a_b_b-members.html109
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_a_a_b_b.html509
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_b_v_h-members.html99
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_b_v_h.html232
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_color-members.html109
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_color.html529
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_craft_cam-members.html110
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_craft_cam.html541
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_default_shader-members.html105
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_default_shader.html465
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_light_properties-members.html99
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_light_properties.html214
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_material_properties-members.html100
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_material_properties.html232
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_gfx_math-members.html107
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_gfx_math.html591
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_graphics_app-members.html137
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_graphics_app.html1837
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_matrix4-members.html127
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_matrix4.html1240
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_mesh-members.html127
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_mesh.html1131
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_platform-members.html99
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_platform.html289
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_point2-members.html113
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_point2.html650
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_point3-members.html117
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_point3.html795
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_quaternion-members.html119
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_quaternion.html818
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_quick_shapes-members.html111
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_quick_shapes.html844
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_ray-members.html110
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_ray.html689
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_shader_program-members.html127
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_shader_program.html1202
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_text_shader-members.html102
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_text_shader.html377
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_text_shader_1_1_text_format-members.html99
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_text_shader_1_1_text_format.html213
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_texture2_d-members.html110
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_texture2_d.html540
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_uni_cam-members.html107
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_uni_cam.html482
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_vector2-members.html120
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_vector2.html841
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_vector3-members.html124
-rw-r--r--dev/MinGfx/docs/html/classmingfx_1_1_vector3.html1018
-rw-r--r--dev/MinGfx/docs/html/closed.pngbin0 -> 125 bytes
-rw-r--r--dev/MinGfx/docs/html/color_8h.html119
-rw-r--r--dev/MinGfx/docs/html/color_8h_source.html177
-rw-r--r--dev/MinGfx/docs/html/craft__cam_8h.html112
-rw-r--r--dev/MinGfx/docs/html/craft__cam_8h_source.html211
-rw-r--r--dev/MinGfx/docs/html/customdoxygen.css524
-rw-r--r--dev/MinGfx/docs/html/default__shader_8h.html122
-rw-r--r--dev/MinGfx/docs/html/default__shader_8h_source.html240
-rw-r--r--dev/MinGfx/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html146
-rw-r--r--dev/MinGfx/docs/html/dir_e68e8157741866f444e17edd764ebbae.html91
-rw-r--r--dev/MinGfx/docs/html/doc.pngbin0 -> 688 bytes
-rw-r--r--dev/MinGfx/docs/html/doxygen.css1793
-rw-r--r--dev/MinGfx/docs/html/doxygen.svg26
-rw-r--r--dev/MinGfx/docs/html/dynsections.js128
-rw-r--r--dev/MinGfx/docs/html/files.html118
-rw-r--r--dev/MinGfx/docs/html/folderclosed.pngbin0 -> 517 bytes
-rw-r--r--dev/MinGfx/docs/html/folderopen.pngbin0 -> 525 bytes
-rw-r--r--dev/MinGfx/docs/html/functions.html129
-rw-r--r--dev/MinGfx/docs/html/functions_b.html99
-rw-r--r--dev/MinGfx/docs/html/functions_c.html132
-rw-r--r--dev/MinGfx/docs/html/functions_d.html163
-rw-r--r--dev/MinGfx/docs/html/functions_e.html94
-rw-r--r--dev/MinGfx/docs/html/functions_enum.html94
-rw-r--r--dev/MinGfx/docs/html/functions_f.html126
-rw-r--r--dev/MinGfx/docs/html/functions_func.html117
-rw-r--r--dev/MinGfx/docs/html/functions_func_b.html99
-rw-r--r--dev/MinGfx/docs/html/functions_func_c.html129
-rw-r--r--dev/MinGfx/docs/html/functions_func_d.html157
-rw-r--r--dev/MinGfx/docs/html/functions_func_e.html91
-rw-r--r--dev/MinGfx/docs/html/functions_func_f.html123
-rw-r--r--dev/MinGfx/docs/html/functions_func_g.html90
-rw-r--r--dev/MinGfx/docs/html/functions_func_h.html90
-rw-r--r--dev/MinGfx/docs/html/functions_func_i.html152
-rw-r--r--dev/MinGfx/docs/html/functions_func_l.html123
-rw-r--r--dev/MinGfx/docs/html/functions_func_m.html105
-rw-r--r--dev/MinGfx/docs/html/functions_func_n.html107
-rw-r--r--dev/MinGfx/docs/html/functions_func_o.html208
-rw-r--r--dev/MinGfx/docs/html/functions_func_p.html102
-rw-r--r--dev/MinGfx/docs/html/functions_func_q.html93
-rw-r--r--dev/MinGfx/docs/html/functions_func_r.html129
-rw-r--r--dev/MinGfx/docs/html/functions_func_s.html179
-rw-r--r--dev/MinGfx/docs/html/functions_func_t.html126
-rw-r--r--dev/MinGfx/docs/html/functions_func_u.html127
-rw-r--r--dev/MinGfx/docs/html/functions_func_v.html109
-rw-r--r--dev/MinGfx/docs/html/functions_func_w.html109
-rw-r--r--dev/MinGfx/docs/html/functions_func_x.html94
-rw-r--r--dev/MinGfx/docs/html/functions_func_y.html94
-rw-r--r--dev/MinGfx/docs/html/functions_func_z.html98
-rw-r--r--dev/MinGfx/docs/html/functions_func_~.html144
-rw-r--r--dev/MinGfx/docs/html/functions_g.html90
-rw-r--r--dev/MinGfx/docs/html/functions_h.html106
-rw-r--r--dev/MinGfx/docs/html/functions_i.html158
-rw-r--r--dev/MinGfx/docs/html/functions_l.html126
-rw-r--r--dev/MinGfx/docs/html/functions_m.html108
-rw-r--r--dev/MinGfx/docs/html/functions_n.html113
-rw-r--r--dev/MinGfx/docs/html/functions_o.html211
-rw-r--r--dev/MinGfx/docs/html/functions_p.html108
-rw-r--r--dev/MinGfx/docs/html/functions_q.html93
-rw-r--r--dev/MinGfx/docs/html/functions_r.html129
-rw-r--r--dev/MinGfx/docs/html/functions_rela.html88
-rw-r--r--dev/MinGfx/docs/html/functions_s.html194
-rw-r--r--dev/MinGfx/docs/html/functions_t.html129
-rw-r--r--dev/MinGfx/docs/html/functions_u.html127
-rw-r--r--dev/MinGfx/docs/html/functions_v.html115
-rw-r--r--dev/MinGfx/docs/html/functions_vars.html248
-rw-r--r--dev/MinGfx/docs/html/functions_w.html114
-rw-r--r--dev/MinGfx/docs/html/functions_x.html96
-rw-r--r--dev/MinGfx/docs/html/functions_y.html96
-rw-r--r--dev/MinGfx/docs/html/functions_z.html98
-rw-r--r--dev/MinGfx/docs/html/functions_~.html144
-rw-r--r--dev/MinGfx/docs/html/gfxmath_8h.html113
-rw-r--r--dev/MinGfx/docs/html/gfxmath_8h_source.html172
-rw-r--r--dev/MinGfx/docs/html/globals.html140
-rw-r--r--dev/MinGfx/docs/html/globals_defs.html107
-rw-r--r--dev/MinGfx/docs/html/globals_eval.html94
-rw-r--r--dev/MinGfx/docs/html/globals_func.html97
-rw-r--r--dev/MinGfx/docs/html/globals_type.html97
-rw-r--r--dev/MinGfx/docs/html/graphics__app_8h.html113
-rw-r--r--dev/MinGfx/docs/html/graphics__app_8h_source.html358
-rw-r--r--dev/MinGfx/docs/html/index.html120
-rw-r--r--dev/MinGfx/docs/html/installation.html206
-rw-r--r--dev/MinGfx/docs/html/installation_8md.html87
-rw-r--r--dev/MinGfx/docs/html/jquery.js35
-rw-r--r--dev/MinGfx/docs/html/mainpage_8md.html87
-rw-r--r--dev/MinGfx/docs/html/matrix4_8h.html139
-rw-r--r--dev/MinGfx/docs/html/matrix4_8h_source.html286
-rw-r--r--dev/MinGfx/docs/html/menu.js51
-rw-r--r--dev/MinGfx/docs/html/menudata.js110
-rw-r--r--dev/MinGfx/docs/html/mesh_8h.html116
-rw-r--r--dev/MinGfx/docs/html/mesh_8h_source.html293
-rw-r--r--dev/MinGfx/docs/html/mingfx_8h.html120
-rw-r--r--dev/MinGfx/docs/html/mingfx_8h_source.html159
-rw-r--r--dev/MinGfx/docs/html/mingfx__config_8h.html172
-rw-r--r--dev/MinGfx/docs/html/mingfx__config_8h_source.html116
-rw-r--r--dev/MinGfx/docs/html/namespacemembers.html105
-rw-r--r--dev/MinGfx/docs/html/namespacemembers_func.html105
-rw-r--r--dev/MinGfx/docs/html/namespacemingfx.html1710
-rw-r--r--dev/MinGfx/docs/html/nav_f.pngbin0 -> 130 bytes
-rw-r--r--dev/MinGfx/docs/html/nav_g.pngbin0 -> 95 bytes
-rw-r--r--dev/MinGfx/docs/html/nav_h.pngbin0 -> 87 bytes
-rw-r--r--dev/MinGfx/docs/html/open.pngbin0 -> 115 bytes
-rw-r--r--dev/MinGfx/docs/html/opengl__headers_8h.html94
-rw-r--r--dev/MinGfx/docs/html/opengl__headers_8h_source.html139
-rw-r--r--dev/MinGfx/docs/html/pages.html93
-rw-r--r--dev/MinGfx/docs/html/platform_8h.html111
-rw-r--r--dev/MinGfx/docs/html/platform_8h_source.html161
-rw-r--r--dev/MinGfx/docs/html/point2_8h.html144
-rw-r--r--dev/MinGfx/docs/html/point2_8h_source.html191
-rw-r--r--dev/MinGfx/docs/html/point3_8h.html145
-rw-r--r--dev/MinGfx/docs/html/point3_8h_source.html211
-rw-r--r--dev/MinGfx/docs/html/quaternion_8h.html133
-rw-r--r--dev/MinGfx/docs/html/quaternion_8h_source.html222
-rw-r--r--dev/MinGfx/docs/html/quick__shapes_8h.html118
-rw-r--r--dev/MinGfx/docs/html/quick__shapes_8h_source.html283
-rw-r--r--dev/MinGfx/docs/html/ray_8h.html122
-rw-r--r--dev/MinGfx/docs/html/ray_8h_source.html202
-rw-r--r--dev/MinGfx/docs/html/search/all_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_0.js20
-rw-r--r--dev/MinGfx/docs/html/search/all_1.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_1.js8
-rw-r--r--dev/MinGfx/docs/html/search/all_10.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_10.js53
-rw-r--r--dev/MinGfx/docs/html/search/all_11.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_11.js18
-rw-r--r--dev/MinGfx/docs/html/search/all_12.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_12.js16
-rw-r--r--dev/MinGfx/docs/html/search/all_13.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_13.js16
-rw-r--r--dev/MinGfx/docs/html/search/all_14.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_14.js10
-rw-r--r--dev/MinGfx/docs/html/search/all_15.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_15.js4
-rw-r--r--dev/MinGfx/docs/html/search/all_16.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_16.js4
-rw-r--r--dev/MinGfx/docs/html/search/all_17.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_17.js5
-rw-r--r--dev/MinGfx/docs/html/search/all_18.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_18.js22
-rw-r--r--dev/MinGfx/docs/html/search/all_2.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_2.js21
-rw-r--r--dev/MinGfx/docs/html/search/all_3.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_3.js28
-rw-r--r--dev/MinGfx/docs/html/search/all_4.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_4.js5
-rw-r--r--dev/MinGfx/docs/html/search/all_5.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_5.js16
-rw-r--r--dev/MinGfx/docs/html/search/all_6.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_6.js7
-rw-r--r--dev/MinGfx/docs/html/search/all_7.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_7.js12
-rw-r--r--dev/MinGfx/docs/html/search/all_8.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_8.js28
-rw-r--r--dev/MinGfx/docs/html/search/all_9.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_9.js16
-rw-r--r--dev/MinGfx/docs/html/search/all_a.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_a.js22
-rw-r--r--dev/MinGfx/docs/html/search/all_b.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_b.js11
-rw-r--r--dev/MinGfx/docs/html/search/all_c.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_c.js40
-rw-r--r--dev/MinGfx/docs/html/search/all_d.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_d.js14
-rw-r--r--dev/MinGfx/docs/html/search/all_e.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_e.js7
-rw-r--r--dev/MinGfx/docs/html/search/all_f.html37
-rw-r--r--dev/MinGfx/docs/html/search/all_f.js18
-rw-r--r--dev/MinGfx/docs/html/search/classes_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_0.js4
-rw-r--r--dev/MinGfx/docs/html/search/classes_1.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_1.js4
-rw-r--r--dev/MinGfx/docs/html/search/classes_2.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_2.js5
-rw-r--r--dev/MinGfx/docs/html/search/classes_3.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_3.js4
-rw-r--r--dev/MinGfx/docs/html/search/classes_4.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_4.js5
-rw-r--r--dev/MinGfx/docs/html/search/classes_5.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_5.js4
-rw-r--r--dev/MinGfx/docs/html/search/classes_6.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_6.js6
-rw-r--r--dev/MinGfx/docs/html/search/classes_7.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_7.js6
-rw-r--r--dev/MinGfx/docs/html/search/classes_8.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_8.js5
-rw-r--r--dev/MinGfx/docs/html/search/classes_9.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_9.js4
-rw-r--r--dev/MinGfx/docs/html/search/classes_a.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_a.js7
-rw-r--r--dev/MinGfx/docs/html/search/classes_b.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_b.js6
-rw-r--r--dev/MinGfx/docs/html/search/classes_c.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_c.js4
-rw-r--r--dev/MinGfx/docs/html/search/classes_d.html37
-rw-r--r--dev/MinGfx/docs/html/search/classes_d.js5
-rw-r--r--dev/MinGfx/docs/html/search/close.svg31
-rw-r--r--dev/MinGfx/docs/html/search/defines_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/defines_0.js8
-rw-r--r--dev/MinGfx/docs/html/search/defines_1.html37
-rw-r--r--dev/MinGfx/docs/html/search/defines_1.js5
-rw-r--r--dev/MinGfx/docs/html/search/enums_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/enums_0.js4
-rw-r--r--dev/MinGfx/docs/html/search/enums_1.html37
-rw-r--r--dev/MinGfx/docs/html/search/enums_1.js4
-rw-r--r--dev/MinGfx/docs/html/search/enums_2.html37
-rw-r--r--dev/MinGfx/docs/html/search/enums_2.js4
-rw-r--r--dev/MinGfx/docs/html/search/enumvalues_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/enumvalues_0.js6
-rw-r--r--dev/MinGfx/docs/html/search/enumvalues_1.html37
-rw-r--r--dev/MinGfx/docs/html/search/enumvalues_1.js6
-rw-r--r--dev/MinGfx/docs/html/search/enumvalues_2.html37
-rw-r--r--dev/MinGfx/docs/html/search/enumvalues_2.js6
-rw-r--r--dev/MinGfx/docs/html/search/enumvalues_3.html37
-rw-r--r--dev/MinGfx/docs/html/search/enumvalues_3.js7
-rw-r--r--dev/MinGfx/docs/html/search/files_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_0.js5
-rw-r--r--dev/MinGfx/docs/html/search/files_1.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_1.js4
-rw-r--r--dev/MinGfx/docs/html/search/files_2.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_2.js5
-rw-r--r--dev/MinGfx/docs/html/search/files_3.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_3.js4
-rw-r--r--dev/MinGfx/docs/html/search/files_4.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_4.js5
-rw-r--r--dev/MinGfx/docs/html/search/files_5.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_5.js4
-rw-r--r--dev/MinGfx/docs/html/search/files_6.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_6.js8
-rw-r--r--dev/MinGfx/docs/html/search/files_7.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_7.js4
-rw-r--r--dev/MinGfx/docs/html/search/files_8.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_8.js6
-rw-r--r--dev/MinGfx/docs/html/search/files_9.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_9.js5
-rw-r--r--dev/MinGfx/docs/html/search/files_a.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_a.js4
-rw-r--r--dev/MinGfx/docs/html/search/files_b.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_b.js5
-rw-r--r--dev/MinGfx/docs/html/search/files_c.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_c.js5
-rw-r--r--dev/MinGfx/docs/html/search/files_d.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_d.js4
-rw-r--r--dev/MinGfx/docs/html/search/files_e.html37
-rw-r--r--dev/MinGfx/docs/html/search/files_e.js5
-rw-r--r--dev/MinGfx/docs/html/search/functions_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_0.js13
-rw-r--r--dev/MinGfx/docs/html/search/functions_1.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_1.js7
-rw-r--r--dev/MinGfx/docs/html/search/functions_10.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_10.js37
-rw-r--r--dev/MinGfx/docs/html/search/functions_11.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_11.js15
-rw-r--r--dev/MinGfx/docs/html/search/functions_12.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_12.js15
-rw-r--r--dev/MinGfx/docs/html/search/functions_13.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_13.js8
-rw-r--r--dev/MinGfx/docs/html/search/functions_14.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_14.js9
-rw-r--r--dev/MinGfx/docs/html/search/functions_15.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_15.js4
-rw-r--r--dev/MinGfx/docs/html/search/functions_16.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_16.js4
-rw-r--r--dev/MinGfx/docs/html/search/functions_17.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_17.js5
-rw-r--r--dev/MinGfx/docs/html/search/functions_18.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_18.js22
-rw-r--r--dev/MinGfx/docs/html/search/functions_2.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_2.js17
-rw-r--r--dev/MinGfx/docs/html/search/functions_3.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_3.js25
-rw-r--r--dev/MinGfx/docs/html/search/functions_4.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_4.js4
-rw-r--r--dev/MinGfx/docs/html/search/functions_5.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_5.js15
-rw-r--r--dev/MinGfx/docs/html/search/functions_6.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_6.js4
-rw-r--r--dev/MinGfx/docs/html/search/functions_7.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_7.js4
-rw-r--r--dev/MinGfx/docs/html/search/functions_8.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_8.js24
-rw-r--r--dev/MinGfx/docs/html/search/functions_9.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_9.js12
-rw-r--r--dev/MinGfx/docs/html/search/functions_a.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_a.js9
-rw-r--r--dev/MinGfx/docs/html/search/functions_b.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_b.js9
-rw-r--r--dev/MinGfx/docs/html/search/functions_c.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_c.js39
-rw-r--r--dev/MinGfx/docs/html/search/functions_d.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_d.js8
-rw-r--r--dev/MinGfx/docs/html/search/functions_e.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_e.js5
-rw-r--r--dev/MinGfx/docs/html/search/functions_f.html37
-rw-r--r--dev/MinGfx/docs/html/search/functions_f.js17
-rw-r--r--dev/MinGfx/docs/html/search/mag_sel.svg74
-rw-r--r--dev/MinGfx/docs/html/search/namespaces_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/namespaces_0.js4
-rw-r--r--dev/MinGfx/docs/html/search/nomatches.html13
-rw-r--r--dev/MinGfx/docs/html/search/pages_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/pages_0.js4
-rw-r--r--dev/MinGfx/docs/html/search/pages_1.html37
-rw-r--r--dev/MinGfx/docs/html/search/pages_1.js4
-rw-r--r--dev/MinGfx/docs/html/search/pages_2.html37
-rw-r--r--dev/MinGfx/docs/html/search/pages_2.js4
-rw-r--r--dev/MinGfx/docs/html/search/related_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/related_0.js4
-rw-r--r--dev/MinGfx/docs/html/search/search.css257
-rw-r--r--dev/MinGfx/docs/html/search/search.js816
-rw-r--r--dev/MinGfx/docs/html/search/search_l.pngbin0 -> 567 bytes
-rw-r--r--dev/MinGfx/docs/html/search/search_m.pngbin0 -> 158 bytes
-rw-r--r--dev/MinGfx/docs/html/search/search_r.pngbin0 -> 553 bytes
-rw-r--r--dev/MinGfx/docs/html/search/searchdata.js48
-rw-r--r--dev/MinGfx/docs/html/search/typedefs_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/typedefs_0.js7
-rw-r--r--dev/MinGfx/docs/html/search/variables_0.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_0.js7
-rw-r--r--dev/MinGfx/docs/html/search/variables_1.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_1.js4
-rw-r--r--dev/MinGfx/docs/html/search/variables_2.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_2.js5
-rw-r--r--dev/MinGfx/docs/html/search/variables_3.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_3.js4
-rw-r--r--dev/MinGfx/docs/html/search/variables_4.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_4.js4
-rw-r--r--dev/MinGfx/docs/html/search/variables_5.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_5.js8
-rw-r--r--dev/MinGfx/docs/html/search/variables_6.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_6.js5
-rw-r--r--dev/MinGfx/docs/html/search/variables_7.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_7.js4
-rw-r--r--dev/MinGfx/docs/html/search/variables_8.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_8.js5
-rw-r--r--dev/MinGfx/docs/html/search/variables_9.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_9.js5
-rw-r--r--dev/MinGfx/docs/html/search/variables_a.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_a.js8
-rw-r--r--dev/MinGfx/docs/html/search/variables_b.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_b.js4
-rw-r--r--dev/MinGfx/docs/html/search/variables_c.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_c.js4
-rw-r--r--dev/MinGfx/docs/html/search/variables_d.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_d.js6
-rw-r--r--dev/MinGfx/docs/html/search/variables_e.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_e.js4
-rw-r--r--dev/MinGfx/docs/html/search/variables_f.html37
-rw-r--r--dev/MinGfx/docs/html/search/variables_f.js4
-rw-r--r--dev/MinGfx/docs/html/shader__program_8h.html119
-rw-r--r--dev/MinGfx/docs/html/shader__program_8h_source.html274
-rw-r--r--dev/MinGfx/docs/html/splitbar.pngbin0 -> 283 bytes
-rw-r--r--dev/MinGfx/docs/html/stb__rect__pack_8h.html403
-rw-r--r--dev/MinGfx/docs/html/stb__rect__pack_8h_source.html742
-rw-r--r--dev/MinGfx/docs/html/structstbrp__context-members.html99
-rw-r--r--dev/MinGfx/docs/html/structstbrp__context.html265
-rw-r--r--dev/MinGfx/docs/html/structstbrp__node-members.html93
-rw-r--r--dev/MinGfx/docs/html/structstbrp__node.html157
-rw-r--r--dev/MinGfx/docs/html/structstbrp__rect-members.html96
-rw-r--r--dev/MinGfx/docs/html/structstbrp__rect.html211
-rw-r--r--dev/MinGfx/docs/html/sync_off.pngbin0 -> 814 bytes
-rw-r--r--dev/MinGfx/docs/html/sync_on.pngbin0 -> 810 bytes
-rw-r--r--dev/MinGfx/docs/html/tab_a.pngbin0 -> 124 bytes
-rw-r--r--dev/MinGfx/docs/html/tab_b.pngbin0 -> 142 bytes
-rw-r--r--dev/MinGfx/docs/html/tab_h.pngbin0 -> 147 bytes
-rw-r--r--dev/MinGfx/docs/html/tab_s.pngbin0 -> 161 bytes
-rw-r--r--dev/MinGfx/docs/html/tabs.css1
-rw-r--r--dev/MinGfx/docs/html/text__shader_8h.html117
-rw-r--r--dev/MinGfx/docs/html/text__shader_8h_source.html229
-rw-r--r--dev/MinGfx/docs/html/texture2d_8h.html112
-rw-r--r--dev/MinGfx/docs/html/texture2d_8h_source.html195
-rw-r--r--dev/MinGfx/docs/html/unicam_8h.html114
-rw-r--r--dev/MinGfx/docs/html/unicam_8h_source.html234
-rw-r--r--dev/MinGfx/docs/html/vector2_8h.html149
-rw-r--r--dev/MinGfx/docs/html/vector2_8h_source.html261
-rw-r--r--dev/MinGfx/docs/html/vector3_8h.html149
-rw-r--r--dev/MinGfx/docs/html/vector3_8h_source.html275
-rw-r--r--dev/MinGfx/docs/index.html2
-rw-r--r--dev/MinGfx/example/CMakeLists.txt166
-rw-r--r--dev/MinGfx/example/CircleViewer.cpp122
-rw-r--r--dev/MinGfx/example/CircleViewer.h77
-rw-r--r--dev/MinGfx/example/cmake/AutoBuild.cmake541
-rw-r--r--dev/MinGfx/example/cmake/AutoBuildOpenGL.cmake47
-rw-r--r--dev/MinGfx/example/cmake/MessageMacros.cmake17
-rw-r--r--dev/MinGfx/example/main-circleviewer.cpp12
-rw-r--r--dev/MinGfx/src/.gitignore2
-rw-r--r--dev/MinGfx/src/CMakeLists.txt107
-rw-r--r--dev/MinGfx/src/aabb.cc150
-rw-r--r--dev/MinGfx/src/aabb.h96
-rw-r--r--dev/MinGfx/src/bvh.cc120
-rw-r--r--dev/MinGfx/src/bvh.h106
-rw-r--r--dev/MinGfx/src/color.cc130
-rw-r--r--dev/MinGfx/src/color.h103
-rw-r--r--dev/MinGfx/src/craft_cam.cc127
-rw-r--r--dev/MinGfx/src/craft_cam.h219
-rw-r--r--dev/MinGfx/src/default_shader.cc168
-rw-r--r--dev/MinGfx/src/default_shader.h168
-rw-r--r--dev/MinGfx/src/gfxmath.cc82
-rw-r--r--dev/MinGfx/src/gfxmath.h81
-rw-r--r--dev/MinGfx/src/graphics_app.cc467
-rw-r--r--dev/MinGfx/src/graphics_app.h481
-rw-r--r--dev/MinGfx/src/matrix4.cc445
-rw-r--r--dev/MinGfx/src/matrix4.h260
-rw-r--r--dev/MinGfx/src/mesh.cc651
-rw-r--r--dev/MinGfx/src/mesh.h337
-rw-r--r--dev/MinGfx/src/mingfx.h46
-rw-r--r--dev/MinGfx/src/mingfx_config.h.in25
-rw-r--r--dev/MinGfx/src/opengl_headers.h48
-rw-r--r--dev/MinGfx/src/platform.cc78
-rw-r--r--dev/MinGfx/src/platform.h83
-rw-r--r--dev/MinGfx/src/point2.cc104
-rw-r--r--dev/MinGfx/src/point2.h112
-rw-r--r--dev/MinGfx/src/point3.cc144
-rw-r--r--dev/MinGfx/src/point3.h154
-rw-r--r--dev/MinGfx/src/quaternion.cc260
-rw-r--r--dev/MinGfx/src/quaternion.h142
-rw-r--r--dev/MinGfx/src/quick_shapes.cc727
-rw-r--r--dev/MinGfx/src/quick_shapes.h254
-rw-r--r--dev/MinGfx/src/ray.cc313
-rw-r--r--dev/MinGfx/src/ray.h167
-rw-r--r--dev/MinGfx/src/shader_program.cc389
-rw-r--r--dev/MinGfx/src/shader_program.h238
-rw-r--r--dev/MinGfx/src/shaders/default.frag76
-rw-r--r--dev/MinGfx/src/shaders/default.vert39
-rw-r--r--dev/MinGfx/src/shaders/fullscreen.frag23
-rw-r--r--dev/MinGfx/src/shaders/fullscreen.vert24
-rw-r--r--dev/MinGfx/src/shaders/text.frag25
-rw-r--r--dev/MinGfx/src/shaders/text.vert28
-rw-r--r--dev/MinGfx/src/stb_rect_pack.h624
-rw-r--r--dev/MinGfx/src/text_shader.cc238
-rw-r--r--dev/MinGfx/src/text_shader.h110
-rw-r--r--dev/MinGfx/src/texture2d.cc232
-rw-r--r--dev/MinGfx/src/texture2d.h139
-rw-r--r--dev/MinGfx/src/unicam.cc317
-rw-r--r--dev/MinGfx/src/unicam.h256
-rw-r--r--dev/MinGfx/src/vector2.cc185
-rw-r--r--dev/MinGfx/src/vector2.h186
-rw-r--r--dev/MinGfx/src/vector3.cc206
-rw-r--r--dev/MinGfx/src/vector3.h273
-rw-r--r--dev/MinGfx/tests/blank_window/CMakeLists.txt41
-rw-r--r--dev/MinGfx/tests/blank_window/main.cc25
-rw-r--r--dev/MinGfx/tests/gui_plus_opengl/CMakeLists.txt44
-rw-r--r--dev/MinGfx/tests/gui_plus_opengl/gui_plus_opengl.cc374
-rw-r--r--dev/MinGfx/tests/gui_plus_opengl/gui_plus_opengl.h96
-rw-r--r--dev/MinGfx/tests/gui_plus_opengl/main.cc25
522 files changed, 72917 insertions, 0 deletions
diff --git a/dev/MinGfx/.gitignore b/dev/MinGfx/.gitignore
new file mode 100644
index 0000000..c544088
--- /dev/null
+++ b/dev/MinGfx/.gitignore
@@ -0,0 +1,38 @@
+*.DS_Store
+
+# Prerequisites
+*.d
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+*.smod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+
+# Build
+build
+external
+src/external
diff --git a/dev/MinGfx/CMakeLists.txt b/dev/MinGfx/CMakeLists.txt
new file mode 100644
index 0000000..e3da874
--- /dev/null
+++ b/dev/MinGfx/CMakeLists.txt
@@ -0,0 +1,395 @@
+# Copyright (c) 2017,2018 Regents of the University of Minnesota.
+# All rights reserved.
+#
+# Original Author(s) of this File:
+# Daniel Keefe, Jan 2018, University of Minnesota -- This build system is inspired by
+# the AUTOBUILD_DEPENDENCY approach I developed for the MinVR Open Source project.
+# Tom Sgouros (Brown Univ.) and Dan Orban (Univ. of Minn.) also contributed to earlier
+# versions of MinVR's build system and the use of cmake in other research software used
+# in the IV/LAB. So, this is also at least loosly inspired by their contributions.
+# See minvr.org for a full list of contributors to that project.
+#
+# Author(s) of Significant Updates/Modifications to the File:
+# ...
+
+
+
+
+#### BASIC PROJECT SETUP ####
+
+# Depends on cmake 3.9+ for its more advanced FindOpenGL.cmake module
+cmake_minimum_required (VERSION 3.9)
+
+# Search path for cmake support scripts
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
+
+# Version is <major>.<minor>.<patch>
+cmake_policy(SET CMP0048 NEW) # Required for setting version number as part of the project() command
+project(MinGfx_Toolkit VERSION 1.0.0)
+
+# This will be appended to the install destinations so that multiple versions of MinGfx
+# can be safely installed on the same system. This intentionally does not include a
+# patch number because patches should be small changes that do not change the API.
+set(MINGFX_VERSION_STR -${MinGfx_Toolkit_VERSION_MAJOR}.${MinGfx_Toolkit_VERSION_MINOR})
+
+# Organize folder structure for Xcode, Visual Studio, etc.
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+
+# For better formatting of output while configuring with cmake
+include(MessageMacros)
+
+# If you "autobuild" external dependencies as part of the cmake configure process, then they will be
+# downloaded to this directory.
+set(AUTOBUILD_DOWNLOAD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external" CACHE STRING "Location for external project sources downloaded by AutoBuild.")
+
+
+set(CMAKE_INSTALL_MESSAGE ALWAYS)
+
+include(AutoBuild)
+AutoBuild_init()
+
+
+#### ADJUST NAMES OF OUTPUT FILES BASED ON BUILD TYPE ####
+
+h1("CONFIGURING BUILD TYPES")
+
+# To distinguish between debugging, release, and other builds, we'll
+# add a postfix to the name of the lib or exe that we generate.
+
+set(CMAKE_DEBUG_POSTFIX "d")
+set(CMAKE_RELEASE_POSTFIX "")
+set(CMAKE_RELWITHDEBINFO_POSTFIX "rd")
+set(CMAKE_MINSIZEREL_POSTFIX "s")
+
+if (CMAKE_BUILD_TYPE MATCHES "Release")
+ set(CMAKE_BUILD_POSTFIX "${CMAKE_RELEASE_POSTFIX}")
+elseif (CMAKE_BUILD_TYPE MATCHES "MinSizeRel")
+ set(CMAKE_BUILD_POSTFIX "${CMAKE_MINSIZEREL_POSTFIX}")
+elseif (CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo")
+ set(CMAKE_BUILD_POSTFIX "${CMAKE_RELWITHDEBINFO_POSTFIX}")
+elseif (CMAKE_BUILD_TYPE MATCHES "Debug")
+ set(CMAKE_BUILD_POSTFIX "${CMAKE_DEBUG_POSTFIX}")
+else()
+ set(CMAKE_BUILD_POSTFIX "")
+endif()
+
+
+
+
+#### SETUP DIRECTORIES FOR BUILDING AND INSTALLING ####
+
+h1("CONFIGURING BUILD/INSTALL LOCATIONS")
+
+h2("Configuring build directories.")
+
+message(STATUS "Tests, other binaries: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
+message(STATUS "Libraries: ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
+
+
+h2("Configuring installation directories.")
+if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "default install path" FORCE )
+endif()
+
+# When we autobuild dependencies, we install them in CMAKE_INSTALL_PREFIX, and then look for them
+# there using find_package(). So, this makes sure the install prefix is in the path that
+# find_package() searches.
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_INSTALL_PREFIX})
+list(APPEND CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX})
+
+# These are relative to ${CMAKE_INSTALL_PREFIX}
+set(INSTALL_BIN_DEST bin)
+set(INSTALL_LIB_DEST lib/MinGfx${MINGFX_VERSION_STR})
+set(INSTALL_INCLUDE_DEST include/MinGfx${MINGFX_VERSION_STR})
+set(INSTALL_SHADERS_DEST share/MinGfx${MINGFX_VERSION_STR}/shaders)
+set(INSTALL_DATA_DEST share/MinGfx${MINGFX_VERSION_STR}/data)
+set(INSTALL_DOC_DEST share/MinGfx${MINGFX_VERSION_STR}/docs)
+set(INSTALL_CMAKECONFIG_DEST lib/cmake/MinGfx${MINGFX_VERSION_STR})
+
+message(STATUS "Tests, other binaries: ${CMAKE_INSTALL_PREFIX}/${INSTALL_BIN_DEST}")
+message(STATUS "MinGfx library: ${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DEST}")
+message(STATUS "MinGfx header files: ${CMAKE_INSTALL_PREFIX}/${INSTALL_INCLUDE_DEST}")
+message(STATUS "MinGfx shader programs: ${CMAKE_INSTALL_PREFIX}/${INSTALL_SHADERS_DEST}")
+message(STATUS "MinGfx data files: ${CMAKE_INSTALL_PREFIX}/${INSTALL_DATA_DEST}")
+message(STATUS "MinGfx documentation files: ${CMAKE_INSTALL_PREFIX}/${INSTALL_DOC_DEST}")
+message(STATUS "CMake Config Package for including MinGfx in other projects: ${CMAKE_INSTALL_PREFIX}/${INSTALL_CMAKECONFIG_DEST}")
+
+# Configure a header file to pass some of the CMake settings to the source code
+configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/mingfx_config.h.in
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/mingfx_config.h
+)
+
+
+#### SET ANY COMPILER FLAGS ####
+
+h1("CONFIGURING COMPLIER FLAGS")
+
+
+
+message(STATUS "Building for " ${CMAKE_SYSTEM_NAME} ".")
+message(STATUS "Compiler supported features = ${CMAKE_CXX_COMPILE_FEATURES}")
+
+
+# Linux specific
+if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+ add_definitions(-DLINUX)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
+endif()
+
+
+# Apple specific
+if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+ add_definitions(-DOSX)
+
+ # Since for some stupid reason Apple has now deprecated OpenGL
+ #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated")
+ add_definitions(-DGL_SILENCE_DEPRECATION)
+
+ # RPATH settings, see https://cmake.org/Wiki/CMake_RPATH_handling
+ set(CMAKE_MACOSX_RPATH ON)
+
+ # use, i.e. don't skip the full RPATH for the build tree
+ SET(CMAKE_SKIP_BUILD_RPATH FALSE)
+
+ # when building, don't use the install RPATH already
+ # (but later on when installing)
+ SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+
+ SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+
+ # add the automatically determined parts of the RPATH
+ # which point to directories outside the build tree to the install RPATH
+ SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+
+ # the RPATH to be used when installing, but only if it's not a system directory
+ LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
+ IF("${isSystemDir}" STREQUAL "-1")
+ SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+ ENDIF("${isSystemDir}" STREQUAL "-1")
+
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
+endif()
+
+
+# Windows specific
+if (WIN32)
+ add_definitions(-DWIN32)
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Z7")
+endif()
+
+
+
+
+#### DEFINE THE LIBRARY WE WANT TO BUILD ####
+
+h1("CONFIGURING LIBMINGFX")
+
+h2("Configuring core library source.")
+message(STATUS "Adding src to the build.")
+
+# Intentionally using include() rather than add_subdirectory() so that the MinGfx target
+# is defined in the scope of this CMakeLists.txt file. That way, sudirs that depend
+# upon it can list it as a dependency.
+include(src/CMakeLists.txt)
+
+
+
+
+#### DEFINE ADDITIONAL BUILD TARGETS, LIKE TEST PROGRAMS, ETC. ####
+
+h1("CONFIGURING PROGRAMS AND DATA")
+
+h2("Cofiguring test programs.")
+message(STATUS "Adding all subirectories of tests to the build.")
+add_subdirectory(tests/blank_window)
+add_subdirectory(tests/gui_plus_opengl)
+
+
+h2("Cofiguring data.")
+message(STATUS "Identifying data to install.")
+install(
+ DIRECTORY data/
+ DESTINATION ${INSTALL_DATA_DEST}
+)
+
+
+
+#### OPTIONALLY, BUILD DOXYGEN-STYLE DOCUMENTATION ####
+
+h1("CONFIGURING DOCUMENTATION")
+
+h2("Configuring Web-Based Documentation.")
+option(WITH_DOCUMENTATION "Builds web-based documentation for the library. (Requires doxygen)")
+if (WITH_DOCUMENTATION)
+ message(STATUS "ON: Will build and install MinGfx Web-Based Documentation.")
+else()
+ message(STATUS "OFF: NOT building MinGfx Web-Based Documentation.")
+endif()
+
+if (WITH_DOCUMENTATION)
+ find_package(Doxygen)
+ if(NOT DOXYGEN_FOUND)
+ message(FATAL_ERROR "Doxygen is needed to build the documentation.")
+ endif()
+
+ set(DOXY_FILES
+ doc/Doxyfile.in
+ doc/api.md
+ doc/installation.md
+ doc/mainpage.md
+ doc/header.html
+ doc/index.html
+ doc/footer.html
+ doc/customdoxygen.css
+ )
+
+ set(OTHER_DOCS
+ README.md
+ LICENSE.txt
+ )
+
+ # Process the config file and put it in the build directory.
+ set(DOXYFILE_IN ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in)
+ set(DOXYFILE ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
+ configure_file(${DOXYFILE_IN} ${DOXYFILE} @ONLY)
+
+ add_custom_target(doc ALL
+ ${DOXYGEN_EXECUTABLE} ${DOXYFILE}
+ DEPENDS ${DOXY_FILES} ${OTHER_DOCS}
+ SOURCES ${DOXY_FILES} ${OTHER_DOCS}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMENT "Generating documentation with Doxygen"
+ VERBATIM
+ )
+
+ set_source_files_properties(${DOXY_FILES} PROPERTIES HEADER_FILE_ONLY TRUE)
+ source_group("Doxygen Files" FILES ${DOXY_FILES})
+
+ set_source_files_properties(${OTHER_DOCS} PROPERTIES HEADER_FILE_ONLY TRUE)
+ source_group("Other Docs" FILES ${OTHER_DOCS})
+
+ install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html
+ DESTINATION ${INSTALL_DOC_DEST}
+ COMPONENT Docs
+ OPTIONAL
+ )
+
+ install(FILES doc/index.html
+ DESTINATION ${INSTALL_DOC_DEST}
+ COMPONENT Docs
+ OPTIONAL
+ )
+endif()
+
+
+
+
+
+#### CREATE/INSTALL A CMAKE CONFIG PACKAGE TO HELP OTHERS LINK TO THE LIBRARY ####
+
+h1("WRITING CMAKE CONFIG PACKAGE")
+
+# The documentation for setting this up is so bad. These pages all helped. My current
+# understanding (dfk) is summarized below to help others.
+# https://cmake.org/cmake/help/git-master/manual/cmake-packages.7.html#creating-packages
+# https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#target-usage-requirements
+# http://foonathan.net/blog/2016/03/03/cmake-install.html
+# https://archive.fosdem.org/2013/schedule/event/moderncmake/attachments/slides/258/export/events/attachments/moderncmake/slides/258/cmake_fosdem_2013.pdf
+
+# CMake Package Config in a Nutshell:
+
+# CMake config packages are the newer, recommended way of distributing projects built with CMake.
+# They replace the older FindModule.cmake approach for including dependencies in a cmake project,
+# but not everyone has yet switched over to the new approach. Both styles can work together, and
+# this seems to often be required because many libraries are not yet distributing a *Config.cmake
+# file with their install tree.
+
+
+# 1. The Difference Between "Find Modules" (Find*.cmake) and "Config Packages" (*Config.cmake)
+
+# Whereas, Find*.cmake files are either installed on the system or written by downstream projects.
+# *Config.cmake files are created and installed by the upstream projects (e.g., we want generate
+# MinVRConfig.cmake and install it whenever the MinVR project in installed).
+
+# When you use a Find Module, it defines several variables (e.g., OPENGL_INCLUDE_DIR, OPENGL_LIBRARIES)
+# that you must then be sure to add to the include dirs and libs to link with your project.
+# Config Packages are different. Instead, they "export" the targets defined in the original project
+# (e.g., the target MinGfx is used in this file to build libMinGfx.a) so that the client project
+# may refer to these targets directly. This is pretty cool because we can define the MinGfx target
+# in such a way that cmake even knows which header files are associated with it, and will add the
+# required include flags whenever the MinGfx target is used.
+
+
+# 2. How to use Config Packages in a client CMakeLists.txt
+
+# With the config package appraoch, client projects only need to include two lines to use our library:
+
+# find_package(MinGfx REQUIRED)
+# ... then, after add_executable(${PROJECT_NAME}) or add_library(${PROJECT_NAME})
+# target_link_libraries(${PROJECT_NAME} PUBLIC MinGfx)
+
+
+# 3. Finding *Config.cmake files
+
+# Config packages are files of the form MyProjNameConfig.cmake (or *-config.cmake). Each library
+# provides and installs its own config package. So, here we will create one to install with MinGfx.
+# If created correctly, these packages can be relocatable, i.e., not specific to the install path
+# used on a particular machine. When you call find_package(...) cmake looks for packages in a
+# variety of locations (e.g., /usr/local/lib/cmake/*).
+
+# Since config packages are supposed to be written by and installed by the upstream dependencies,
+# my understanding is that you should not attempt to write you own version of a config package if
+# you encounter a project that is not (yet) using the config package appraoch. Instead, use the
+# older Find Module appraoch. If CMake ships with a Find*.cmake file for that project, then use
+# it. If not, then you can write your own. Since making this switch, many of the newer
+# Find*.cmake scripts that ship with CMake have been updated to support imported targets. They
+# are still called something like FindOpenGL.cmake, but in addition to just setting vars like
+# OPENGL_INCLUDE_DIR, they also define targets, such as OpenGL::GL. We use these when we can
+# because they are more robust. When you do target_link_libraries(myproj PULBIC OpenGL::GL)
+# cmake knows to not only link with the the opengl library but also to include its headers and
+# link with all dependencies.
+
+
+# This tells cmake to generate a MinGfxTargets.cmake file that works for importing all targets
+# associated with the MinGfx export group from the install tree. This file is where all the
+# important cmake magic happens. It is auto-generated. This call also installs the file to
+# the appropriate location.
+install(EXPORT MinGfxTargets
+ NAMESPACE MinGfx::
+ FILE MinGfxTargets.cmake
+ DESTINATION ${INSTALL_CMAKECONFIG_DEST}
+)
+
+# This is a very small wrapper around the MinGfxTargets.cmake file. It's possible to use this
+# configure_file() command to replace variables (e.g., special defines, install paths) in the
+# file, but we do not currently need that functionality.
+configure_file(
+ cmake/MinGfxConfig.cmake.in
+ "${CMAKE_CURRENT_BINARY_DIR}/cmake/MinGfxConfig.cmake"
+ COPYONLY
+)
+
+# This auto-generates a standard CMake config version file. Using this, client projects can
+# check to see if a specific version of MinGfx is installed on the system.
+include(CMakePackageConfigHelpers)
+set_property(TARGET MinGfx PROPERTY VERSION ${MinGfx_Toolkit_VERSION})
+write_basic_package_version_file(
+ "${CMAKE_CURRENT_BINARY_DIR}/cmake/MinGfxConfigVersion.cmake"
+ VERSION ${MinGfx_Toolkit_VERSION}
+ COMPATIBILITY AnyNewerVersion
+)
+
+# The two Config files also get installed
+install(
+ FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/cmake/MinGfxConfig.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/cmake/MinGfxConfigVersion.cmake"
+ DESTINATION
+ "${INSTALL_CMAKECONFIG_DEST}"
+)
+
+
+AutoBuild_check_status()
+
diff --git a/dev/MinGfx/LICENSE.txt b/dev/MinGfx/LICENSE.txt
new file mode 100644
index 0000000..c245f5c
--- /dev/null
+++ b/dev/MinGfx/LICENSE.txt
@@ -0,0 +1,2 @@
+Copyright (c) 2017,2018 Dr. Daniel Keefe and Regents of the University of Minnesota.
+All Rights Reserved.
diff --git a/dev/MinGfx/README.md b/dev/MinGfx/README.md
new file mode 100644
index 0000000..c752eec
--- /dev/null
+++ b/dev/MinGfx/README.md
@@ -0,0 +1,15 @@
+# MinGfx Toolkit
+
+*Quick Links:*
+* [Documentation Main Page](https://ivlab.github.io/MinGfx/index.html)
+
+* [libMinGfx Installation Guide](https://ivlab.github.io/MinGfx/installation.html)
+* [Creating Your Own Graphics Program by Copying an Example](https://ivlab.github.io/MinGfx/installation.html#example)
+* [API Organized by Topic](https://ivlab.github.io/MinGfx/api.html)
+* [Source on GitHub](https://github.com/ivlab/MinGfx)
+
+
+*Project Overview:*
+The MinGfx Toolkit is a minimal library for writing cross-platform (Windows, OSX, linux) graphics programs with modern OpenGL 3.3+ support. Application programmers should subclass from MinGfx::GraphicsApp, which provides callbacks for several styles of rendering and user interfaces. On-screen graphical user interfaces can be created with built-in support for NanoGUI. 2D vector graphics rendering is supported by linking with NanoVG. 3D graphics rendering is supported via MinGfx::Mesh, MinGfx::Shader, MinGfx::Texture2D, and related classes. Additionally, application programmers can do whatever custom 2D or 3D rendering is needed with direct calls to OpenGL.
+
+The library is maintained by Prof. Daniel Keefe (dfk@umn.edu) and is used for instructional purposes in UMN computer science courses (CSci-4611, CSci-3081W, ...) as well as some research projects. See LICENSE.txt for additional details.
diff --git a/dev/MinGfx/cmake/AutoBuild.cmake b/dev/MinGfx/cmake/AutoBuild.cmake
new file mode 100644
index 0000000..977c91c
--- /dev/null
+++ b/dev/MinGfx/cmake/AutoBuild.cmake
@@ -0,0 +1,584 @@
+# Author: Daniel F. Keefe
+# Copyright 2017,2018, Daniel F. Keefe and Regents of the University of Minnesota
+# All Rights Reserved.
+
+
+# OVERVIEW / INTENT: AutoBuild is a series of CMake macros and functions for working with sub-projects that are dependencies of a main project. We assume that both the main project and dependencies each build with CMake already. AutoBuild manages the process of checking to see if the dependencies are already available, installed on the system. If not, AutoBuild will automatically download, build, and install the dependencies for you as part of the CMake Configure process.
+
+# WHY IS THIS NEEDED / USEFUL?: AutoBuild is similar in spirit to CMake's ExternalProject_add() command. In fact, AutoBuild uses that command internally. However, there is a key difference between AutoBuild and ExternalProject_add(). With ExternalProject_add() there is a chicken-and-the-egg problem. ExternalProject_add() doesn't download and build the external project until after CMake has finished running and you are building your actual code using Unix Makefiles, Visual Studio, or Xcode. This means the dependency does not exist on disk until CMake has finished running, and, thus, there is no way to use CMake's find_package() routines to find the dependency. You can still make your project link with the dependency, but you have to hardcode paths to tell CMake where it will exist after it is built rather than find it already installed on the system. If you want to only build the dependency if it is not already found on the system, then this means you need to maintain two ways of linking with the dependency in your CMakeLists.txt, using one approach when the dependency is found already installed and using another approach (hardcoded paths with ExternalProject_add()) when it is not found. The hardcoded paths can get a bit complex when working with cross-platform code, and this is precisely what CMake's find_package() is supposed to handle, so it is a bit annoying that it cannot be used in this case.
+
+# HOW IT WORKS: AutoBuild takes a different approach where the goal is for our project's CMakeLists.txt file to always use the same approach to link with a dependency. If the dependency is found on the system, then we go ahead and link with it right away. If it is not found, then rather than scheduling it to be built as part of the build process for our own project, we "pause" our build for a moment to download, build, and install the dependency. Then, once the dependency has been installed, we try again to find it using find_package(), which should always succeed since we just did the install, and continue on building our program.
+
+# LIMITATIONS: Handling dependencies is a hard problem, and this "AutoBuild" strategy is not without its own limitations. For example, a complication arises when using the CMake GUI. When using the CMake GUI, users expect to be able to set the CMAKE_INSTALL_PREFIX interactively after pressing Configure once to bring up all the available options. So, there is a problem if we build and install dependency projects during this first run of CMake Configure -- the user will not yet have had a chance to set CMAKE_INSTALL_PREFIX before the dependency projects are installed, and they may be installed to an undesirable location. AutoBuild addresses this by running a status check at the end of the CMake Configure step. The first time the status check detects that a dependency project should be "auto-built", it prints an informative error message, reminding the user to set CMAKE_INSTALL_PREFIX and then re-run CMake Configure to actually do the download, build, and install steps for each dependency. This seems to be a good match for CMake's GUI mode because it also allows the user to check other related settings (e.g., turning off autobuild for specific projects, forcing autobuild even if the dependency is found on the system, setting the directory to use for downloading projects).
+
+# RUNNING FROM A SCRIPT: When running from the command line or a script, the error-the-first-time-an-autobuild-is-scheduled behavior described above is typically not desired. In this case, users should already be setting CMAKE_INSTALL_PREFIX and any other desired CMake flags on the command line so it is fine to run the autobuilds immediately. To do this, simply run cmake with the following command line argument: -DAUTOBUILD_EXECUTE_NOW=ON
+
+
+# USAGE: WHAT TO ADD TO YOUR CMAKELISTS.TXT FILE TO USE AUTOBUILD:
+
+# Edit 1: Add two calls to your main CMakeLists.txt:
+
+# 1a. Near the top of the file include AutoBuild and call init, like so:
+# include(AutoBuild)
+# AutoBuild_init()
+
+# 1b. At the end of the file call:
+# AutoBuild_check_status()
+
+
+# Edit 2: For each target you wish to link with an external dependency, add a use_package() call right after you
+# define the target with add_library() or add_executable. If the dependency you wish to link with uses
+# modern CMake Config Packages, then the generic AutoBuild_use_package() call is all that is needed.
+# For example, to link my-program with the MinVR library, add the following to the CMakeLists.txt file
+# where you define the my-program target with add_executable:
+
+# add_execuatable(my-program ${SOURCEFILES})
+# AutoBuild_use_package(MinVR . my-program PUBLIC MinVR::MinVR
+# DOWNLOAD_ARGS GIT_REPOSITORY https://github.com/MinVR/MinVR.git GIT_TAG beta
+# )
+
+# Since CMake Config Packages are relatively new and very complex, so not every package provides one
+# (or a correct one). In these cases, the generic AutoBuild_use_package() will not work, and we have
+# to write a version of that is specific to the project we wish to add as a dependency. For example,
+# in order to link with GLFW, which does not provide a ConfigGLFW.cmake file, we must write a
+# GLFW-specific version of AutoBuild_use_package() and then use it like so:
+
+# include(AutoBuildGLFW)
+# AutoBuild_use_package_GLFW(my-program PUBLIC)
+
+# GLFW is one of the first examples in this style, so it is included in the AutoBuild repo. If the
+# repo does not already include an AutoBuild<package-name>.cmake script, then copy an existing
+# example, modify it to work for the package of interest, and once it is working, push it back to
+# the AutoBuild repo so others can benefit as well.
+
+
+
+
+
+
+
+# Usage:
+# AutoBuild_init()
+# Call this one time in your main CMakeLists.txt script somewhere near the beginning of the file.
+macro(AutoBuild_init)
+ message(STATUS "AutoBuild: Initializing.")
+
+ option(AUTOBUILD_DEPENDENCIES "This is a global option that turns on/off the AutoBuild functionality. It is also possible to turn on/off autobuilding for specific packages via variables of the form AUTOBUILD_PACKAGE_<NAME>." ON)
+
+ set(AUTOBUILD_DOWNLOAD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external" CACHE STRING "Location for external project sources downloaded by AutoBuild." )
+endmacro()
+
+
+
+
+
+
+# Usage:
+# AutoBuild_check_status()
+# Call this one time in your main CMakeLists.txt script somewhere near the end of the file.
+macro(AutoBuild_check_status)
+ message(STATUS "AutoBuild: Checking status...")
+
+ # Report status to the user, and if we detected dependencies to autobuild, stop with a
+ # cmake error to give the user a chance to adjust config options, such as the
+ # CMAKE_INSTALL_PREFIX and overriding AUTOBUILD_<PROJNAME> on a case-by-case basis if
+ # needed. Assuming all looks good, we will then download, build, and install each
+ # dependency that we need the next time CMake Configure is run.
+
+ set(PREFIX "AUTOBUILD_PACKAGE_")
+ get_cmake_property(ALLVARS VARIABLES)
+ string(REGEX MATCHALL "(^|;)${PREFIX}[A-Za-z0-9_]*" MATCHED_VARS "${ALLVARS}")
+
+ if (NOT "${MATCHED_VARS}" STREQUAL "")
+ message(STATUS "AutoBuild: Status check for each dependency linked using AutoBuild:")
+
+ set(RERUN_CONFIGURE "FALSE")
+
+ foreach (VARIABLE ${MATCHED_VARS})
+ #message(STATUS "${VARIABLE}=${${VARIABLE}}")
+
+ string(REPLACE ${PREFIX} "" PACKAGE_NAME ${VARIABLE})
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+ if ("${${PACKAGE_NAME}_AUTOBUILT}")
+ set(STATUS_STR "Now installed to CMAKE_INSTALL_PREFIX (${CMAKE_INSTALL_PREFIX}).")
+ set(AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER} OFF CACHE BOOL "If on, the AutoBuild CMake plugin will download, build, and install ${PACKAGE_NAME} to CMAKE_INSTALL_PREFIX the next time that CMake Configure is run." FORCE)
+ elseif("${${VARIABLE}}")
+ set(STATUS_STR "Set to auto-build next time you run CMake Configure.")
+ set(RERUN_CONFIGURE "TRUE")
+ else()
+ set(STATUS_STR "Autobuild off (either found on the system or manually turned off).")
+ endif()
+
+ message(STATUS "AutoBuild: Dependency = ${PACKAGE_NAME}; Status = ${STATUS_STR}")
+
+ endforeach()
+
+ # Error out if any packages are set to autobuild but have not yet been built
+ if ("${RERUN_CONFIGURE}")
+
+ # This flag confirms that the user has had a chance to see any new AutoBuild config
+ # options and we can now proceed on the next run of CMake Configure to do the auto
+ # download, build, and install steps.
+ set(AUTOBUILD_EXECUTE_NOW "ON" CACHE BOOL "If on, the AutoBuild download, build, install steps will run the next time CMake Configure is run.")
+ mark_as_advanced(AUTOBUILD_EXECUTE_NOW)
+
+ message(SEND_ERROR "AutoBuild: One or more packages are setup to be downloaded, built, and installed with AutoBuild the next time you run CMake Configure. Check now to make sure that your CMAKE_INSTALL_PREFIX points to the place where you want these dependencies installed. Also, check variables of the form AUTOBUILD_PACKAGE_* to make sure the packages you want to build are ON and the ones you do not are OFF. When all looks good, run Configure again to perform the download, build, and install steps. This message will be shown only once -- the first time your project schedules a dependency to be autobuilt.")
+
+ endif()
+ endif()
+
+ message(STATUS "AutoBuild: Completed status check.")
+endmacro()
+
+
+
+
+
+
+
+# Usage:
+# AutoBuild_use_package(
+# # This 1st argument is required, it is the name of the project/package you wish to use. The project should
+# # provide a <package-name>Config.cmake file for CMake to find.
+# MinVR
+#
+# # The 2nd argument is required and it is the relative path from the root of the external project's source
+# # tree to a CMakeLists.txt file that can be used to build the project.
+# .
+#
+# # The 3rd argument is required. It is the name of the target you wish to link this dependency to.
+# my-program
+#
+# # The 4th argument is required. It impacts how dependencies are propogated through CMake. You can treat
+# # this dependency as an INTERFACE, PUBLIC, or PRIVATE. See the following URL for details:
+# # https://cmake.org/cmake/help/latest/command/target_include_directories.html
+# PUBLIC
+#
+# # The 5th argument is required. It is the name of the imported target(s) provided in the projects CMake
+# # Config Package. By convention, these typically start with the project name and then ::, like a namespace.
+# MinVR::MinVR
+#
+# # The remaining arguments are optional and are used to provide more specific instructions on the find_package,
+# # download, build, and install steps. List additional flags for these steps after the keywords:
+# # FIND_PACKAGE_ARGS, DOWNLOAD_ARGS, and/or BUILD_AND_INSTALL_ARGS. For example:
+#
+# DOWNLOAD_ARGS GIT_REPOSITORY https://github.com/MinVR/MinVR.git GIT_TAG beta
+# )
+#
+macro(AutoBuild_use_package PACKAGE_NAME RELPATH_TO_CMAKELISTS YOUR_TARGET INTERFACE_PUBLIC_OR_PRIVATE IMPORTED_TARGETS)
+
+ set(OPTIONS)
+ set(ONE_VALUE_ARGS)
+ set(MULTI_VALUE_ARGS FIND_PACKAGE_ARGS DOWNLOAD_ARGS BUILD_AND_INSTALL_ARGS)
+ cmake_parse_arguments(EXTRA "${OPTIONS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN})
+
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+ AutoBuild_find_package_config_mode(${PACKAGE_NAME} ${EXTRA_FIND_PACKAGE_ARGS})
+
+
+
+ if ("${AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER}}")
+ if ("${AUTOBUILD_EXECUTE_NOW}")
+ message(STATUS "AutoBuild: Starting download, build, install sequence for ${PACKAGE_NAME}.")
+
+ if (EXISTS "${AUTOBUILD_DOWNLOAD_DIR}/${PACKAGE_NAME}/${RELPATH_TO_CMAKELISTS}/CmakeLists.txt")
+ message(STATUS "AutoBuild: External project source found at ${AUTOBUILD_DOWNLOAD_DIR}/${PACKAGE_NAME}. Skipping download step.")
+ else()
+ AutoBuild_download_project(${PACKAGE_NAME} ${EXTRA_DOWNLOAD_ARGS})
+ endif()
+
+ AutoBuild_build_and_install_project(${PACKAGE_NAME} ${RELPATH_TO_CMAKELISTS} ${EXTRA_BUILD_AND_INSTALL_ARGS})
+
+ AutoBuild_find_built_package_config_mode(${PACKAGE_NAME} CONFIG ${EXTRA_FIND_PACKAGE_ARGS})
+
+ set(${PACKAGE_NAME_UPPER}_AUTOBUILT "TRUE" CACHE BOOL "Confirms that package ${PACKAGE_NAME} was successfully built by the AutoBuild system.")
+ mark_as_advanced(${PACKAGE_NAME}_AUTOBUILT)
+
+ else()
+ message(STATUS "AutoBuild: Scheduled to build ${PACKAGE_NAME} the next time CMake Configure is run.")
+ endif()
+ endif()
+
+
+ # If we've found the package, either directly on the system or after autobuilding, then link with it
+ if ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}")
+ message(STATUS "Linking target ${YOUR_TARGET} with ${INTERFACE_PUBLIC_OR_PRIVATE} dependency ${PACKAGE_NAME}.")
+
+ target_link_libraries(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} ${IMPORTED_TARGETS})
+
+ target_compile_definitions(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} -DUSE_${PACKAGE_NAME_UPPER})
+ endif()
+
+endmacro()
+
+
+
+
+
+
+
+
+
+
+
+# ------ Implementation Details Below this Line -- External Users Should Not Need To Call Anything Below -------
+
+
+macro(AutoBuild_find_package_config_mode PACKAGE_NAME)
+ # Users can pass in extra arguments to the find_package command if needed.
+ set(EXTRA_MACRO_ARGS ${ARGN})
+
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+
+ # Force CMake to find the package again -- need for the case where the package exists on the system
+ # but we want to force building and installing it. after the install, we need to clear these flags
+ # so that find_package will find the newlyl installed version.
+ unset(${PACKAGE_NAME}_DIR CACHE)
+ unset(${PACKAGE_NAME_UPPER}_DIR CACHE)
+ unset(${PACKAGE_NAME}_FOUND CACHE)
+ unset(${PACKAGE_NAME_UPPER}_FOUND CACHE)
+
+ message(STATUS "AutoBuild: Searching for package ${PACKAGE_NAME} using cmake's find_package() config mode...")
+
+ if (NOT AUTOBUILD_DEPENDENCIES)
+
+ message(STATUS "AutoBuild: AUTOBUILD_DEPENDENCIES is OFF, using default CMake find_package() behavior.")
+ find_package(${PACKAGE_NAME} CONFIG ${EXTRA_MACRO_ARGS})
+
+ else()
+
+ # Try first to find the package within the current CMAKE_INSTALL_PREFIX. In the case when multiple
+ # versions of a library are installed on the same system, this makes sure that we will find a version
+ # that was previously built using AutoBuild first.
+ find_package(${PACKAGE_NAME} CONFIG PATHS ${CMAKE_INSTALL_PREFIX} NO_DEFAULT_PATH ${EXTRA_MACRO_ARGS})
+
+ # Try again with the normal version of find_package(), which will search a variety of places on
+ # the system, see details here: https://cmake.org/cmake/help/latest/command/find_package.html
+ if (NOT ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}"))
+ find_package(${PACKAGE_NAME} CONFIG ${EXTRA_MACRO_ARGS})
+ endif()
+
+
+ if ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME}_DIR}")
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_DIR}")
+ endif()
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_INCLUDE_DIR}")
+ endif()
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_INCLUDE_DIRS}")
+ endif()
+ message(STATUS "AutoBuild: OK - Found ${PACKAGE_NAME} at ${FOUND_AT_DIR}.")
+ # Found the package on the system, so there is no need to autobuild it, but we still add
+ # an option (defaulting to OFF) so that users can "force" building their own version of
+ # the dependency if they wish.
+ option(AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER} "If on, the AutoBuild CMake plugin will download, build, and install ${PACKAGE_NAME} to CMAKE_INSTALL_PREFIX the next time that CMake Configure is run." OFF)
+ else()
+ message(STATUS "AutoBuild: Could not find ${PACKAGE_NAME}, setting AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER}=ON.")
+ # If the package is still not found, then we will need to autobuild it, add the option with a default of ON
+ option(AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER} "If on, the AutoBuild CMake plugin will download, build, and install ${PACKAGE_NAME} to CMAKE_INSTALL_PREFIX the next time that CMake Configure is run." ON)
+ endif()
+
+ endif()
+endmacro()
+
+
+
+macro(AutoBuild_find_built_package_config_mode PACKAGE_NAME)
+ # Users can pass in extra arguments to the find_package command if needed.
+ set(EXTRA_MACRO_ARGS ${ARGN})
+
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+ # Force CMake to find the package again -- need for the case where the package exists on the system
+ # but we want to force building and installing it. after the install, we need to clear these flags
+ # so that find_package will find the newlyl installed version.
+ unset(${PACKAGE_NAME}_DIR CACHE)
+ unset(${PACKAGE_NAME_UPPER}_DIR CACHE)
+ unset(${PACKAGE_NAME}_FOUND CACHE)
+ unset(${PACKAGE_NAME_UPPER}_FOUND CACHE)
+
+ message(STATUS "AutoBuild: Searching again (after autobuilding) for package ${PACKAGE_NAME} using config mode...")
+
+ # Try first to find the package within the current CMAKE_INSTALL_PREFIX. In the case when multiple
+ # versions of a library are installed on the same system, this makes sure that we will find a version
+ # that was previously built using AutoBuild first.
+ find_package(${PACKAGE_NAME} PATHS ${CMAKE_INSTALL_PREFIX} NO_DEFAULT_PATH ${EXTRA_MACRO_ARGS} QUIET)
+
+ # Try again with the normal version of find_package(), which will search a variety of places on
+ # the system, see details here: https://cmake.org/cmake/help/latest/command/find_package.html
+ if (NOT ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}"))
+ find_package(${PACKAGE_NAME} ${EXTRA_MACRO_ARGS})
+ endif()
+
+
+ if ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME}_DIR}")
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_DIR}")
+ endif()
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_INCLUDE_DIR}")
+ endif()
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_INCLUDE_DIRS}")
+ endif()
+ message(STATUS "AutoBuild: OK - Found ${PACKAGE_NAME} at ${FOUND_AT_DIR}.")
+ else()
+ message(FATAL_ERROR "AutoBuild: Just completed a download, build, and install sequence for package ${PACKAGE_NAME}, and it should now be installed at the prefix ${CMAKE_INSTALL_PREFIX}, but cmake is still unable to find it with find_package().")
+ endif()
+endmacro()
+
+
+
+macro(AutoBuild_find_package_module_mode PACKAGE_NAME)
+ # Users can pass in extra arguments to the find_package command if needed.
+ set(EXTRA_MACRO_ARGS ${ARGN})
+
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+
+ # Force CMake to find the package again -- need for the case where the package exists on the system
+ # but we want to force building and installing it. after the install, we need to clear these flags
+ # so that find_package will find the newlyl installed version.
+ unset(${PACKAGE_NAME}_DIR CACHE)
+ unset(${PACKAGE_NAME_UPPER}_DIR CACHE)
+ unset(${PACKAGE_NAME}_FOUND CACHE)
+ unset(${PACKAGE_NAME_UPPER}_FOUND CACHE)
+
+ message(STATUS "AutoBuild: Searching for package ${PACKAGE_NAME} using cmake's find_package() module mode...")
+
+ if (NOT AUTOBUILD_DEPENDENCIES)
+
+ message(STATUS "AutoBuild: AUTOBUILD_DEPENDENCIES is OFF, using default CMake find_package() behavior.")
+ find_package(${PACKAGE_NAME} MODULE ${EXTRA_MACRO_ARGS})
+
+ else()
+
+ # AutoBuild allows users to force building a dependency even if it is already found installed on the
+ # system. To make this work, any Find*.cmake scripts that are used with AutoBuild must look first
+ # for the library under ${CMAKE_INSTALL_PREFIX}. This makes it so that preference is given to
+ # libraries just built and installed there with AutoBuild.
+ find_package(${PACKAGE_NAME} MODULE ${EXTRA_MACRO_ARGS})
+
+ if ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME}_DIR}")
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_DIR}")
+ endif()
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_INCLUDE_DIR}")
+ endif()
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_INCLUDE_DIRS}")
+ endif()
+ message(STATUS "AutoBuild: OK - Found ${PACKAGE_NAME} at ${FOUND_AT_DIR}.")
+ # Found the package on the system, so there is no need to autobuild it, but we still add
+ # an option (defaulting to OFF) so that users can "force" building their own version of
+ # the dependency if they wish.
+ option(AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER} "If on, the AutoBuild CMake plugin will download, build, and install ${PACKAGE_NAME} to CMAKE_INSTALL_PREFIX the next time that CMake Configure is run." OFF)
+ else()
+ message(STATUS "AutoBuild: Could not find ${PACKAGE_NAME}, setting AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER}=ON.")
+ # If the package is still not found, then we will need to autobuild it, add the option with a default of ON
+ option(AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER} "If on, the AutoBuild CMake plugin will download, build, and install ${PACKAGE_NAME} to CMAKE_INSTALL_PREFIX the next time that CMake Configure is run." ON)
+ endif()
+
+ endif()
+endmacro()
+
+
+
+macro(AutoBuild_find_built_package_module_mode PACKAGE_NAME)
+ # Users can pass in extra arguments to the find_package command if needed.
+ set(EXTRA_MACRO_ARGS ${ARGN})
+
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+ # Force CMake to find the package again -- need for the case where the package exists on the system
+ # but we want to force building and installing it. after the install, we need to clear these flags
+ # so that find_package will find the newlyl installed version.
+ unset(${PACKAGE_NAME}_DIR CACHE)
+ unset(${PACKAGE_NAME_UPPER}_DIR CACHE)
+ unset(${PACKAGE_NAME}_FOUND CACHE)
+ unset(${PACKAGE_NAME_UPPER}_FOUND CACHE)
+
+ message(STATUS "AutoBuild: Searching again (after autobuilding) for package ${PACKAGE_NAME} using module mode...")
+
+ # AutoBuild allows users to force building a dependency even if it is already found installed on the
+ # system. To make this work, any Find*.cmake scripts that are used with AutoBuild must look first
+ # for the library under ${CMAKE_INSTALL_PREFIX}. This makes it so that preference is given to
+ # libraries just built and installed there with AutoBuild.
+ find_package(${PACKAGE_NAME} MODULE ${EXTRA_MACRO_ARGS})
+
+ if ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME}_DIR}")
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_DIR}")
+ endif()
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_INCLUDE_DIR}")
+ endif()
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_INCLUDE_DIRS}")
+ endif()
+ message(STATUS "AutoBuild: OK - Found ${PACKAGE_NAME} at ${FOUND_AT_DIR}.")
+ else()
+ message(FATAL_ERROR "AutoBuild: Just completed a download, build, and install sequence for package ${PACKAGE_NAME}, and it should now be installed at the prefix ${CMAKE_INSTALL_PREFIX}, but cmake is still unable to find it with find_package().")
+ endif()
+endmacro()
+
+
+
+# Usage:
+# AutoBuild_download_project(
+# # This first argument is the name of the project to download. It is required:
+# glm
+#
+# # Additional arguments specify how to download the project using GIT, SVN, CVS, or URL.
+# # These can be any of the arguments used for the downloading step of the cmake builtin
+# # ExternalProject_Add command.
+# GIT_REPOSITORY "https://github.com/g-truc/glm.git"
+# GIT_TAG master
+# etc..
+# )
+function(AutoBuild_download_project EXT_PROJECT_NAME)
+
+ big_message("AUTOBUILD: BEGIN EXTERNAL PROJECT DOWNLOAD (${EXT_PROJECT_NAME}).")
+
+ message(STATUS "AutoBuild: Creating a download helper project for ${EXT_PROJECT_NAME}.")
+
+ set(DOWNLOAD_OPTIONS ${ARGN})
+ string (REGEX REPLACE "(^|[^\\\\]);" "\\1 " DOWNLOAD_OPTIONS "${DOWNLOAD_OPTIONS}")
+
+ file(MAKE_DIRECTORY ${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME})
+
+ # Write the CMakeLists.txt.in file to disk
+ set(DLHELPER_FILE_TEXT "\n \
+ # This is a helper cmake project -- the only thing this project does is download \n \
+ # the external project. So, the configure, build, install, and test commands for \n \
+ # ExternalProject_Add() are intentionally set as NOPs. \n \
+ \n \
+ cmake_minimum_required (VERSION 3.9) \n \
+ \n \
+ project(@EXT_PROJECT_NAME@-download) \n \
+ \n \
+ include(ExternalProject) \n \
+ ExternalProject_Add( \n \
+ @EXT_PROJECT_NAME@ \n \
+ SOURCE_DIR \"@AUTOBUILD_DOWNLOAD_DIR@/@EXT_PROJECT_NAME@\" \n \
+ BINARY_DIR \"@AUTOBUILD_DOWNLOAD_DIR@/@EXT_PROJECT_NAME@-download-helper\" \n \
+ @DOWNLOAD_OPTIONS@ \n \
+ CONFIGURE_COMMAND \"\" \n \
+ BUILD_COMMAND \"\" \n \
+ INSTALL_COMMAND \"\" \n \
+ TEST_COMMAND \"\" \n \
+ LOG_DOWNLOAD ON \n \
+ GIT_PROGRESS 1 \n \
+ ) \n \
+ ")
+
+ file(WRITE ${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}-download-helper/CMakeLists.txt.in ${DLHELPER_FILE_TEXT})
+
+ configure_file(
+ ${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}-download-helper/CMakeLists.txt.in
+ ${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}-download-helper/CMakeLists.txt
+ )
+
+ message(STATUS "AutoBuild: Generating build files for the ${EXT_PROJECT_NAME} download helper project.")
+ message(STATUS " Using working dir: ${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}-download-helper")
+
+ execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . WORKING_DIRECTORY "${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}-download-helper" OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr RESULT_VARIABLE exitcode)
+ if(NOT "${exitcode}" STREQUAL "0")
+ message(FATAL_ERROR "AutoBuild: Error while creating download helper project: ${stdout} ${stderr}")
+ endif()
+
+ message(STATUS "AutoBuild: Building the ${EXT_PROJECT_NAME} download helper project. (This actually performs the download and may take some time...)")
+ execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}-download-helper" OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr RESULT_VARIABLE exitcode)
+ if(NOT "${exitcode}" STREQUAL "0")
+ message(SEND_ERROR "AutoBuild: Error running download helper project: ${stdout} ${stderr}")
+ endif()
+
+ message(STATUS "AutoBuild: Completed download of external project ${EXT_PROJECT_NAME}.")
+
+endfunction()
+
+
+# Usage:
+# AutoBuild_build_and_install_project(
+# # This first argument is the name of the external project to download. It is required:
+# VRPN
+# # This second argument is the relative path from ${EXTERNAL_DIR_NAME}/projectname/ to the project's
+# # main CMakeLists.txt file:
+# src
+#
+# # Additional arguments are passed on as options to the cmake build file generator
+# -DVRPN_BUILD_DIRECTSHOW_VIDEO_SERVER=OFF
+# -DVRPN_BUILD_HID_GUI=OFF
+# etc..
+# )
+function(AutoBuild_build_and_install_project EXT_PROJECT_NAME RELPATH_TO_CMAKELISTS)
+
+ big_message("AUTOBUILD: BEGIN EXTERNAL PROJECT BUILD AND INSTALL (${EXT_PROJECT_NAME}).")
+ AutoBuild_configure_project( ${EXT_PROJECT_NAME} ${RELPATH_TO_CMAKELISTS} ${ARGN})
+ AutoBuild_build_and_install_debug( ${EXT_PROJECT_NAME} ${RELPATH_TO_CMAKELISTS} ${ARGN})
+ AutoBuild_build_and_install_release( ${EXT_PROJECT_NAME} ${RELPATH_TO_CMAKELISTS} ${ARGN})
+ message(STATUS "AutoBuild: Completed external build of ${EXT_PROJECT_NAME}.\n\n")
+endfunction()
+
+
+function(AutoBuild_configure_project EXT_PROJECT_NAME RELPATH_TO_CMAKELISTS)
+ # any extra args to the function are interpreted as arguments for the cmake config process
+ set(CMAKE_CONFIG_OPTIONS ${ARGN})
+
+ # always set the install prefix to be the same as for the main project
+ list(APPEND CMAKE_CONFIG_OPTIONS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX})
+
+ set(SRC_DIR "${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}/${RELPATH_TO_CMAKELISTS}")
+ set(BUILD_DIR "${CMAKE_BINARY_DIR}/external/${EXT_PROJECT_NAME}")
+
+ file(MAKE_DIRECTORY ${BUILD_DIR})
+
+ message(STATUS "AutoBuild: Generating build files for external project ${EXT_PROJECT_NAME}.")
+ message(STATUS " Using source dir: ${SRC_DIR}")
+ message(STATUS " Using build dir: ${BUILD_DIR}")
+ message(STATUS " Config options: ${CMAKE_CONFIG_OPTIONS}")
+
+ execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" ${SRC_DIR} ${CMAKE_CONFIG_OPTIONS} WORKING_DIRECTORY ${BUILD_DIR} OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr RESULT_VARIABLE exitcode)
+ if(NOT "${exitcode}" STREQUAL "0")
+ message(FATAL_ERROR "AutoBuild: Error generating build files for external project: ${stdout} ${stderr}")
+ endif()
+endfunction()
+
+
+function(AutoBuild_build_and_install_debug EXT_PROJECT_NAME RELPATH_TO_CMAKELISTS)
+ message(STATUS "AutoBuild: Building external project ${EXT_PROJECT_NAME} (Configuration = Debug). (This may take some time...)")
+ set(BUILD_DIR "${CMAKE_BINARY_DIR}/external/${EXT_PROJECT_NAME}")
+ execute_process(COMMAND "${CMAKE_COMMAND}" --build ${BUILD_DIR} --config Debug --target install OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr RESULT_VARIABLE exitcode)
+ if(NOT "${exitcode}" STREQUAL "0")
+ message(FATAL_ERROR "AutoBuild: Error building Debug configuration for external project: ${stdout} ${stderr}")
+ endif()
+endfunction()
+
+
+function(AutoBuild_build_and_install_release EXT_PROJECT_NAME RELPATH_TO_CMAKELISTS)
+ message(STATUS "AutoBuild: Building external project ${EXT_PROJECT_NAME} (Configuration = Release). (This may take some time...)")
+ set(BUILD_DIR "${CMAKE_BINARY_DIR}/external/${EXT_PROJECT_NAME}")
+ execute_process(COMMAND "${CMAKE_COMMAND}" --build ${BUILD_DIR} --config Release --target install OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr RESULT_VARIABLE exitcode)
+ if(NOT "${exitcode}" STREQUAL "0")
+ message(FATAL_ERROR "AutoBuild: Error building Release configuration for external project: ${stdout} ${stderr}")
+ endif()
+endfunction()
+
+
+macro(big_message TITLE)
+ string(TOUPPER ${TITLE} TITLE)
+ message(STATUS "\n\n==== ${TITLE} ====")
+endmacro()
+
+
+
diff --git a/dev/MinGfx/cmake/AutoBuildNanoGUI.cmake b/dev/MinGfx/cmake/AutoBuildNanoGUI.cmake
new file mode 100644
index 0000000..4c4008f
--- /dev/null
+++ b/dev/MinGfx/cmake/AutoBuildNanoGUI.cmake
@@ -0,0 +1,96 @@
+# Author: Daniel F. Keefe
+# Copyright 2017,2018, Daniel F. Keefe and Regents of the University of Minnesota
+# All Rights Reserved.
+
+include(AutoBuild)
+
+
+# Usage:
+# AutoBuild_use_package_NanoGUI(
+# # The 1st argument is required. It is the name of the target you wish to link this dependency to.
+# my-program
+#
+# # The 2nd argument is required. It impacts how dependencies are propogated through CMake. You can treat
+# # this dependency as an INTERFACE, PUBLIC, or PRIVATE. See CMake's docs on Imported Targets for details.
+# PUBLIC
+# )
+#
+macro(AutoBuild_use_package_NanoGUI YOUR_TARGET INTERFACE_PUBLIC_OR_PRIVATE)
+ set(PACKAGE_NAME "NanoGUI")
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+ AutoBuild_find_package_module_mode(${PACKAGE_NAME})
+
+ if ("${AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER}}")
+ if ("${AUTOBUILD_EXECUTE_NOW}")
+
+ message(STATUS "AutoBuild: Beginning download, build, install sequence.")
+
+ if (EXISTS "${AUTOBUILD_DOWNLOAD_DIR}/${PACKAGE_NAME}/${RELPATH_TO_CMAKELISTS}/CmakeLists.txt")
+ message(STATUS "AutoBuild: External project source found at ${AUTOBUILD_DOWNLOAD_DIR}/${PACKAGE_NAME}. Skipping download step.")
+ else()
+ AutoBuild_download_project(
+ ${PACKAGE_NAME}
+ GIT_REPOSITORY https://github.com/wjakob/nanogui.git
+ )
+ endif()
+
+ AutoBuild_build_and_install_project(
+ ${PACKAGE_NAME}
+ .
+ -DNANOGUI_BUILD_PYTHON=OFF
+ -DCMAKE_DEBUG_POSTFIX=d
+ )
+
+
+ # NanoGUI's install doesn't seem to install its dependencies, so do it manually here.
+ file(INSTALL "${AUTOBUILD_DOWNLOAD_DIR}/NanoGUI/ext/eigen/Eigen" DESTINATION "${CMAKE_INSTALL_PREFIX}/include")
+
+ file(INSTALL "${AUTOBUILD_DOWNLOAD_DIR}/NanoGUI/ext/glfw/include/GLFW" DESTINATION "${CMAKE_INSTALL_PREFIX}/include"
+ FILES_MATCHING PATTERN "glfw3.h" PATTERN "glfw3native.h")
+
+ file(INSTALL "${AUTOBUILD_DOWNLOAD_DIR}/NanoGUI/ext/nanovg/src/fontstash.h" DESTINATION "${CMAKE_INSTALL_PREFIX}/include/nanovg")
+ file(INSTALL "${AUTOBUILD_DOWNLOAD_DIR}/NanoGUI/ext/nanovg/src/nanovg.h" DESTINATION "${CMAKE_INSTALL_PREFIX}/include/nanovg")
+ file(INSTALL "${AUTOBUILD_DOWNLOAD_DIR}/NanoGUI/ext/nanovg/src/nanovg_gl.h" DESTINATION "${CMAKE_INSTALL_PREFIX}/include/nanovg")
+ file(INSTALL "${AUTOBUILD_DOWNLOAD_DIR}/NanoGUI/ext/nanovg/src/nanovg_gl_utils.h" DESTINATION "${CMAKE_INSTALL_PREFIX}/include/nanovg")
+ file(INSTALL "${AUTOBUILD_DOWNLOAD_DIR}/NanoGUI/ext/nanovg/src/stb_image.h" DESTINATION "${CMAKE_INSTALL_PREFIX}/include/nanovg")
+ file(INSTALL "${AUTOBUILD_DOWNLOAD_DIR}/NanoGUI/ext/nanovg/src/stb_truetype.h" DESTINATION "${CMAKE_INSTALL_PREFIX}/include/nanovg")
+
+ if (WIN32)
+ file(INSTALL "${AUTOBUILD_DOWNLOAD_DIR}/NanoGUI/ext/glad/include/glad" DESTINATION "${CMAKE_INSTALL_PREFIX}/include")
+ file(INSTALL "${AUTOBUILD_DOWNLOAD_DIR}/NanoGUI/ext/glad/include/KHR" DESTINATION "${CMAKE_INSTALL_PREFIX}/include")
+
+ # And, the don't even install the .dll on Windows! Come on nanogui guys, get your act together!
+ file(INSTALL "${CMAKE_BINARY_DIR}/external/NanoGUI/Release/nanogui.dll" DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
+ file(INSTALL "${CMAKE_BINARY_DIR}/external/NanoGUI/Debug/nanoguid.dll" DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
+ endif()
+
+
+ AutoBuild_find_built_package_module_mode(${PACKAGE_NAME})
+
+ set(${PACKAGE_NAME_UPPER}_AUTOBUILT "TRUE" CACHE BOOL "Confirms that package ${PACKAGE_NAME} was successfully built by the AutoBuild system.")
+ mark_as_advanced(${PACKAGE_NAME}_AUTOBUILT)
+
+ else()
+ message(STATUS "AutoBuild: Scheduled to build ${PACKAGE_NAME} the next time CMake Configure is run.")
+ endif()
+ endif()
+
+
+ # If we've found the package, either directly on the system or after autobuilding, then link with it
+ if ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}")
+ message(STATUS "Linking target ${YOUR_TARGET} with ${INTERFACE_PUBLIC_OR_PRIVATE} dependency ${PACKAGE_NAME}.")
+
+ target_link_libraries(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} ${NANOGUI_LIBRARIES})
+ target_include_directories(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} ${NANOGUI_INCLUDE_DIRS})
+
+ target_compile_definitions(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} -DUSE_${PACKAGE_NAME})
+
+ if (WIN32)
+ target_compile_definitions(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} -DNANOGUI_GLAD -DGLAD_GLAPI_EXPORT)
+ endif()
+
+ endif()
+
+endmacro()
+
diff --git a/dev/MinGfx/cmake/AutoBuildOpenGL.cmake b/dev/MinGfx/cmake/AutoBuildOpenGL.cmake
new file mode 100644
index 0000000..c74b2b8
--- /dev/null
+++ b/dev/MinGfx/cmake/AutoBuildOpenGL.cmake
@@ -0,0 +1,47 @@
+# Author: Daniel F. Keefe
+# Copyright 2017,2018, Daniel F. Keefe and Regents of the University of Minnesota
+# All Rights Reserved.
+
+
+# Usage:
+# AutoBuild_use_package_OpenGL(
+# # The 1st argument is required. It is the name of the target you wish to link this dependency to.
+# my-program
+#
+# # The 2nd argument is required. It impacts how dependencies are propogated through CMake. You can treat
+# # this dependency as an INTERFACE, PUBLIC, or PRIVATE. See the following URL for details:
+# # https://cmake.org/cmake/help/latest/command/target_include_directories.html
+# PUBLIC
+# )
+#
+macro(AutoBuild_use_package_OpenGL YOUR_TARGET INTERFACE_PUBLIC_OR_PRIVATE)
+
+ message(STATUS "AutoBuild: Searching for package OpenGL...")
+
+ # Check to see if the library is already installed on the system
+ # CMake ships with FindOpenGL.cmake and in CMake 3.9+ it defines
+ # the imported targets OpenGL::GL and OpenGL::GLU. Using these is
+ # now the preferred way to link with OpenGL and all of its dependencies.
+ # See https://cmake.org/cmake/help/v3.9/module/FindOpenGL.html
+ find_package(OpenGL)
+
+ if (NOT ${OPENGL_FOUND})
+ message(FATAL_ERROR "AutoBuild: OpenGL was not found on the system. AutoBuild can auto-download
+ and build many dependencies for you, but not OpenGL. It should come pre-installed on your system.")
+ endif()
+
+ message(STATUS "AutoBuild: Ok. Found OpenGL.")
+ message(STATUS " OpenGL headers: ${OPENGL_INCLUDE_DIR}")
+ message(STATUS " OpenGL libs: ${OPENGL_LIBRARIES}")
+
+ message(STATUS "Linking target ${YOUR_TARGET} with ${INTERFACE_PUBLIC_OR_PRIVATE} dependency OpenGL::GL.")
+ target_link_libraries(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} OpenGL::GL)
+
+ if (${OPENGL_GLU_FOUND})
+ message(STATUS "Linking target ${YOUR_TARGET} with ${INTERFACE_PUBLIC_OR_PRIVATE} dependency OpenGL::GLU.")
+ target_link_libraries(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} OpenGL::GLU)
+ endif()
+
+ target_compile_definitions(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} -DUSE_OPENGL)
+
+endmacro()
diff --git a/dev/MinGfx/cmake/MessageMacros.cmake b/dev/MinGfx/cmake/MessageMacros.cmake
new file mode 100644
index 0000000..4628e5c
--- /dev/null
+++ b/dev/MinGfx/cmake/MessageMacros.cmake
@@ -0,0 +1,17 @@
+# This file is part of the MinVR cmake build system.
+# See the main MinVR/CMakeLists.txt file for authors, copyright, and license info.
+
+
+macro(h1 TITLE)
+ string(TOUPPER ${TITLE} TITLE)
+ message(STATUS "\n\n==== ${TITLE} ====")
+endmacro()
+
+macro(h2 TITLE)
+ message(STATUS "\n* ${TITLE}")
+endmacro()
+
+macro(h3 TITLE)
+ message(STATUS "- ${TITLE}")
+endmacro()
+
diff --git a/dev/MinGfx/cmake/MinGfxConfig.cmake.in b/dev/MinGfx/cmake/MinGfxConfig.cmake.in
new file mode 100644
index 0000000..8a7b703
--- /dev/null
+++ b/dev/MinGfx/cmake/MinGfxConfig.cmake.in
@@ -0,0 +1,7 @@
+# To use the MinGfx library in your cmake project, add the following to your CMakeLists.txt:
+# find_package(MinGfx REQUIRED)
+# ... then, after add_executable(${PROJECT_NAME}) or add_library(${PROJECT_NAME})
+# target_link_libraries(${PROJECT_NAME} PUBLIC MinGfx)
+
+
+include("${CMAKE_CURRENT_LIST_DIR}/MinGfxTargets.cmake")
diff --git a/dev/MinGfx/cmake/Modules/FindDoxygen.cmake b/dev/MinGfx/cmake/Modules/FindDoxygen.cmake
new file mode 100644
index 0000000..c0e865f
--- /dev/null
+++ b/dev/MinGfx/cmake/Modules/FindDoxygen.cmake
@@ -0,0 +1,1166 @@
+# dfk: edited one line to add CSE labs Doxygen install location to paths to search
+
+
+
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#[=======================================================================[.rst:
+FindDoxygen
+-----------
+
+Doxygen is a documentation generation tool (see http://www.doxygen.org).
+This module looks for Doxygen and some optional tools it supports. These
+tools are enabled as components in the :command:`find_package` command:
+
+``dot``
+ `Graphviz <http://graphviz.org>`_ ``dot`` utility used to render various
+ graphs.
+``mscgen``
+ `Message Chart Generator <http://www.mcternan.me.uk/mscgen/>`_ utility used
+ by Doxygen's ``\msc`` and ``\mscfile`` commands.
+``dia``
+ `Dia <https://wiki.gnome.org/Apps/Dia>`_ the diagram editor used by Doxygen's
+ ``\diafile`` command.
+
+Examples:
+
+.. code-block:: cmake
+
+ # Require dot, treat the other components as optional
+ find_package(Doxygen
+ REQUIRED dot
+ OPTIONAL_COMPONENTS mscgen dia)
+
+The following variables are defined by this module:
+
+.. variable:: DOXYGEN_FOUND
+
+ True if the ``doxygen`` executable was found.
+
+.. variable:: DOXYGEN_VERSION
+
+ The version reported by ``doxygen --version``.
+
+The module defines ``IMPORTED`` targets for Doxygen and each component found.
+These can be used as part of custom commands, etc. and should be preferred over
+old-style (and now deprecated) variables like ``DOXYGEN_EXECUTABLE``. The
+following import targets are defined if their corresponding executable could be
+found (the component import targets will only be defined if that component was
+requested):
+
+::
+
+ Doxygen::doxygen
+ Doxygen::dot
+ Doxygen::mscgen
+ Doxygen::dia
+
+
+Functions
+^^^^^^^^^
+
+.. command:: doxygen_add_docs
+
+ This function is intended as a convenience for adding a target for generating
+ documentation with Doxygen. It aims to provide sensible defaults so that
+ projects can generally just provide the input files and directories and that
+ will be sufficient to give sensible results. The function supports the
+ ability to customize the Doxygen configuration used to build the
+ documentation.
+
+ ::
+
+ doxygen_add_docs(targetName
+ [filesOrDirs...]
+ [ALL]
+ [USE_STAMP_FILE]
+ [WORKING_DIRECTORY dir]
+ [COMMENT comment])
+
+ The function constructs a ``Doxyfile`` and defines a custom target that runs
+ Doxygen on that generated file. The listed files and directories are used as
+ the ``INPUT`` of the generated ``Doxyfile`` and they can contain wildcards.
+ Any files that are listed explicitly will also be added as ``SOURCES`` of the
+ custom target so they will show up in an IDE project's source list.
+
+ So that relative input paths work as expected, by default the working
+ directory of the Doxygen command will be the current source directory (i.e.
+ :variable:`CMAKE_CURRENT_SOURCE_DIR`). This can be overridden with the
+ ``WORKING_DIRECTORY`` option to change the directory used as the relative
+ base point. Note also that Doxygen's default behavior is to strip the working
+ directory from relative paths in the generated documentation (see the
+ ``STRIP_FROM_PATH`` `Doxygen config option
+ <http://www.doxygen.org/manual/config.html>`_ for details).
+
+ If provided, the optional ``comment`` will be passed as the ``COMMENT`` for
+ the :command:`add_custom_target` command used to create the custom target
+ internally.
+
+ If ``ALL`` is set, the target will be added to the default build target.
+
+ If ``USE_STAMP_FILE`` is set, the custom command defined by this function will
+ create a stamp file with the name ``<targetName>.stamp`` in the current
+ binary directory whenever doxygen is re-run. With this option present, all
+ items in ``<filesOrDirs>`` must be files (i.e. no directories, symlinks or
+ wildcards) and each of the files must exist at the time
+ ``doxygen_add_docs()`` is called. An error will be raised if any of the
+ items listed is missing or is not a file when ``USE_STAMP_FILE`` is given.
+ A dependency will be created on each of the files so that doxygen will only
+ be re-run if one of the files is updated. Without the ``USE_STAMP_FILE``
+ option, doxygen will always be re-run if the ``<targetName>`` target is built
+ regardless of whether anything listed in ``<filesOrDirs>`` has changed.
+
+ The contents of the generated ``Doxyfile`` can be customized by setting CMake
+ variables before calling ``doxygen_add_docs()``. Any variable with a name of
+ the form ``DOXYGEN_<tag>`` will have its value substituted for the
+ corresponding ``<tag>`` configuration option in the ``Doxyfile``. See the
+ `Doxygen documentation <http://www.doxygen.org/manual/config.html>`_ for the
+ full list of supported configuration options.
+
+ Some of Doxygen's defaults are overridden to provide more appropriate
+ behavior for a CMake project. Each of the following will be explicitly set
+ unless the variable already has a value before ``doxygen_add_docs()`` is
+ called (with some exceptions noted):
+
+ .. variable:: DOXYGEN_HAVE_DOT
+
+ Set to ``YES`` if the ``dot`` component was requested and it was found,
+ ``NO`` otherwise. Any existing value of ``DOXYGEN_HAVE_DOT`` is ignored.
+
+ .. variable:: DOXYGEN_DOT_MULTI_TARGETS
+
+ Set to ``YES`` by this module (note that this requires a ``dot`` version
+ newer than 1.8.10). This option is only meaningful if ``DOXYGEN_HAVE_DOT``
+ is also set to ``YES``.
+
+ .. variable:: DOXYGEN_GENERATE_LATEX
+
+ Set to ``NO`` by this module.
+
+ .. variable:: DOXYGEN_WARN_FORMAT
+
+ For Visual Studio based generators, this is set to the form recognized by
+ the Visual Studio IDE: ``$file($line) : $text``. For all other generators,
+ Doxygen's default value is not overridden.
+
+ .. variable:: DOXYGEN_PROJECT_NAME
+
+ Populated with the name of the current project (i.e.
+ :variable:`PROJECT_NAME`).
+
+ .. variable:: DOXYGEN_PROJECT_NUMBER
+
+ Populated with the version of the current project (i.e.
+ :variable:`PROJECT_VERSION`).
+
+ .. variable:: DOXYGEN_PROJECT_BRIEF
+
+ Populated with the description of the current project (i.e.
+ :variable:`PROJECT_DESCRIPTION`).
+
+ .. variable:: DOXYGEN_INPUT
+
+ Projects should not set this variable. It will be populated with the set of
+ files and directories passed to ``doxygen_add_docs()``, thereby providing
+ consistent behavior with the other built-in commands like
+ :command:`add_executable`, :command:`add_library` and
+ :command:`add_custom_target`. If a variable named ``DOXYGEN_INPUT`` is set
+ by the project, it will be ignored and a warning will be issued.
+
+ .. variable:: DOXYGEN_RECURSIVE
+
+ Set to ``YES`` by this module.
+
+ .. variable:: DOXYGEN_EXCLUDE_PATTERNS
+
+ If the set of inputs includes directories, this variable will specify
+ patterns used to exclude files from them. The following patterns are added
+ by ``doxygen_add_docs()`` to ensure CMake-specific files and directories
+ are not included in the input. If the project sets
+ ``DOXYGEN_EXCLUDE_PATTERNS``, those contents are merged with these
+ additional patterns rather than replacing them:
+
+ ::
+
+ */.git/*
+ */.svn/*
+ */.hg/*
+ */CMakeFiles/*
+ */_CPack_Packages/*
+ DartConfiguration.tcl
+ CMakeLists.txt
+ CMakeCache.txt
+
+ .. variable:: DOXYGEN_OUTPUT_DIRECTORY
+
+ Set to :variable:`CMAKE_CURRENT_BINARY_DIR` by this module. Note that if
+ the project provides its own value for this and it is a relative path, it
+ will be converted to an absolute path relative to the current binary
+ directory. This is necessary because doxygen will normally be run from a
+ directory within the source tree so that relative source paths work as
+ expected. If this directory does not exist, it will be recursively created
+ prior to executing the doxygen commands.
+
+To change any of these defaults or override any other Doxygen config option,
+set relevant variables before calling ``doxygen_add_docs()``. For example:
+
+ .. code-block:: cmake
+
+ set(DOXYGEN_GENERATE_HTML NO)
+ set(DOXYGEN_GENERATE_MAN YES)
+
+ doxygen_add_docs(
+ doxygen
+ ${PROJECT_SOURCE_DIR}
+ COMMENT "Generate man pages"
+ )
+
+A number of Doxygen config options accept lists of values, but Doxygen requires
+them to be separated by whitespace. CMake variables hold lists as a string with
+items separated by semi-colons, so a conversion needs to be performed. The
+``doxygen_add_docs()`` command specifically checks the following Doxygen config
+options and will convert their associated CMake variable's contents into the
+required form if set.
+
+::
+
+ ABBREVIATE_BRIEF
+ ALIASES
+ CITE_BIB_FILES
+ DIAFILE_DIRS
+ DOTFILE_DIRS
+ DOT_FONTPATH
+ ENABLED_SECTIONS
+ EXAMPLE_PATH
+ EXAMPLE_PATTERNS
+ EXCLUDE
+ EXCLUDE_PATTERNS
+ EXCLUDE_SYMBOLS
+ EXPAND_AS_DEFINED
+ EXTENSION_MAPPING
+ EXTRA_PACKAGES
+ EXTRA_SEARCH_MAPPINGS
+ FILE_PATTERNS
+ FILTER_PATTERNS
+ FILTER_SOURCE_PATTERNS
+ HTML_EXTRA_FILES
+ HTML_EXTRA_STYLESHEET
+ IGNORE_PREFIX
+ IMAGE_PATH
+ INCLUDE_FILE_PATTERNS
+ INCLUDE_PATH
+ INPUT
+ LATEX_EXTRA_FILES
+ LATEX_EXTRA_STYLESHEET
+ MATHJAX_EXTENSIONS
+ MSCFILE_DIRS
+ PLANTUML_INCLUDE_PATH
+ PREDEFINED
+ QHP_CUST_FILTER_ATTRS
+ QHP_SECT_FILTER_ATTRS
+ STRIP_FROM_INC_PATH
+ STRIP_FROM_PATH
+ TAGFILES
+ TCL_SUBST
+
+The following single value Doxygen options will be quoted automatically
+if they contain at least one space:
+
+::
+
+ CHM_FILE
+ DIA_PATH
+ DOCBOOK_OUTPUT
+ DOCSET_FEEDNAME
+ DOCSET_PUBLISHER_NAME
+ DOT_FONTNAME
+ DOT_PATH
+ EXTERNAL_SEARCH_ID
+ FILE_VERSION_FILTER
+ GENERATE_TAGFILE
+ HHC_LOCATION
+ HTML_FOOTER
+ HTML_HEADER
+ HTML_OUTPUT
+ HTML_STYLESHEET
+ INPUT_FILTER
+ LATEX_FOOTER
+ LATEX_HEADER
+ LATEX_OUTPUT
+ LAYOUT_FILE
+ MAN_OUTPUT
+ MAN_SUBDIR
+ MATHJAX_CODEFILE
+ MSCGEN_PATH
+ OUTPUT_DIRECTORY
+ PERL_PATH
+ PLANTUML_JAR_PATH
+ PROJECT_BRIEF
+ PROJECT_LOGO
+ PROJECT_NAME
+ QCH_FILE
+ QHG_LOCATION
+ QHP_CUST_FILTER_NAME
+ QHP_VIRTUAL_FOLDER
+ RTF_EXTENSIONS_FILE
+ RTF_OUTPUT
+ RTF_STYLESHEET_FILE
+ SEARCHDATA_FILE
+ USE_MDFILE_AS_MAINPAGE
+ WARN_FORMAT
+ WARN_LOGFILE
+ XML_OUTPUT
+
+There are situations where it may be undesirable for a particular config option
+to be automatically quoted by ``doxygen_add_docs()``, such as ``ALIASES`` which
+may need to include its own embedded quoting. The ``DOXYGEN_VERBATIM_VARS``
+variable can be used to specify a list of Doxygen variables (including the
+leading ``DOXYGEN_`` prefix) which should not be quoted. The project is then
+responsible for ensuring that those variables' values make sense when placed
+directly in the Doxygen input file. In the case of list variables, list items
+are still separated by spaces, it is only the automatic quoting that is
+skipped. For example, the following allows ``doxygen_add_docs()`` to apply
+quoting to ``DOXYGEN_PROJECT_BRIEF``, but not each item in the
+``DOXYGEN_ALIASES`` list (:ref:`bracket syntax <Bracket Argument>` can also
+be used to make working with embedded quotes easier):
+
+.. code-block:: cmake
+
+ set(DOXYGEN_PROJECT_BRIEF "String with spaces")
+ set(DOXYGEN_ALIASES
+ [[somealias="@some_command param"]]
+ "anotherAlias=@foobar"
+ )
+ set(DOXYGEN_VERBATIM_VARS DOXYGEN_ALIASES)
+
+The resultant ``Doxyfile`` will contain the following lines:
+
+.. code-block:: text
+
+ PROJECT_BRIEF = "String with spaces"
+ ALIASES = somealias="@some_command param" anotherAlias=@foobar
+
+
+Deprecated Result Variables
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+For compatibility with previous versions of CMake, the following variables
+are also defined but they are deprecated and should no longer be used:
+
+.. variable:: DOXYGEN_EXECUTABLE
+
+ The path to the ``doxygen`` command. If projects need to refer to the
+ ``doxygen`` executable directly, they should use the ``Doxygen::doxygen``
+ import target instead.
+
+.. variable:: DOXYGEN_DOT_FOUND
+
+ True if the ``dot`` executable was found.
+
+.. variable:: DOXYGEN_DOT_EXECUTABLE
+
+ The path to the ``dot`` command. If projects need to refer to the ``dot``
+ executable directly, they should use the ``Doxygen::dot`` import target
+ instead.
+
+.. variable:: DOXYGEN_DOT_PATH
+
+ The path to the directory containing the ``dot`` executable as reported in
+ ``DOXYGEN_DOT_EXECUTABLE``. The path may have forward slashes even on Windows
+ and is not suitable for direct substitution into a ``Doxyfile.in`` template.
+ If you need this value, get the :prop_tgt:`IMPORTED_LOCATION` property of the
+ ``Doxygen::dot`` target and use :command:`get_filename_component` to extract
+ the directory part of that path. You may also want to consider using
+ :command:`file(TO_NATIVE_PATH)` to prepare the path for a Doxygen
+ configuration file.
+
+
+Deprecated Hint Variables
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. variable:: DOXYGEN_SKIP_DOT
+
+ This variable has no effect for the component form of ``find_package``.
+ In backward compatibility mode (i.e. without components list) it prevents
+ the finder module from searching for Graphviz's ``dot`` utility.
+
+#]=======================================================================]
+
+cmake_policy(PUSH)
+cmake_policy(SET CMP0057 NEW) # if IN_LIST
+
+# For backwards compatibility support
+if(Doxygen_FIND_QUIETLY)
+ set(DOXYGEN_FIND_QUIETLY TRUE)
+endif()
+
+# ===== Rationale for OS X AppBundle mods below =====
+# With the OS X GUI version, Doxygen likes to be installed to /Applications
+# and it contains the doxygen executable in the bundle. In the versions I've
+# seen, it is located in Resources, but in general, more often binaries are
+# located in MacOS.
+#
+# NOTE: The official Doxygen.app distributed for OS X uses non-standard
+# conventions. Instead of the command-line "doxygen" tool being placed in
+# Doxygen.app/Contents/MacOS, "Doxywizard" is placed there instead and
+# "doxygen" is placed in Contents/Resources. This is most likely done
+# so that something happens when people double-click on the Doxygen.app
+# package. Unfortunately, CMake gets confused by this as when it sees the
+# bundle it uses "Doxywizard" as the executable to use instead of
+# "doxygen". Therefore to work-around this issue we temporarily disable
+# the app-bundle feature, just for this CMake module:
+#
+if(APPLE)
+ # Save the old setting
+ set(TEMP_DOXYGEN_SAVE_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE})
+ # Disable the App-bundle detection feature
+ set(CMAKE_FIND_APPBUNDLE "NEVER")
+endif()
+# FYI:
+# In older versions of OS X Doxygen, dot was included with the Doxygen bundle,
+# but newer versions require you to download Graphviz.app which contains "dot"
+# or use something like homebrew.
+# ============== End OSX stuff ================
+
+#
+# Find Doxygen...
+#
+macro(_Doxygen_find_doxygen)
+ find_program(
+ DOXYGEN_EXECUTABLE
+ NAMES doxygen
+ PATHS
+ C:/Doxygen191/bin
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\doxygen_is1;Inno Setup: App Path]/bin"
+ /Applications/Doxygen.app/Contents/Resources
+ /Applications/Doxygen.app/Contents/MacOS
+ /Applications/Utilities/Doxygen.app/Contents/Resources
+ /Applications/Utilities/Doxygen.app/Contents/MacOS
+ DOC "Doxygen documentation generation tool (http://www.doxygen.org)"
+ )
+ mark_as_advanced(DOXYGEN_EXECUTABLE)
+
+ if(DOXYGEN_EXECUTABLE)
+ execute_process(
+ COMMAND "${DOXYGEN_EXECUTABLE}" --version
+ OUTPUT_VARIABLE DOXYGEN_VERSION
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ RESULT_VARIABLE _Doxygen_version_result
+ )
+ if(_Doxygen_version_result)
+ message(WARNING "Unable to determine doxygen version: ${_Doxygen_version_result}")
+ endif()
+
+ # Create an imported target for Doxygen
+ if(NOT TARGET Doxygen::doxygen)
+ add_executable(Doxygen::doxygen IMPORTED GLOBAL)
+ set_target_properties(Doxygen::doxygen PROPERTIES
+ IMPORTED_LOCATION "${DOXYGEN_EXECUTABLE}"
+ )
+ endif()
+ endif()
+endmacro()
+
+#
+# Find Diagram Editor...
+#
+macro(_Doxygen_find_dia)
+ set(_x86 "(x86)")
+ find_program(
+ DOXYGEN_DIA_EXECUTABLE
+ NAMES dia
+ PATHS
+ "$ENV{ProgramFiles}/Dia"
+ "$ENV{ProgramFiles${_x86}}/Dia"
+ DOC "Diagram Editor tool for use with Doxygen"
+ )
+ mark_as_advanced(DOXYGEN_DIA_EXECUTABLE)
+
+ if(DOXYGEN_DIA_EXECUTABLE)
+ # The Doxyfile wants the path to the utility, not the entire path
+ # including file name
+ get_filename_component(DOXYGEN_DIA_PATH
+ "${DOXYGEN_DIA_EXECUTABLE}"
+ DIRECTORY)
+ if(WIN32)
+ file(TO_NATIVE_PATH "${DOXYGEN_DIA_PATH}" DOXYGEN_DIA_PATH)
+ endif()
+
+ # Create an imported target for component
+ if(NOT TARGET Doxygen::dia)
+ add_executable(Doxygen::dia IMPORTED GLOBAL)
+ set_target_properties(Doxygen::dia PROPERTIES
+ IMPORTED_LOCATION "${DOXYGEN_DIA_EXECUTABLE}"
+ )
+ endif()
+ endif()
+
+ unset(_x86)
+endmacro()
+
+#
+# Find Graphviz Dot...
+#
+macro(_Doxygen_find_dot)
+ if(WIN32)
+ set(_x86 "(x86)")
+ file(
+ GLOB _Doxygen_GRAPHVIZ_BIN_DIRS
+ "$ENV{ProgramFiles}/Graphviz*/bin"
+ "$ENV{ProgramFiles${_x86}}/Graphviz*/bin"
+ )
+ unset(_x86)
+ else()
+ set(_Doxygen_GRAPHVIZ_BIN_DIRS "")
+ endif()
+
+ find_program(
+ DOXYGEN_DOT_EXECUTABLE
+ NAMES dot
+ PATHS
+ ${_Doxygen_GRAPHVIZ_BIN_DIRS}
+ "$ENV{ProgramFiles}/ATT/Graphviz/bin"
+ "C:/Program Files/ATT/Graphviz/bin"
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\ATT\\Graphviz;InstallPath]/bin
+ /Applications/Graphviz.app/Contents/MacOS
+ /Applications/Utilities/Graphviz.app/Contents/MacOS
+ /Applications/Doxygen.app/Contents/Resources
+ /Applications/Doxygen.app/Contents/MacOS
+ /Applications/Utilities/Doxygen.app/Contents/Resources
+ /Applications/Utilities/Doxygen.app/Contents/MacOS
+ DOC "Dot tool for use with Doxygen"
+ )
+ mark_as_advanced(DOXYGEN_DOT_EXECUTABLE)
+
+ if(DOXYGEN_DOT_EXECUTABLE)
+ # The Doxyfile wants the path to the utility, not the entire path
+ # including file name
+ get_filename_component(DOXYGEN_DOT_PATH
+ "${DOXYGEN_DOT_EXECUTABLE}"
+ DIRECTORY)
+ if(WIN32)
+ file(TO_NATIVE_PATH "${DOXYGEN_DOT_PATH}" DOXYGEN_DOT_PATH)
+ endif()
+
+ # Create an imported target for component
+ if(NOT TARGET Doxygen::dot)
+ add_executable(Doxygen::dot IMPORTED GLOBAL)
+ set_target_properties(Doxygen::dot PROPERTIES
+ IMPORTED_LOCATION "${DOXYGEN_DOT_EXECUTABLE}"
+ )
+ endif()
+ endif()
+
+ unset(_Doxygen_GRAPHVIZ_BIN_DIRS)
+endmacro()
+
+#
+# Find Message Sequence Chart...
+#
+macro(_Doxygen_find_mscgen)
+ set(_x86 "(x86)")
+ find_program(
+ DOXYGEN_MSCGEN_EXECUTABLE
+ NAMES mscgen
+ PATHS
+ "$ENV{ProgramFiles}/Mscgen"
+ "$ENV{ProgramFiles${_x86}}/Mscgen"
+ DOC "Message sequence chart tool for use with Doxygen"
+ )
+ mark_as_advanced(DOXYGEN_MSCGEN_EXECUTABLE)
+
+ if(DOXYGEN_MSCGEN_EXECUTABLE)
+ # The Doxyfile wants the path to the utility, not the entire path
+ # including file name
+ get_filename_component(DOXYGEN_MSCGEN_PATH
+ "${DOXYGEN_MSCGEN_EXECUTABLE}"
+ DIRECTORY)
+ if(WIN32)
+ file(TO_NATIVE_PATH "${DOXYGEN_MSCGEN_PATH}" DOXYGEN_MSCGEN_PATH)
+ endif()
+
+ # Create an imported target for component
+ if(NOT TARGET Doxygen::mscgen)
+ add_executable(Doxygen::mscgen IMPORTED GLOBAL)
+ set_target_properties(Doxygen::mscgen PROPERTIES
+ IMPORTED_LOCATION "${DOXYGEN_MSCGEN_EXECUTABLE}"
+ )
+ endif()
+ endif()
+
+ unset(_x86)
+endmacro()
+
+# Make sure `doxygen` is one of the components to find
+set(_Doxygen_keep_backward_compat FALSE)
+if(NOT Doxygen_FIND_COMPONENTS)
+ # Search at least for `doxygen` executable
+ set(Doxygen_FIND_COMPONENTS doxygen)
+ # Preserve backward compatibility:
+ # search for `dot` also if `DOXYGEN_SKIP_DOT` is not explicitly disable this.
+ if(NOT DOXYGEN_SKIP_DOT)
+ list(APPEND Doxygen_FIND_COMPONENTS dot)
+ endif()
+ set(_Doxygen_keep_backward_compat TRUE)
+elseif(NOT doxygen IN_LIST Doxygen_FIND_COMPONENTS)
+ list(INSERT Doxygen_FIND_COMPONENTS 0 doxygen)
+endif()
+
+#
+# Find all requested components of Doxygen...
+#
+foreach(_comp IN LISTS Doxygen_FIND_COMPONENTS)
+ if(_comp STREQUAL "doxygen")
+ _Doxygen_find_doxygen()
+ elseif(_comp STREQUAL "dia")
+ _Doxygen_find_dia()
+ elseif(_comp STREQUAL "dot")
+ _Doxygen_find_dot()
+ elseif(_comp STREQUAL "mscgen")
+ _Doxygen_find_mscgen()
+ else()
+ message(WARNING "${_comp} is not a valid Doxygen component")
+ set(Doxygen_${_comp}_FOUND FALSE)
+ continue()
+ endif()
+
+ if(TARGET Doxygen::${_comp})
+ set(Doxygen_${_comp}_FOUND TRUE)
+ else()
+ set(Doxygen_${_comp}_FOUND FALSE)
+ endif()
+endforeach()
+unset(_comp)
+
+# Verify find results
+#include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+ Doxygen
+ REQUIRED_VARS DOXYGEN_EXECUTABLE
+ VERSION_VAR DOXYGEN_VERSION
+ HANDLE_COMPONENTS
+)
+
+#
+# Backwards compatibility...
+#
+if(APPLE)
+ # Restore the old app-bundle setting
+ set(CMAKE_FIND_APPBUNDLE ${TEMP_DOXYGEN_SAVE_CMAKE_FIND_APPBUNDLE})
+endif()
+
+# Maintain the _FOUND variables as "YES" or "NO" for backwards
+# compatibility. This allows people to substitute them directly into
+# Doxyfile with configure_file().
+if(DOXYGEN_FOUND)
+ set(DOXYGEN_FOUND "YES")
+else()
+ set(DOXYGEN_FOUND "NO")
+endif()
+if(_Doxygen_keep_backward_compat)
+ if(Doxygen_dot_FOUND)
+ set(DOXYGEN_DOT_FOUND "YES")
+ else()
+ set(DOXYGEN_DOT_FOUND "NO")
+ endif()
+
+ # For backwards compatibility support for even older CMake versions
+ set(DOXYGEN ${DOXYGEN_EXECUTABLE})
+ set(DOT ${DOXYGEN_DOT_EXECUTABLE})
+
+ # No need to keep any backward compatibility for `DOXYGEN_MSCGEN_XXX`
+ # and `DOXYGEN_DIA_XXX` since they were not supported before component
+ # support was added
+endif()
+unset(_Doxygen_keep_backward_compat)
+
+#
+# Allow full control of Doxygen from CMakeLists.txt
+#
+
+# Prepare a template Doxyfile and Doxygen's default values CMake file
+if(TARGET Doxygen::doxygen)
+ # If doxygen was found, use it to generate a minimal default Doxyfile.
+ # We will delete this file after we have finished using it below to
+ # generate the other files that doxygen_add_docs() will use.
+ set(_Doxygen_tpl "${CMAKE_BINARY_DIR}/CMakeDoxyfile.tpl")
+ execute_process(
+ COMMAND "${DOXYGEN_EXECUTABLE}" -s -g "${_Doxygen_tpl}"
+ OUTPUT_QUIET
+ RESULT_VARIABLE _Doxygen_tpl_result
+ )
+ if(_Doxygen_tpl_result)
+ message(FATAL_ERROR
+ "Unable to generate Doxyfile template: ${_Doxygen_tpl_result}")
+ elseif(NOT EXISTS "${_Doxygen_tpl}")
+ message(FATAL_ERROR
+ "Doxygen has failed to generate a Doxyfile template")
+ endif()
+
+ # Write a do-not-edit header to files we are going to generate...
+ set(_Doxygen_dne_header
+[[
+#
+# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE!
+#
+
+]]
+ )
+ # We only need one copy of these across the whole build, since their
+ # content is only dependent on the version of Doxygen being used. Therefore
+ # we always put them at the top of the build tree so that they are in a
+ # predictable location.
+ set(_doxyfile_in "${CMAKE_BINARY_DIR}/CMakeDoxyfile.in")
+ set(_doxyfile_defaults "${CMAKE_BINARY_DIR}/CMakeDoxygenDefaults.cmake")
+
+ file(WRITE "${_doxyfile_in}" ${_Doxygen_dne_header})
+ file(WRITE "${_doxyfile_defaults}" ${_Doxygen_dne_header})
+
+ # Get strings containing a configuration key from the template Doxyfile
+ # we obtained from this version of Doxygen. Because some options are split
+ # across multiple lines by ending lines with backslashes, we cannot just
+ # use file(STRINGS...) with a REGEX. Instead, read lines without a REGEX
+ # so that file(STRINGS...) handles the trailing backslash as a line
+ # continuation. It stores multi-lines as lists, so we then have to replace
+ # the ";" list separator with backslashed newlines again so that we get the
+ # original content stored back as the value part.
+ file(STRINGS "${_Doxygen_tpl}" _file_lines)
+ unset(_Doxygen_tpl_params)
+ foreach(_line IN LISTS _file_lines)
+ if(_line MATCHES "([A-Z][A-Z0-9_]+)( *=)(.*)")
+ set(_key "${CMAKE_MATCH_1}")
+ set(_eql "${CMAKE_MATCH_2}")
+ set(_value "${CMAKE_MATCH_3}")
+ string(REPLACE "\\" "\\\\" _value "${_value}")
+ string(REPLACE ";" "\\\n" _value "${_value}")
+ list(APPEND _Doxygen_tpl_params "${_key}${_eql}${_value}")
+ endif()
+ endforeach()
+
+ # Build up a Doxyfile that provides @configVar@ substitutions for each
+ # Doxygen config option as well as a separate CMake script which provides
+ # the default value for each of those options if the project doesn't supply
+ # them. Each config option will support substitution of a CMake variable
+ # of the same name except with DOXYGEN_ prepended.
+ foreach(_Doxygen_param IN LISTS _Doxygen_tpl_params)
+ if(_Doxygen_param MATCHES "([A-Z][A-Z0-9_]+)( *)=( (.*))?")
+ # Ok, this is a config key with a value
+ if(CMAKE_MATCH_COUNT EQUAL 4)
+ file(APPEND "${_doxyfile_in}"
+ "${CMAKE_MATCH_1}${CMAKE_MATCH_2}= @DOXYGEN_${CMAKE_MATCH_1}@\n")
+ # Remove the backslashes we had to preserve to handle newlines
+ string(REPLACE "\\\n" "\n" _value "${CMAKE_MATCH_4}")
+ file(APPEND "${_doxyfile_defaults}"
+"if(NOT DEFINED DOXYGEN_${CMAKE_MATCH_1})
+ set(DOXYGEN_${CMAKE_MATCH_1} ${_value})
+endif()
+")
+ # Ok, this is a config key with empty default value
+ elseif(CMAKE_MATCH_COUNT EQUAL 2)
+ file(APPEND "${_doxyfile_in}"
+ "${CMAKE_MATCH_1}${CMAKE_MATCH_2}= @DOXYGEN_${CMAKE_MATCH_1}@\n")
+ else()
+ message(AUTHOR_WARNING
+"Unexpected line format! Code review required!\nFault line: ${_Doxygen_param}")
+ endif()
+ else()
+ message(AUTHOR_WARNING
+"Unexpected line format! Code review required!\nFault line: ${_Doxygen_param}")
+ endif()
+ endforeach()
+
+ # Ok, dumped defaults are not needed anymore...
+ file(REMOVE "${_Doxygen_tpl}")
+
+ unset(_Doxygen_param)
+ unset(_Doxygen_tpl_params)
+ unset(_Doxygen_dne_header)
+ unset(_Doxygen_tpl)
+
+endif()
+
+function(doxygen_quote_value VARIABLE)
+ # Quote a value of the given variable if:
+ # - VARIABLE parameter was really given
+ # - the variable it names is defined and is not present in the list
+ # specified by DOXYGEN_VERBATIM_VARS (if set)
+ # - the value of the named variable isn't already quoted
+ # - the value has spaces
+ if(VARIABLE AND DEFINED ${VARIABLE} AND
+ NOT ${VARIABLE} MATCHES "^\".* .*\"$" AND ${VARIABLE} MATCHES " " AND
+ NOT (DEFINED DOXYGEN_VERBATIM_VARS AND
+ "${VARIABLE}" IN_LIST DOXYGEN_VERBATIM_VARS))
+ set(${VARIABLE} "\"${${VARIABLE}}\"" PARENT_SCOPE)
+ endif()
+endfunction()
+
+function(doxygen_list_to_quoted_strings LIST_VARIABLE)
+ if(LIST_VARIABLE AND DEFINED ${LIST_VARIABLE})
+ unset(_inputs)
+ unset(_sep)
+ unset(_verbatim)
+ # Have to test if list items should be treated as verbatim here
+ # because we lose the variable name when we pass just one list item
+ # to doxygen_quote_value() below
+ if(DEFINED DOXYGEN_VERBATIM_VARS AND
+ "${LIST_VARIABLE}" IN_LIST DOXYGEN_VERBATIM_VARS)
+ set(_verbatim True)
+ endif()
+ foreach(_in IN LISTS ${LIST_VARIABLE})
+ if(NOT _verbatim)
+ doxygen_quote_value(_in)
+ endif()
+ string(APPEND _inputs "${_sep}${_in}")
+ set(_sep " ")
+ endforeach()
+ set(${LIST_VARIABLE} "${_inputs}" PARENT_SCOPE)
+ endif()
+endfunction()
+
+function(doxygen_add_docs targetName)
+ set(_options ALL USE_STAMP_FILE)
+ set(_one_value_args WORKING_DIRECTORY COMMENT)
+ set(_multi_value_args)
+ cmake_parse_arguments(_args
+ "${_options}"
+ "${_one_value_args}"
+ "${_multi_value_args}"
+ ${ARGN})
+
+ if(NOT _args_COMMENT)
+ set(_args_COMMENT "Generate API documentation for ${targetName}")
+ endif()
+
+ if(NOT _args_WORKING_DIRECTORY)
+ set(_args_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
+ endif()
+
+ if(DEFINED DOXYGEN_INPUT)
+ message(WARNING
+"DOXYGEN_INPUT is set but it will be ignored. Pass the files and directories \
+directly to the doxygen_add_docs() command instead.")
+ endif()
+ set(DOXYGEN_INPUT ${_args_UNPARSED_ARGUMENTS})
+
+ if(NOT TARGET Doxygen::doxygen)
+ message(FATAL_ERROR "Doxygen was not found, needed by \
+doxygen_add_docs() for target ${targetName}")
+ endif()
+
+ # If not already defined, set some relevant defaults based on the
+ # assumption that the documentation is for the whole project. Details
+ # specified in the project() command will be used to populate a number of
+ # these defaults.
+
+ if(NOT DEFINED DOXYGEN_PROJECT_NAME)
+ # The PROJECT_NAME tag is a single word (or a sequence of words
+ # surrounded by double-quotes, unless you are using Doxywizard) that
+ # should identify the project for which the documentation is generated.
+ # This name is used in the title of most generated pages and in a few
+ # other places. The default value is: My Project.
+ set(DOXYGEN_PROJECT_NAME ${PROJECT_NAME})
+ endif()
+
+ if(NOT DEFINED DOXYGEN_PROJECT_NUMBER)
+ # 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 control system is used.
+ set(DOXYGEN_PROJECT_NUMBER ${PROJECT_VERSION})
+ endif()
+
+ if(NOT DEFINED DOXYGEN_PROJECT_BRIEF)
+ # Using the PROJECT_BRIEF tag one can provide an optional one line
+ # description 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.
+ set(DOXYGEN_PROJECT_BRIEF "${PROJECT_DESCRIPTION}")
+ endif()
+
+ if(NOT DEFINED DOXYGEN_RECURSIVE)
+ # The RECURSIVE tag can be used to specify whether or not
+ # subdirectories should be searched for input files as well. CMake
+ # projects generally evolve to span multiple directories, so it makes
+ # more sense for this to be on by default. Doxygen's default value
+ # has this setting turned off, so we override it.
+ set(DOXYGEN_RECURSIVE YES)
+ endif()
+
+ if(NOT DEFINED DOXYGEN_OUTPUT_DIRECTORY)
+ # 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 used, Doxygen will interpret it as
+ # being relative to the location where doxygen was started, but we need
+ # to run Doxygen in the source tree so that relative input paths work
+ # intuitively. Therefore, we ensure that the output directory is always
+ # an absolute path and if the project provided a relative path, we
+ # treat it as relative to the current BINARY directory so that output
+ # is not generated inside the source tree.
+ set(DOXYGEN_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
+ elseif(NOT IS_ABSOLUTE "${DOXYGEN_OUTPUT_DIRECTORY}")
+ get_filename_component(DOXYGEN_OUTPUT_DIRECTORY
+ "${DOXYGEN_OUTPUT_DIRECTORY}"
+ ABSOLUTE
+ BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
+ endif()
+
+ if(NOT DEFINED DOXYGEN_HAVE_DOT)
+ # If you set the HAVE_DOT tag to YES then doxygen will assume the dot
+ # tool is available from the path. This tool is part of Graphviz (see:
+ # 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 set to NO.
+ # Doxygen's default value is: NO.
+ if(Doxygen_dot_FOUND)
+ set(DOXYGEN_HAVE_DOT "YES")
+ else()
+ set(DOXYGEN_HAVE_DOT "NO")
+ endif()
+ endif()
+
+ if(NOT DEFINED DOXYGEN_DOT_MULTI_TARGETS)
+ # 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 makes dot run faster, but since only newer
+ # versions of dot (>1.8.10) support this, Doxygen disables this feature
+ # by default.
+ # This tag requires that the tag HAVE_DOT is set to YES.
+ set(DOXYGEN_DOT_MULTI_TARGETS YES)
+ endif()
+
+ if(NOT DEFINED DOXYGEN_GENERATE_LATEX)
+ # If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX
+ # output. We only want the HTML output enabled by default, so we turn
+ # this off if the project hasn't specified it.
+ set(DOXYGEN_GENERATE_LATEX NO)
+ endif()
+
+ if(NOT DEFINED DOXYGEN_WARN_FORMAT)
+ if(CMAKE_VS_MSBUILD_COMMAND OR CMAKE_VS_DEVENV_COMMAND)
+ # The WARN_FORMAT tag determines the format of the warning messages
+ # that doxygen can produce. The string should contain the $file,
+ # $line and $text tags, which will be replaced by the file and line
+ # number from which the warning originated and the warning text.
+ # Optionally, the format may contain $version, which will be
+ # replaced by the version of the file (if it could be obtained via
+ # FILE_VERSION_FILTER).
+ # Doxygen's default value is: $file:$line: $text
+ set(DOXYGEN_WARN_FORMAT "$file($line) : $text ")
+ endif()
+ endif()
+
+ if(DEFINED DOXYGEN_WARN_LOGFILE AND NOT IS_ABSOLUTE "${DOXYGEN_WARN_LOGFILE}")
+ # The WARN_LOGFILE tag can be used to specify a file to which warning and error
+ # messages should be written. If left blank the output is written to standard
+ # error (stderr).
+ get_filename_component(DOXYGEN_WARN_LOGFILE
+ "${DOXYGEN_WARN_LOGFILE}"
+ ABSOLUTE
+ BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
+ endif()
+
+ # Any files from the INPUT that match any of the EXCLUDE_PATTERNS will be
+ # excluded from the set of input files. We provide some additional patterns
+ # to prevent commonly unwanted things from CMake builds being pulled in.
+ #
+ # Note that the wildcards are matched against the file with absolute path,
+ # so to exclude all test directories for example use the pattern */test/*
+ list(
+ APPEND
+ DOXYGEN_EXCLUDE_PATTERNS
+ "*/.git/*"
+ "*/.svn/*"
+ "*/.hg/*"
+ "*/CMakeFiles/*"
+ "*/_CPack_Packages/*"
+ "DartConfiguration.tcl"
+ "CMakeLists.txt"
+ "CMakeCache.txt"
+ )
+
+ # Now bring in Doxgen's defaults for those things the project has not
+ # already set and we have not provided above
+ include("${CMAKE_BINARY_DIR}/CMakeDoxygenDefaults.cmake" OPTIONAL)
+
+ # Cleanup built HTMLs on "make clean"
+ # TODO Any other dirs?
+ if(DOXYGEN_GENERATE_HTML)
+ if(IS_ABSOLUTE "${DOXYGEN_HTML_OUTPUT}")
+ set(_args_clean_html_dir "${DOXYGEN_HTML_OUTPUT}")
+ else()
+ set(_args_clean_html_dir
+ "${DOXYGEN_OUTPUT_DIRECTORY}/${DOXYGEN_HTML_OUTPUT}")
+ endif()
+ set_property(DIRECTORY APPEND PROPERTY
+ ADDITIONAL_CLEAN_FILES "${_args_clean_html_dir}")
+ endif()
+
+ # Build up a list of files we can identify from the inputs so we can list
+ # them as DEPENDS and SOURCES in the custom command/target (the latter
+ # makes them display in IDEs). This must be done before we transform the
+ # various DOXYGEN_... variables below because we need to process
+ # DOXYGEN_INPUT as a list first.
+ unset(_sources)
+ foreach(_item IN LISTS DOXYGEN_INPUT)
+ get_filename_component(_abs_item "${_item}" ABSOLUTE
+ BASE_DIR "${_args_WORKING_DIRECTORY}")
+ get_source_file_property(_isGenerated "${_abs_item}" GENERATED)
+ if(_isGenerated OR
+ (EXISTS "${_abs_item}" AND
+ NOT IS_DIRECTORY "${_abs_item}" AND
+ NOT IS_SYMLINK "${_abs_item}"))
+ list(APPEND _sources "${_abs_item}")
+ elseif(_args_USE_STAMP_FILE)
+ message(FATAL_ERROR "Source does not exist or is not a file:\n"
+ " ${_abs_item}\n"
+ "Only existing files may be specified when the "
+ "USE_STAMP_FILE option is given.")
+ endif()
+ endforeach()
+
+ # Transform known list type options into space separated strings.
+ set(_doxygen_list_options
+ ABBREVIATE_BRIEF
+ ALIASES
+ CITE_BIB_FILES
+ DIAFILE_DIRS
+ DOTFILE_DIRS
+ DOT_FONTPATH
+ ENABLED_SECTIONS
+ EXAMPLE_PATH
+ EXAMPLE_PATTERNS
+ EXCLUDE
+ EXCLUDE_PATTERNS
+ EXCLUDE_SYMBOLS
+ EXPAND_AS_DEFINED
+ EXTENSION_MAPPING
+ EXTRA_PACKAGES
+ EXTRA_SEARCH_MAPPINGS
+ FILE_PATTERNS
+ FILTER_PATTERNS
+ FILTER_SOURCE_PATTERNS
+ HTML_EXTRA_FILES
+ HTML_EXTRA_STYLESHEET
+ IGNORE_PREFIX
+ IMAGE_PATH
+ INCLUDE_FILE_PATTERNS
+ INCLUDE_PATH
+ INPUT
+ LATEX_EXTRA_FILES
+ LATEX_EXTRA_STYLESHEET
+ MATHJAX_EXTENSIONS
+ MSCFILE_DIRS
+ PLANTUML_INCLUDE_PATH
+ PREDEFINED
+ QHP_CUST_FILTER_ATTRS
+ QHP_SECT_FILTER_ATTRS
+ STRIP_FROM_INC_PATH
+ STRIP_FROM_PATH
+ TAGFILES
+ TCL_SUBST
+ )
+ foreach(_item IN LISTS _doxygen_list_options)
+ doxygen_list_to_quoted_strings(DOXYGEN_${_item})
+ endforeach()
+
+ # Transform known single value variables which may contain spaces, such as
+ # paths or description strings.
+ set(_doxygen_quoted_options
+ CHM_FILE
+ DIA_PATH
+ DOCBOOK_OUTPUT
+ DOCSET_FEEDNAME
+ DOCSET_PUBLISHER_NAME
+ DOT_FONTNAME
+ DOT_PATH
+ EXTERNAL_SEARCH_ID
+ FILE_VERSION_FILTER
+ GENERATE_TAGFILE
+ HHC_LOCATION
+ HTML_FOOTER
+ HTML_HEADER
+ HTML_OUTPUT
+ HTML_STYLESHEET
+ INPUT_FILTER
+ LATEX_FOOTER
+ LATEX_HEADER
+ LATEX_OUTPUT
+ LAYOUT_FILE
+ MAN_OUTPUT
+ MAN_SUBDIR
+ MATHJAX_CODEFILE
+ MSCGEN_PATH
+ OUTPUT_DIRECTORY
+ PERL_PATH
+ PLANTUML_JAR_PATH
+ PROJECT_BRIEF
+ PROJECT_LOGO
+ PROJECT_NAME
+ QCH_FILE
+ QHG_LOCATION
+ QHP_CUST_FILTER_NAME
+ QHP_VIRTUAL_FOLDER
+ RTF_EXTENSIONS_FILE
+ RTF_OUTPUT
+ RTF_STYLESHEET_FILE
+ SEARCHDATA_FILE
+ USE_MDFILE_AS_MAINPAGE
+ WARN_FORMAT
+ WARN_LOGFILE
+ XML_OUTPUT
+ )
+
+ # Store the unmodified value of DOXYGEN_OUTPUT_DIRECTORY prior to invoking
+ # doxygen_quote_value() below. This will mutate the string specifically for
+ # consumption by Doxygen's config file, which we do not want when we use it
+ # later in the custom target's commands.
+ set( _original_doxygen_output_dir ${DOXYGEN_OUTPUT_DIRECTORY} )
+
+ foreach(_item IN LISTS _doxygen_quoted_options)
+ doxygen_quote_value(DOXYGEN_${_item})
+ endforeach()
+
+ # Prepare doxygen configuration file
+ set(_doxyfile_template "${CMAKE_BINARY_DIR}/CMakeDoxyfile.in")
+ set(_target_doxyfile "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.${targetName}")
+ configure_file("${_doxyfile_template}" "${_target_doxyfile}")
+
+ unset(_all)
+ if(${_args_ALL})
+ set(_all ALL)
+ endif()
+
+ # Only create the stamp file if asked to. If we don't create it,
+ # the target will always be considered out-of-date.
+ if(_args_USE_STAMP_FILE)
+ set(__stamp_file "${CMAKE_CURRENT_BINARY_DIR}/${targetName}.stamp")
+ add_custom_command(
+ VERBATIM
+ OUTPUT ${__stamp_file}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${_original_doxygen_output_dir}
+ COMMAND "${DOXYGEN_EXECUTABLE}" "${_target_doxyfile}"
+ COMMAND ${CMAKE_COMMAND} -E touch ${__stamp_file}
+ WORKING_DIRECTORY "${_args_WORKING_DIRECTORY}"
+ DEPENDS "${_target_doxyfile}" ${_sources}
+ COMMENT "${_args_COMMENT}"
+ )
+ add_custom_target(${targetName} ${_all}
+ DEPENDS ${__stamp_file}
+ SOURCES ${_sources}
+ )
+ unset(__stamp_file)
+ else()
+ add_custom_target( ${targetName} ${_all} VERBATIM
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${_original_doxygen_output_dir}
+ COMMAND "${DOXYGEN_EXECUTABLE}" "${_target_doxyfile}"
+ WORKING_DIRECTORY "${_args_WORKING_DIRECTORY}"
+ DEPENDS "${_target_doxyfile}" ${_sources}
+ COMMENT "${_args_COMMENT}"
+ SOURCES ${_sources}
+ )
+ endif()
+
+endfunction()
+
+cmake_policy(POP)
diff --git a/dev/MinGfx/cmake/Modules/FindNanoGUI.cmake b/dev/MinGfx/cmake/Modules/FindNanoGUI.cmake
new file mode 100644
index 0000000..1c27135
--- /dev/null
+++ b/dev/MinGfx/cmake/Modules/FindNanoGUI.cmake
@@ -0,0 +1,62 @@
+
+
+find_path(NANOGUI_INCLUDE_DIR
+ nanogui/nanogui.h
+ HINTS
+ ${CMAKE_INSTALL_PREFIX}/include
+ ${CMAKE_INSTALL_PREFIX}/include/nanogui
+ $ENV{NANOGUI_ROOT}/include
+ $ENV{NANOGUI_ROOT}/include/nanogui
+ /usr/local/include
+ /usr/local/include/nanogui
+)
+
+
+find_library(NANOGUI_OPT_LIBRARIES
+ NAMES
+ nanogui
+ HINTS
+ ${CMAKE_INSTALL_PREFIX}/lib
+ $ENV{NANOGUI_ROOT}/lib
+ /usr/local/lib
+)
+
+
+find_library(NANOGUI_DEBUG_LIBRARIES
+ NAMES
+ nanoguid
+ HINTS
+ ${CMAKE_INSTALL_PREFIX}/lib
+ $ENV{NANOGUI_ROOT}/lib
+ /usr/local/lib
+)
+
+set(NANOGUI_INCLUDE_DIRS
+ ${NANOGUI_INCLUDE_DIR}
+ ${NANOGUI_INCLUDE_DIR}/nanovg
+)
+
+unset(NANOGUI_LIBRARIES)
+if (NANOGUI_OPT_LIBRARIES)
+ list(APPEND NANOGUI_LIBRARIES optimized ${NANOGUI_OPT_LIBRARIES})
+endif()
+
+if (NANOGUI_DEBUG_LIBRARIES)
+ list(APPEND NANOGUI_LIBRARIES debug ${NANOGUI_DEBUG_LIBRARIES})
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+ NanoGUI
+ DEFAULT_MSG
+ NANOGUI_INCLUDE_DIRS
+ NANOGUI_LIBRARIES
+)
+
+mark_as_advanced(
+ NANOGUI_INCLUDE_DIR
+ NANOGUI_INCLUDE_DIRS
+ NANOGUI_OPT_LIBRARIES
+ NANOGUI_DEBUG_LIBRARIES
+ NANOGUI_LIBRARIES
+)
diff --git a/dev/MinGfx/data/Futura_Medium_BT.ttf b/dev/MinGfx/data/Futura_Medium_BT.ttf
new file mode 100644
index 0000000..b08a86e
--- /dev/null
+++ b/dev/MinGfx/data/Futura_Medium_BT.ttf
Binary files differ
diff --git a/dev/MinGfx/data/teapot.obj b/dev/MinGfx/data/teapot.obj
new file mode 100644
index 0000000..38008e2
--- /dev/null
+++ b/dev/MinGfx/data/teapot.obj
@@ -0,0 +1,8210 @@
+####
+#
+# OBJ File Generated by Meshlab
+#
+####
+# Object teapot.obj
+#
+# Vertices: 2081
+# Faces: 4032
+#
+####
+vn -0.935882 -0.352314 0.000004
+v 0.183957 0.128242 0.000001 0.752941 0.752941 0.752941
+vn -0.917700 -0.352548 -0.183132
+v 0.179604 0.128242 0.044341 0.752941 0.752941 0.752941
+vn -0.953551 -0.233737 -0.190021
+v 0.177135 0.134936 0.043827 0.752941 0.752941 0.752941
+vn -0.972350 -0.233527 -0.000001
+v 0.181437 0.134936 0.000001 0.752941 0.752941 0.752941
+vn -0.971779 0.134763 -0.193608
+v 0.176628 0.139718 0.043722 0.752941 0.752941 0.752941
+vn -0.990900 0.134600 -0.000001
+v 0.180920 0.139718 0.000001 0.752941 0.752941 0.752941
+vn -0.682645 0.717970 -0.136069
+v 0.177731 0.142587 0.043951 0.752941 0.752941 0.752941
+vn -0.696557 0.717502 0.000003
+v 0.182045 0.142587 0.000001 0.752941 0.752941 0.752941
+vn -0.028042 0.999590 -0.005761
+v 0.180081 0.143544 0.044440 0.752941 0.752941 0.752941
+vn -0.028982 0.999580 0.000003
+v 0.184442 0.143544 0.000001 0.752941 0.752941 0.752941
+vn 0.444456 0.891418 0.088510
+v 0.183324 0.142587 0.045114 0.752941 0.752941 0.752941
+vn 0.453327 0.891344 0.000005
+v 0.187752 0.142587 0.000001 0.752941 0.752941 0.752941
+vn 0.675238 0.725218 0.134583
+v 0.187101 0.139718 0.045900 0.752941 0.752941 0.752941
+vn 0.688802 0.724950 0.000001
+v 0.191607 0.139718 0.000001 0.752941 0.752941 0.752941
+vn 0.804275 0.572218 0.160337
+v 0.191059 0.134936 0.046723 0.752941 0.752941 0.752941
+vn 0.820356 0.571854 -0.000003
+v 0.195645 0.134936 0.000001 0.752941 0.752941 0.752941
+vn 0.869035 0.463428 0.173243
+v 0.194838 0.128242 0.047509 0.752941 0.752941 0.752941
+vn 0.886299 0.463113 0.000004
+v 0.199501 0.128242 0.000001 0.752941 0.752941 0.752941
+vn -0.863779 -0.353110 -0.359442
+v 0.167091 0.128242 0.085417 0.752941 0.752941 0.752941
+vn -0.897733 -0.233880 -0.373330
+v 0.164766 0.134936 0.084428 0.752941 0.752941 0.752941
+vn -0.914956 0.134694 -0.380411
+v 0.164291 0.139718 0.084226 0.752941 0.752941 0.752941
+vn -0.642621 0.718058 -0.267265
+v 0.165326 0.142587 0.084667 0.752941 0.752941 0.752941
+vn -0.026266 0.999593 -0.011109
+v 0.167540 0.143544 0.085609 0.752941 0.752941 0.752941
+vn 0.417873 0.891743 0.173715
+v 0.170592 0.142587 0.086907 0.752941 0.752941 0.752941
+vn 0.635242 0.725725 0.264181
+v 0.174149 0.139718 0.088421 0.752941 0.752941 0.752941
+vn 0.756882 0.572742 0.314796
+v 0.177873 0.134936 0.090004 0.752941 0.752941 0.752941
+vn 0.817887 0.464038 0.340191
+v 0.181431 0.128242 0.091518 0.752941 0.752941 0.752941
+vn -0.777111 -0.353350 -0.520810
+v 0.147232 0.128242 0.122413 0.752941 0.752941 0.752941
+vn -0.807678 -0.234129 -0.541146
+v 0.145138 0.134936 0.120996 0.752941 0.752941 0.752941
+vn -0.823208 0.134920 -0.551476
+v 0.144710 0.139718 0.120705 0.752941 0.752941 0.752941
+vn -0.578061 0.718210 -0.387325
+v 0.145643 0.142587 0.121338 0.752941 0.752941 0.752941
+vn -0.023997 0.999581 -0.016176
+v 0.147636 0.143544 0.122686 0.752941 0.752941 0.752941
+vn 0.375545 0.892007 0.251576
+v 0.150388 0.142587 0.124548 0.752941 0.752941 0.752941
+vn 0.571163 0.726177 0.382674
+v 0.153593 0.139718 0.126717 0.752941 0.752941 0.752941
+vn 0.680748 0.573188 0.456111
+v 0.156949 0.134936 0.128988 0.752941 0.752941 0.752941
+vn 0.735735 0.464417 0.492962
+v 0.160154 0.128242 0.131157 0.752941 0.752941 0.752941
+vn -0.661425 -0.353623 -0.661414
+v 0.120846 0.128242 0.154513 0.752941 0.752941 0.752941
+vn -0.687425 -0.234347 -0.687407
+v 0.119057 0.134936 0.152723 0.752941 0.752941 0.752941
+vn -0.700626 0.135001 -0.700641
+v 0.118690 0.139718 0.152357 0.752941 0.752941 0.752941
+vn -0.491911 0.718363 -0.491912
+v 0.119488 0.142587 0.153155 0.752941 0.752941 0.752941
+vn -0.020434 0.999582 -0.020431
+v 0.121190 0.143544 0.154858 0.752941 0.752941 0.752941
+vn 0.319514 0.892088 0.319514
+v 0.123541 0.142587 0.157206 0.752941 0.752941 0.752941
+vn 0.485984 0.726379 0.485997
+v 0.126279 0.139718 0.159944 0.752941 0.752941 0.752941
+vn 0.579340 0.573357 0.579333
+v 0.129146 0.134936 0.162811 0.752941 0.752941 0.752941
+vn 0.626179 0.464542 0.626179
+v 0.131882 0.128242 0.165549 0.752941 0.752941 0.752941
+vn -0.520796 -0.353342 -0.777123
+v 0.088746 0.128242 0.180899 0.752941 0.752941 0.752941
+vn -0.541115 -0.234237 -0.807668
+v 0.087329 0.134936 0.178805 0.752941 0.752941 0.752941
+vn -0.551494 0.134968 -0.823188
+v 0.087039 0.139718 0.178375 0.752941 0.752941 0.752941
+vn -0.387241 0.718324 -0.577975
+v 0.087671 0.142587 0.179310 0.752941 0.752941 0.752941
+vn -0.016147 0.999583 -0.023931
+v 0.089019 0.143544 0.181303 0.752941 0.752941 0.752941
+vn 0.251576 0.892003 0.375552
+v 0.090881 0.142587 0.184053 0.752941 0.752941 0.752941
+vn 0.382652 0.726211 0.571134
+v 0.093050 0.139718 0.187259 0.752941 0.752941 0.752941
+vn 0.456099 0.573233 0.680718
+v 0.095321 0.134936 0.190615 0.752941 0.752941 0.752941
+vn 0.492948 0.464460 0.735716
+v 0.097490 0.128242 0.193821 0.752941 0.752941 0.752941
+vn -0.359457 -0.353015 -0.863812
+v 0.051751 0.128242 0.200757 0.752941 0.752941 0.752941
+vn -0.373308 -0.233999 -0.897711
+v 0.050762 0.134936 0.198433 0.752941 0.752941 0.752941
+vn -0.380441 0.134731 -0.914938
+v 0.050560 0.139718 0.197956 0.752941 0.752941 0.752941
+vn -0.267228 0.718110 -0.642579
+v 0.051000 0.142587 0.198993 0.752941 0.752941 0.752941
+vn -0.011164 0.999589 -0.026421
+v 0.051942 0.143544 0.201205 0.752941 0.752941 0.752941
+vn 0.173726 0.891731 0.417893
+v 0.053240 0.142587 0.204258 0.752941 0.752941 0.752941
+vn 0.264157 0.725804 0.635161
+v 0.054754 0.139718 0.207814 0.752941 0.752941 0.752941
+vn 0.314783 0.572816 0.756831
+v 0.056339 0.134936 0.211540 0.752941 0.752941 0.752941
+vn 0.340195 0.464006 0.817904
+v 0.057853 0.128242 0.215097 0.752941 0.752941 0.752941
+vn -0.183103 -0.352735 -0.917634
+v 0.010674 0.128242 0.213271 0.752941 0.752941 0.752941
+vn -0.190049 -0.233665 -0.953563
+v 0.010162 0.134936 0.210800 0.752941 0.752941 0.752941
+vn -0.193594 0.134646 -0.971798
+v 0.010056 0.139718 0.210295 0.752941 0.752941 0.752941
+vn -0.136107 0.717766 -0.682852
+v 0.010285 0.142587 0.211396 0.752941 0.752941 0.752941
+vn -0.005761 0.999590 -0.028044
+v 0.010774 0.143544 0.213746 0.752941 0.752941 0.752941
+vn 0.088497 0.891474 0.444345
+v 0.011448 0.142587 0.216989 0.752941 0.752941 0.752941
+vn 0.134574 0.725289 0.675163
+v 0.012234 0.139718 0.220768 0.752941 0.752941 0.752941
+vn 0.160336 0.572163 0.804314
+v 0.013056 0.134936 0.224726 0.752941 0.752941 0.752941
+vn 0.173243 0.463398 0.869051
+v 0.013842 0.128242 0.228504 0.752941 0.752941 0.752941
+vn -0.002687 -0.353135 -0.935569
+v -0.033666 0.128242 0.217624 0.752941 0.752941 0.752941
+vn -0.002300 -0.233750 -0.972294
+v -0.033666 0.134936 0.215103 0.752941 0.752941 0.752941
+vn -0.001473 0.134135 -0.990962
+v -0.033666 0.139718 0.214587 0.752941 0.752941 0.752941
+vn -0.000630 0.717219 -0.696848
+v -0.033666 0.142587 0.215710 0.752941 0.752941 0.752941
+vn -0.000053 0.999583 -0.028883
+v -0.033666 0.143544 0.218109 0.752941 0.752941 0.752941
+vn 0.000055 0.891354 0.453309
+v -0.033666 0.142587 0.221418 0.752941 0.752941 0.752941
+vn 0.000027 0.724984 0.688766
+v -0.033666 0.139718 0.225274 0.752941 0.752941 0.752941
+vn 0.000006 0.571805 0.820390
+v -0.033666 0.134936 0.229312 0.752941 0.752941 0.752941
+vn 0.000004 0.463059 0.886327
+v -0.033666 0.128242 0.233167 0.752941 0.752941 0.752941
+vn 0.182802 -0.385403 -0.904460
+v -0.082024 0.128242 0.213271 0.752941 0.752941 0.752941
+vn 0.182293 -0.268531 -0.945865
+v -0.080183 0.134936 0.210800 0.752941 0.752941 0.752941
+vn 0.190920 0.093440 -0.977148
+v -0.079083 0.139718 0.210295 0.752941 0.752941 0.752941
+vn 0.133770 0.698810 -0.702688
+v -0.078597 0.142587 0.211396 0.752941 0.752941 0.752941
+vn 0.003374 0.999476 -0.032180
+v -0.078607 0.143544 0.213746 0.752941 0.752941 0.752941
+vn -0.089007 0.889629 0.447927
+v -0.078992 0.142587 0.216989 0.752941 0.752941 0.752941
+vn -0.134512 0.723649 0.676933
+v -0.079628 0.139718 0.220768 0.752941 0.752941 0.752941
+vn -0.160233 0.571590 0.804743
+v -0.080396 0.134936 0.224726 0.752941 0.752941 0.752941
+vn -0.173226 0.463329 0.869091
+v -0.081174 0.128242 0.228504 0.752941 0.752941 0.752941
+vn 0.351441 -0.441178 -0.825743
+v -0.124985 0.128242 0.200757 0.752941 0.752941 0.752941
+vn 0.357520 -0.333081 -0.872489
+v -0.122048 0.134936 0.198433 0.752941 0.752941 0.752941
+vn 0.381562 0.013418 -0.924246
+v -0.120381 0.139718 0.197956 0.752941 0.752941 0.752941
+vn 0.281686 0.658922 -0.697477
+v -0.119773 0.142587 0.198993 0.752941 0.752941 0.752941
+vn 0.011229 0.999178 -0.038946
+v -0.120011 0.143544 0.201205 0.752941 0.752941 0.752941
+vn -0.177549 0.886275 0.427776
+v -0.120883 0.142587 0.204258 0.752941 0.752941 0.752941
+vn -0.265587 0.721013 0.640003
+v -0.122178 0.139718 0.207814 0.752941 0.752941 0.752941
+vn -0.314999 0.571125 0.758018
+v -0.123682 0.134936 0.211540 0.752941 0.752941 0.752941
+vn -0.340198 0.463788 0.818026
+v -0.125184 0.128242 0.215097 0.752941 0.752941 0.752941
+vn 0.500463 -0.481354 -0.719607
+v -0.162227 0.128242 0.180899 0.752941 0.752941 0.752941
+vn 0.516917 -0.382448 -0.765853
+v -0.158779 0.134936 0.178805 0.752941 0.752941 0.752941
+vn 0.558565 -0.051072 -0.827887
+v -0.156964 0.139718 0.178375 0.752941 0.752941 0.752941
+vn 0.431812 0.622315 -0.652888
+v -0.156504 0.142587 0.179310 0.752941 0.752941 0.752941
+vn 0.023211 0.998815 -0.042766
+v -0.157120 0.143544 0.181303 0.752941 0.752941 0.752941
+vn -0.260613 0.883578 0.389064
+v -0.158537 0.142587 0.184053 0.752941 0.752941 0.752941
+vn -0.386578 0.718939 0.577654
+v -0.160479 0.139718 0.187259 0.752941 0.752941 0.752941
+vn -0.456920 0.570674 0.682316
+v -0.162666 0.134936 0.190615 0.752941 0.752941 0.752941
+vn -0.493016 0.464131 0.735879
+v -0.164823 0.128242 0.193821 0.752941 0.752941 0.752941
+vn 0.632679 -0.489920 -0.599747
+v -0.193424 0.128242 0.154513 0.752941 0.752941 0.752941
+vn 0.658967 -0.395242 -0.639958
+v -0.189903 0.134936 0.152723 0.752941 0.752941 0.752941
+vn 0.712617 -0.067931 -0.698257
+v -0.188236 0.139718 0.152357 0.752941 0.752941 0.752941
+vn 0.559999 0.611232 -0.559282
+v -0.188101 0.142587 0.153155 0.752941 0.752941 0.752941
+vn 0.034172 0.998674 -0.038497
+v -0.189178 0.143544 0.154858 0.752941 0.752941 0.752941
+vn -0.332347 0.882864 0.331808
+v -0.191150 0.142587 0.157206 0.752941 0.752941 0.752941
+vn -0.491855 0.718383 0.491940
+v -0.193693 0.139718 0.159944 0.752941 0.752941 0.752941
+vn -0.580632 0.570587 0.580772
+v -0.196487 0.134936 0.162811 0.752941 0.752941 0.752941
+vn -0.626276 0.464263 0.626290
+v -0.199215 0.128242 0.165549 0.752941 0.752941 0.752941
+vn 0.750359 -0.466477 -0.468360
+v -0.218253 0.128242 0.122413 0.752941 0.752941 0.752941
+vn 0.783666 -0.369370 -0.499433
+v -0.214941 0.134936 0.120996 0.752941 0.752941 0.752941
+vn 0.838652 -0.032570 -0.543692
+v -0.213598 0.139718 0.120705 0.752941 0.752941 0.752941
+vn 0.646985 0.631354 -0.427555
+v -0.213876 0.142587 0.121338 0.752941 0.752941 0.752941
+vn 0.038603 0.998879 -0.027392
+v -0.215429 0.143544 0.122686 0.752941 0.752941 0.752941
+vn -0.388041 0.884473 0.259099
+v -0.217913 0.142587 0.124548 0.752941 0.752941 0.752941
+vn -0.576974 0.719643 0.386284
+v -0.220982 0.139718 0.126717 0.752941 0.752941 0.752941
+vn -0.682089 0.570885 0.456997
+v -0.224288 0.134936 0.128988 0.752941 0.752941 0.752941
+vn -0.735854 0.464140 0.493044
+v -0.227486 0.128242 0.131157 0.752941 0.752941 0.752941
+vn 0.847721 -0.421113 -0.322541
+v -0.236391 0.128242 0.085417 0.752941 0.752941 0.752941
+vn 0.884475 -0.316289 -0.343023
+v -0.233416 0.134936 0.084428 0.752941 0.752941 0.752941
+vn 0.928672 0.036019 -0.369149
+v -0.232452 0.139718 0.084226 0.752941 0.752941 0.752941
+vn 0.688877 0.668893 -0.279339
+v -0.233139 0.142587 0.084667 0.752941 0.752941 0.752941
+vn 0.036067 0.999235 -0.015128
+v -0.235117 0.143544 0.085609 0.752941 0.752941 0.752941
+vn -0.426065 0.887356 0.176263
+v -0.238028 0.142587 0.086907 0.752941 0.752941 0.752941
+vn -0.639130 0.721856 0.265399
+v -0.241511 0.139718 0.088421 0.752941 0.752941 0.752941
+vn -0.757826 0.571327 0.315095
+v -0.245210 0.134936 0.090004 0.752941 0.752941 0.752941
+vn -0.818013 0.463789 0.340227
+v -0.248762 0.128242 0.091518 0.752941 0.752941 0.752941
+vn 0.913018 -0.373875 -0.163144
+v -0.247510 0.128242 0.044341 0.752941 0.752941 0.752941
+vn 0.949916 -0.260264 -0.172980
+v -0.244851 0.134936 0.043827 0.752941 0.752941 0.752941
+vn 0.977512 0.103516 -0.183724
+v -0.244203 0.139718 0.043722 0.752941 0.752941 0.752941
+vn 0.698675 0.702726 -0.134269
+v -0.245201 0.142587 0.043951 0.752941 0.752941 0.752941
+vn 0.031254 0.999493 -0.006041
+v -0.247485 0.143544 0.044440 0.752941 0.752941 0.752941
+vn -0.447080 0.890111 0.088439
+v -0.250686 0.142587 0.045114 0.752941 0.752941 0.752941
+vn -0.676582 0.723978 0.134510
+v -0.254443 0.139718 0.045900 0.752941 0.752941 0.752941
+vn -0.804673 0.571665 0.160315
+v -0.258392 0.134936 0.046723 0.752941 0.752941 0.752941
+vn -0.869080 0.463342 0.173242
+v -0.262169 0.128242 0.047509 0.752941 0.752941 0.752941
+vn 0.935819 -0.352431 0.005880
+v -0.251289 0.128242 0.000001 0.752941 0.752941 0.752941
+vn 0.972244 -0.233914 0.005169
+v -0.248768 0.134936 0.000001 0.752941 0.752941 0.752941
+vn 0.990985 0.133927 0.003521
+v -0.248253 0.139718 0.000001 0.752941 0.752941 0.752941
+vn 0.697127 0.716945 0.001629
+v -0.249376 0.142587 0.000001 0.752941 0.752941 0.752941
+vn 0.029014 0.999579 0.000138
+v -0.251775 0.143544 0.000001 0.752941 0.752941 0.752941
+vn -0.453282 0.891367 -0.000215
+v -0.255083 0.142587 0.000001 0.752941 0.752941 0.752941
+vn -0.688790 0.724961 -0.000123
+v -0.258940 0.139718 0.000001 0.752941 0.752941 0.752941
+vn -0.820435 0.571739 -0.000029
+v -0.262977 0.134936 0.000001 0.752941 0.752941 0.752941
+vn -0.886323 0.463067 -0.000002
+v -0.266832 0.128242 0.000001 0.752941 0.752941 0.752941
+vn 0.917676 -0.352626 0.183099
+v -0.246936 0.128242 -0.044340 0.752941 0.752941 0.752941
+vn 0.953581 -0.233605 0.190032
+v -0.244466 0.134936 -0.043827 0.752941 0.752941 0.752941
+vn 0.971792 0.134674 0.193606
+v -0.243961 0.139718 -0.043722 0.752941 0.752941 0.752941
+vn 0.682854 0.717764 0.136107
+v -0.245062 0.142587 -0.043951 0.752941 0.752941 0.752941
+vn 0.028043 0.999590 0.005759
+v -0.247412 0.143544 -0.044440 0.752941 0.752941 0.752941
+vn -0.444349 0.891471 -0.088500
+v -0.250655 0.142587 -0.045114 0.752941 0.752941 0.752941
+vn -0.675165 0.725286 -0.134581
+v -0.254434 0.139718 -0.045900 0.752941 0.752941 0.752941
+vn -0.804356 0.572106 -0.160333
+v -0.258392 0.134936 -0.046721 0.752941 0.752941 0.752941
+vn -0.869070 0.463362 -0.173242
+v -0.262169 0.128242 -0.047507 0.752941 0.752941 0.752941
+vn 0.863838 -0.352908 0.359498
+v -0.234422 0.128242 -0.085417 0.752941 0.752941 0.752941
+vn 0.897720 -0.233947 0.373319
+v -0.232099 0.134936 -0.084428 0.752941 0.752941 0.752941
+vn 0.914943 0.134680 0.380447
+v -0.231622 0.139718 -0.084226 0.752941 0.752941 0.752941
+vn 0.642619 0.718070 0.267238
+v -0.232659 0.142587 -0.084665 0.752941 0.752941 0.752941
+vn 0.026422 0.999588 0.011168
+v -0.234871 0.143544 -0.085607 0.752941 0.752941 0.752941
+vn -0.417898 0.891731 -0.173717
+v -0.237924 0.142587 -0.086905 0.752941 0.752941 0.752941
+vn -0.635162 0.725804 -0.264155
+v -0.241480 0.139718 -0.088419 0.752941 0.752941 0.752941
+vn -0.756858 0.572776 -0.314793
+v -0.245206 0.134936 -0.090004 0.752941 0.752941 0.752941
+vn -0.817921 0.463971 -0.340200
+v -0.248762 0.128242 -0.091518 0.752941 0.752941 0.752941
+vn 0.777049 -0.353570 0.520753
+v -0.214565 0.128242 -0.122413 0.752941 0.752941 0.752941
+vn 0.807675 -0.234213 0.541115
+v -0.212470 0.134936 -0.120994 0.752941 0.752941 0.752941
+vn 0.823191 0.134900 0.551505
+v -0.212041 0.139718 -0.120705 0.752941 0.752941 0.752941
+vn 0.578018 0.718279 0.387261
+v -0.212975 0.142587 -0.121336 0.752941 0.752941 0.752941
+vn 0.023848 0.999586 0.016095
+v -0.214969 0.143544 -0.122686 0.752941 0.752941 0.752941
+vn -0.375612 0.891969 -0.251610
+v -0.217720 0.142587 -0.124548 0.752941 0.752941 0.752941
+vn -0.571148 0.726190 -0.382673
+v -0.220924 0.139718 -0.126717 0.752941 0.752941 0.752941
+vn -0.680742 0.573211 -0.456093
+v -0.224282 0.134936 -0.128987 0.752941 0.752941 0.752941
+vn -0.735751 0.464387 -0.492965
+v -0.227486 0.128242 -0.131156 0.752941 0.752941 0.752941
+vn 0.661434 -0.353557 0.661440
+v -0.188178 0.128242 -0.154511 0.752941 0.752941 0.752941
+vn 0.687416 -0.234238 0.687453
+v -0.186388 0.134936 -0.152723 0.752941 0.752941 0.752941
+vn 0.700628 0.135069 0.700626
+v -0.186023 0.139718 -0.152356 0.752941 0.752941 0.752941
+vn 0.491934 0.718331 0.491936
+v -0.186821 0.142587 -0.153154 0.752941 0.752941 0.752941
+vn 0.020492 0.999580 0.020484
+v -0.188523 0.143544 -0.154856 0.752941 0.752941 0.752941
+vn -0.319525 0.892080 -0.319527
+v -0.190873 0.142587 -0.157206 0.752941 0.752941 0.752941
+vn -0.486008 0.726352 -0.486013
+v -0.193610 0.139718 -0.159944 0.752941 0.752941 0.752941
+vn -0.579304 0.573423 -0.579304
+v -0.196477 0.134936 -0.162811 0.752941 0.752941 0.752941
+vn -0.626164 0.464592 -0.626157
+v -0.199215 0.128242 -0.165549 0.752941 0.752941 0.752941
+vn 0.520761 -0.353604 0.777028
+v -0.156079 0.128242 -0.180899 0.752941 0.752941 0.752941
+vn 0.541130 -0.234262 0.807651
+v -0.154661 0.134936 -0.178803 0.752941 0.752941 0.752941
+vn 0.551468 0.134915 0.823214
+v -0.154370 0.139718 -0.178375 0.752941 0.752941 0.752941
+vn 0.387278 0.718283 0.578001
+v -0.155003 0.142587 -0.179308 0.752941 0.752941 0.752941
+vn 0.016097 0.999585 0.023870
+v -0.156352 0.143544 -0.181302 0.752941 0.752941 0.752941
+vn -0.251570 0.892008 -0.375545
+v -0.158213 0.142587 -0.184053 0.752941 0.752941 0.752941
+vn -0.382635 0.726232 -0.571120
+v -0.160382 0.139718 -0.187259 0.752941 0.752941 0.752941
+vn -0.456090 0.573259 -0.680703
+v -0.162654 0.134936 -0.190615 0.752941 0.752941 0.752941
+vn -0.492955 0.464445 -0.735721
+v -0.164823 0.128242 -0.193821 0.752941 0.752941 0.752941
+vn 0.359437 -0.353113 0.863780
+v -0.119082 0.128242 -0.200757 0.752941 0.752941 0.752941
+vn 0.373319 -0.233974 0.897713
+v -0.118093 0.134936 -0.198432 0.752941 0.752941 0.752941
+vn 0.380433 0.134746 0.914939
+v -0.117891 0.139718 -0.197956 0.752941 0.752941 0.752941
+vn 0.267250 0.718100 0.642580
+v -0.118332 0.142587 -0.198992 0.752941 0.752941 0.752941
+vn 0.011148 0.999590 0.026375
+v -0.119274 0.143544 -0.201205 0.752941 0.752941 0.752941
+vn -0.173734 0.891725 -0.417902
+v -0.120573 0.142587 -0.204258 0.752941 0.752941 0.752941
+vn -0.264171 0.725751 -0.635216
+v -0.122086 0.139718 -0.207814 0.752941 0.752941 0.752941
+vn -0.314787 0.572802 -0.756841
+v -0.123671 0.134936 -0.211539 0.752941 0.752941 0.752941
+vn -0.340173 0.464025 -0.817902
+v -0.125184 0.128242 -0.215097 0.752941 0.752941 0.752941
+vn 0.183123 -0.352540 0.917704
+v -0.078007 0.128242 -0.213269 0.752941 0.752941 0.752941
+vn 0.190038 -0.233551 0.953593
+v -0.077493 0.134936 -0.210800 0.752941 0.752941 0.752941
+vn 0.193618 0.134639 0.971794
+v -0.077388 0.139718 -0.210295 0.752941 0.752941 0.752941
+vn 0.136103 0.717745 0.682875
+v -0.077616 0.142587 -0.211396 0.752941 0.752941 0.752941
+vn 0.005761 0.999590 0.028042
+v -0.078105 0.143544 -0.213746 0.752941 0.752941 0.752941
+vn -0.088505 0.891446 -0.444400
+v -0.078779 0.142587 -0.216989 0.752941 0.752941 0.752941
+vn -0.134566 0.725257 -0.675199
+v -0.079565 0.139718 -0.220767 0.752941 0.752941 0.752941
+vn -0.160324 0.572218 -0.804278
+v -0.080388 0.134936 -0.224725 0.752941 0.752941 0.752941
+vn -0.173246 0.463425 -0.869035
+v -0.081174 0.128242 -0.228504 0.752941 0.752941 0.752941
+vn -0.000003 -0.352197 0.935926
+v -0.033666 0.128242 -0.217622 0.752941 0.752941 0.752941
+vn 0.000002 -0.233364 0.972390
+v -0.033666 0.134936 -0.215103 0.752941 0.752941 0.752941
+vn 0.000006 0.134400 0.990927
+v -0.033666 0.139718 -0.214587 0.752941 0.752941 0.752941
+vn 0.000003 0.717349 0.696714
+v -0.033666 0.142587 -0.215710 0.752941 0.752941 0.752941
+vn 0.000001 0.999582 0.028911
+v -0.033666 0.143544 -0.218108 0.752941 0.752941 0.752941
+vn 0.000000 0.891344 -0.453327
+v -0.033666 0.142587 -0.221418 0.752941 0.752941 0.752941
+vn -0.000008 0.724909 -0.688845
+v -0.033666 0.139718 -0.225273 0.752941 0.752941 0.752941
+vn -0.000002 0.571854 -0.820356
+v -0.033666 0.134936 -0.229310 0.752941 0.752941 0.752941
+vn 0.000005 0.463148 -0.886281
+v -0.033666 0.128242 -0.233167 0.752941 0.752941 0.752941
+vn -0.183113 -0.352503 0.917721
+v 0.010674 0.128242 -0.213269 0.752941 0.752941 0.752941
+vn -0.190058 -0.233540 0.953591
+v 0.010162 0.134936 -0.210800 0.752941 0.752941 0.752941
+vn -0.193610 0.134648 0.971795
+v 0.010056 0.139718 -0.210295 0.752941 0.752941 0.752941
+vn -0.136111 0.717766 0.682852
+v 0.010285 0.142587 -0.211396 0.752941 0.752941 0.752941
+vn -0.005761 0.999590 0.028042
+v 0.010774 0.143544 -0.213746 0.752941 0.752941 0.752941
+vn 0.088508 0.891445 -0.444400
+v 0.011448 0.142587 -0.216989 0.752941 0.752941 0.752941
+vn 0.134584 0.725251 -0.675202
+v 0.012234 0.139718 -0.220767 0.752941 0.752941 0.752941
+vn 0.160324 0.572207 -0.804286
+v 0.013056 0.134936 -0.224725 0.752941 0.752941 0.752941
+vn 0.173235 0.463429 -0.869036
+v 0.013842 0.128242 -0.228504 0.752941 0.752941 0.752941
+vn -0.359440 -0.353121 0.863776
+v 0.051751 0.128242 -0.200757 0.752941 0.752941 0.752941
+vn -0.373318 -0.233966 0.897716
+v 0.050762 0.134936 -0.198432 0.752941 0.752941 0.752941
+vn -0.380439 0.134687 0.914946
+v 0.050560 0.139718 -0.197956 0.752941 0.752941 0.752941
+vn -0.267260 0.718062 0.642618
+v 0.051000 0.142587 -0.198992 0.752941 0.752941 0.752941
+vn -0.011143 0.999590 0.026361
+v 0.051942 0.143544 -0.201205 0.752941 0.752941 0.752941
+vn 0.173718 0.891732 -0.417896
+v 0.053240 0.142587 -0.204258 0.752941 0.752941 0.752941
+vn 0.264166 0.725761 -0.635206
+v 0.054754 0.139718 -0.207814 0.752941 0.752941 0.752941
+vn 0.314785 0.572822 -0.756826
+v 0.056339 0.134936 -0.211539 0.752941 0.752941 0.752941
+vn 0.340186 0.464035 -0.817891
+v 0.057853 0.128242 -0.215097 0.752941 0.752941 0.752941
+vn -0.520751 -0.353532 0.777067
+v 0.088746 0.128242 -0.180899 0.752941 0.752941 0.752941
+vn -0.541137 -0.234179 0.807670
+v 0.087329 0.134936 -0.178803 0.752941 0.752941 0.752941
+vn -0.551492 0.134888 0.823202
+v 0.087039 0.139718 -0.178375 0.752941 0.752941 0.752941
+vn -0.387329 0.718195 0.578077
+v 0.087671 0.142587 -0.179308 0.752941 0.752941 0.752941
+vn -0.016131 0.999584 0.023918
+v 0.089019 0.143544 -0.181302 0.752941 0.752941 0.752941
+vn 0.251565 0.892018 -0.375525
+v 0.090881 0.142587 -0.184053 0.752941 0.752941 0.752941
+vn 0.382650 0.726208 -0.571140
+v 0.093050 0.139718 -0.187259 0.752941 0.752941 0.752941
+vn 0.456096 0.573231 -0.680722
+v 0.095321 0.134936 -0.190615 0.752941 0.752941 0.752941
+vn 0.492954 0.464455 -0.735716
+v 0.097490 0.128242 -0.193821 0.752941 0.752941 0.752941
+vn -0.661476 -0.353468 0.661446
+v 0.120846 0.128242 -0.154511 0.752941 0.752941 0.752941
+vn -0.687413 -0.234325 0.687426
+v 0.119057 0.134936 -0.152723 0.752941 0.752941 0.752941
+vn -0.700634 0.134925 0.700648
+v 0.118690 0.139718 -0.152356 0.752941 0.752941 0.752941
+vn -0.491938 0.718329 0.491936
+v 0.119488 0.142587 -0.153154 0.752941 0.752941 0.752941
+vn -0.020511 0.999579 0.020510
+v 0.121190 0.143544 -0.154856 0.752941 0.752941 0.752941
+vn 0.319481 0.892111 -0.319484
+v 0.123541 0.142587 -0.157206 0.752941 0.752941 0.752941
+vn 0.485992 0.726379 -0.485990
+v 0.126279 0.139718 -0.159944 0.752941 0.752941 0.752941
+vn 0.579341 0.573355 -0.579334
+v 0.129146 0.134936 -0.162811 0.752941 0.752941 0.752941
+vn 0.626178 0.464535 -0.626186
+v 0.131882 0.128242 -0.165549 0.752941 0.752941 0.752941
+vn -0.777063 -0.353478 0.520794
+v 0.147232 0.128242 -0.122413 0.752941 0.752941 0.752941
+vn -0.807702 -0.234081 0.541132
+v 0.145138 0.134936 -0.120994 0.752941 0.752941 0.752941
+vn -0.823203 0.134846 0.551501
+v 0.144710 0.139718 -0.120705 0.752941 0.752941 0.752941
+vn -0.578113 0.718161 0.387337
+v 0.145643 0.142587 -0.121336 0.752941 0.752941 0.752941
+vn -0.023924 0.999583 0.016147
+v 0.147636 0.143544 -0.122686 0.752941 0.752941 0.752941
+vn 0.375546 0.892007 -0.251571
+v 0.150388 0.142587 -0.124548 0.752941 0.752941 0.752941
+vn 0.571183 0.726152 -0.382692
+v 0.153593 0.139718 -0.126717 0.752941 0.752941 0.752941
+vn 0.680758 0.573173 -0.456115
+v 0.156949 0.134936 -0.128987 0.752941 0.752941 0.752941
+vn 0.735735 0.464415 -0.492964
+v 0.160154 0.128242 -0.131156 0.752941 0.752941 0.752941
+vn -0.863773 -0.353111 0.359458
+v 0.167091 0.128242 -0.085417 0.752941 0.752941 0.752941
+vn -0.897732 -0.233888 0.373329
+v 0.164766 0.134936 -0.084428 0.752941 0.752941 0.752941
+vn -0.914955 0.134597 0.380448
+v 0.164291 0.139718 -0.084226 0.752941 0.752941 0.752941
+vn -0.642703 0.717974 0.267297
+v 0.165326 0.142587 -0.084665 0.752941 0.752941 0.752941
+vn -0.026273 0.999593 0.011097
+v 0.167540 0.143544 -0.085607 0.752941 0.752941 0.752941
+vn 0.417874 0.891743 -0.173711
+v 0.170592 0.142587 -0.086905 0.752941 0.752941 0.752941
+vn 0.635210 0.725761 -0.264160
+v 0.174149 0.139718 -0.088419 0.752941 0.752941 0.752941
+vn 0.756860 0.572774 -0.314791
+v 0.177873 0.134936 -0.090004 0.752941 0.752941 0.752941
+vn 0.817891 0.464037 -0.340181
+v 0.181431 0.128242 -0.091518 0.752941 0.752941 0.752941
+vn -0.917714 -0.352523 0.183110
+v 0.179604 0.128242 -0.044340 0.752941 0.752941 0.752941
+vn -0.953550 -0.233733 0.190030
+v 0.177135 0.134936 -0.043827 0.752941 0.752941 0.752941
+vn -0.971779 0.134780 0.193600
+v 0.176628 0.139718 -0.043722 0.752941 0.752941 0.752941
+vn -0.682658 0.717960 0.136054
+v 0.177731 0.142587 -0.043951 0.752941 0.752941 0.752941
+vn -0.028038 0.999590 0.005762
+v 0.180081 0.143544 -0.044440 0.752941 0.752941 0.752941
+vn 0.444457 0.891416 -0.088521
+v 0.183324 0.142587 -0.045114 0.752941 0.752941 0.752941
+vn 0.675249 0.725206 -0.134592
+v 0.187101 0.139718 -0.045900 0.752941 0.752941 0.752941
+vn 0.804293 0.572196 -0.160323
+v 0.191059 0.134936 -0.046721 0.752941 0.752941 0.752941
+vn 0.869032 0.463433 -0.173244
+v 0.194838 0.128242 -0.047507 0.752941 0.752941 0.752941
+vn 0.888285 0.423785 0.177077
+v 0.209044 0.097662 0.050462 0.752941 0.752941 0.752941
+vn 0.905909 0.423473 0.000001
+v 0.213999 0.097661 0.000001 0.752941 0.752941 0.752941
+vn 0.894909 0.409037 0.178400
+v 0.222805 0.067217 0.053323 0.752941 0.752941 0.752941
+vn 0.912661 0.408718 -0.000003
+v 0.228040 0.067217 0.000001 0.752941 0.752941 0.752941
+vn 0.905784 0.383337 0.180577
+v 0.235674 0.037047 0.055999 0.752941 0.752941 0.752941
+vn 0.923738 0.383024 -0.000005
+v 0.241171 0.037047 0.000001 0.752941 0.752941 0.752941
+vn 0.920558 0.344808 0.183522
+v 0.247204 0.007286 0.058395 0.752941 0.752941 0.752941
+vn 0.938777 0.344525 -0.000001
+v 0.252935 0.007286 0.000001 0.752941 0.752941 0.752941
+vn 0.938360 0.290665 0.187070
+v 0.256948 -0.021927 0.060421 0.752941 0.752941 0.752941
+vn 0.956891 0.290447 0.000007
+v 0.262878 -0.021927 0.000001 0.752941 0.752941 0.752941
+vn 0.957287 0.217192 0.190862
+v 0.264460 -0.050459 0.061984 0.752941 0.752941 0.752941
+vn 0.976168 0.217017 0.000003
+v 0.270545 -0.050459 0.000001 0.752941 0.752941 0.752941
+vn 0.973603 0.120062 0.194119
+v 0.269295 -0.078170 0.062988 0.752941 0.752941 0.752941
+vn 0.992778 0.119965 0.000002
+v 0.275478 -0.078170 0.000001 0.752941 0.752941 0.752941
+vn 0.980102 -0.034653 0.195445
+v 0.271005 -0.104925 0.063345 0.752941 0.752941 0.752941
+vn 0.999400 -0.034631 -0.000000
+v 0.277224 -0.104925 0.000001 0.752941 0.752941 0.752941
+vn 0.836070 0.424341 0.347738
+v 0.194804 0.097661 0.097208 0.752941 0.752941 0.752941
+vn 0.842330 0.409571 0.350330
+v 0.207758 0.067217 0.102719 0.752941 0.752941 0.752941
+vn 0.852597 0.383833 0.354613
+v 0.219871 0.037047 0.107874 0.752941 0.752941 0.752941
+vn 0.866534 0.345279 0.360418
+v 0.230723 0.007286 0.112491 0.752941 0.752941 0.752941
+vn 0.883326 0.291101 0.367418
+v 0.239896 -0.021927 0.116394 0.752941 0.752941 0.752941
+vn 0.901202 0.217519 0.374860
+v 0.246968 -0.050459 0.119403 0.752941 0.752941 0.752941
+vn 0.916606 0.120263 0.381273
+v 0.251519 -0.078170 0.121339 0.752941 0.752941 0.752941
+vn 0.922745 -0.034704 0.383845
+v 0.253130 -0.104925 0.122024 0.752941 0.752941 0.752941
+vn 0.752092 0.424760 0.503922
+v 0.172204 0.097661 0.139311 0.752941 0.752941 0.752941
+vn 0.757734 0.409978 0.507698
+v 0.183878 0.067217 0.147210 0.752941 0.752941 0.752941
+vn 0.766987 0.384227 0.513907
+v 0.194792 0.037047 0.154596 0.752941 0.752941 0.752941
+vn 0.779556 0.345642 0.522325
+v 0.204572 0.007286 0.161214 0.752941 0.752941 0.752941
+vn 0.794706 0.291397 0.532475
+v 0.212837 -0.021927 0.166806 0.752941 0.752941 0.752941
+vn 0.810818 0.217764 0.543280
+v 0.219209 -0.050459 0.171118 0.752941 0.752941 0.752941
+vn 0.824706 0.120409 0.552595
+v 0.223310 -0.078170 0.173893 0.752941 0.752941 0.752941
+vn 0.830241 -0.034739 0.556321
+v 0.224762 -0.104925 0.174875 0.752941 0.752941 0.752941
+vn 0.640106 0.424897 0.640100
+v 0.142175 0.097661 0.175842 0.752941 0.752941 0.752941
+vn 0.644898 0.410117 0.644912
+v 0.152145 0.067217 0.185812 0.752941 0.752941 0.752941
+vn 0.652785 0.384357 0.652795
+v 0.161468 0.037047 0.195134 0.752941 0.752941 0.752941
+vn 0.663484 0.345776 0.663496
+v 0.169821 0.007286 0.203487 0.752941 0.752941 0.752941
+vn 0.676394 0.291523 0.676391
+v 0.176881 -0.021927 0.210546 0.752941 0.752941 0.752941
+vn 0.690128 0.217861 0.690116
+v 0.182324 -0.050459 0.215989 0.752941 0.752941 0.752941
+vn 0.701964 0.120444 0.701954
+v 0.185827 -0.078170 0.219492 0.752941 0.752941 0.752941
+vn 0.706681 -0.034774 0.706677
+v 0.187066 -0.104925 0.220731 0.752941 0.752941 0.752941
+vn 0.503933 0.424741 0.752095
+v 0.105646 0.097661 0.205871 0.752941 0.752941 0.752941
+vn 0.507704 0.409961 0.757739
+v 0.113543 0.067217 0.217543 0.752941 0.752941 0.752941
+vn 0.513904 0.384225 0.766990
+v 0.120929 0.037047 0.228458 0.752941 0.752941 0.752941
+vn 0.522327 0.345651 0.779551
+v 0.127547 0.007286 0.238237 0.752941 0.752941 0.752941
+vn 0.532471 0.291432 0.794696
+v 0.133140 -0.021927 0.246503 0.752941 0.752941 0.752941
+vn 0.543285 0.217769 0.810813
+v 0.137453 -0.050459 0.252876 0.752941 0.752941 0.752941
+vn 0.552599 0.120384 0.824707
+v 0.140228 -0.078170 0.256976 0.752941 0.752941 0.752941
+vn 0.556324 -0.034755 0.830239
+v 0.141210 -0.104925 0.258427 0.752941 0.752941 0.752941
+vn 0.347737 0.424336 0.836073
+v 0.063542 0.097661 0.228471 0.752941 0.752941 0.752941
+vn 0.350347 0.409559 0.842329
+v 0.069054 0.067217 0.241424 0.752941 0.752941 0.752941
+vn 0.354615 0.383840 0.852593
+v 0.074207 0.037047 0.253537 0.752941 0.752941 0.752941
+vn 0.360423 0.345283 0.866531
+v 0.078826 0.007286 0.264390 0.752941 0.752941 0.752941
+vn 0.367415 0.291097 0.883328
+v 0.082728 -0.021927 0.273562 0.752941 0.752941 0.752941
+vn 0.374849 0.217526 0.901205
+v 0.085736 -0.050459 0.280635 0.752941 0.752941 0.752941
+vn 0.381279 0.120235 0.916608
+v 0.087674 -0.078170 0.285185 0.752941 0.752941 0.752941
+vn 0.383850 -0.034690 0.922744
+v 0.088358 -0.104925 0.286795 0.752941 0.752941 0.752941
+vn 0.177064 0.423792 0.888284
+v 0.016795 0.097661 0.242712 0.752941 0.752941 0.752941
+vn 0.178395 0.409023 0.894916
+v 0.019656 0.067217 0.256472 0.752941 0.752941 0.752941
+vn 0.180573 0.383319 0.905792
+v 0.022332 0.037047 0.269340 0.752941 0.752941 0.752941
+vn 0.183521 0.344803 0.920560
+v 0.024729 0.007286 0.280869 0.752941 0.752941 0.752941
+vn 0.187074 0.290685 0.938353
+v 0.026756 -0.021927 0.290613 0.752941 0.752941 0.752941
+vn 0.190849 0.217205 0.957287
+v 0.028317 -0.050459 0.298127 0.752941 0.752941 0.752941
+vn 0.194120 0.120060 0.973603
+v 0.029323 -0.078170 0.302961 0.752941 0.752941 0.752941
+vn 0.195439 -0.034645 0.980104
+v 0.029678 -0.104925 0.304672 0.752941 0.752941 0.752941
+vn 0.000002 0.423475 0.905908
+v -0.033666 0.097661 0.247664 0.752941 0.752941 0.752941
+vn -0.000003 0.408723 0.912658
+v -0.033666 0.067217 0.261706 0.752941 0.752941 0.752941
+vn -0.000003 0.383032 0.923735
+v -0.033666 0.037047 0.274837 0.752941 0.752941 0.752941
+vn -0.000003 0.344534 0.938774
+v -0.033666 0.007286 0.286602 0.752941 0.752941 0.752941
+vn 0.000006 0.290424 0.956898
+v -0.033666 -0.021927 0.296545 0.752941 0.752941 0.752941
+vn 0.000002 0.217008 0.976170
+v -0.033666 -0.050459 0.304210 0.752941 0.752941 0.752941
+vn -0.000001 0.119964 0.992778
+v -0.033666 -0.078170 0.309144 0.752941 0.752941 0.752941
+vn 0.000003 -0.034627 0.999400
+v -0.033666 -0.104925 0.310889 0.752941 0.752941 0.752941
+vn -0.177061 0.423791 0.888285
+v -0.084127 0.097662 0.242712 0.752941 0.752941 0.752941
+vn -0.178392 0.409019 0.894919
+v -0.086989 0.067217 0.256472 0.752941 0.752941 0.752941
+vn -0.180568 0.383315 0.905795
+v -0.089664 0.037047 0.269340 0.752941 0.752941 0.752941
+vn -0.183519 0.344799 0.920562
+v -0.092060 0.007286 0.280869 0.752941 0.752941 0.752941
+vn -0.187081 0.290695 0.938348
+v -0.094087 -0.021927 0.290613 0.752941 0.752941 0.752941
+vn -0.190853 0.217196 0.957288
+v -0.095649 -0.050459 0.298127 0.752941 0.752941 0.752941
+vn -0.194121 0.120063 0.973603
+v -0.096654 -0.078170 0.302961 0.752941 0.752941 0.752941
+vn -0.195444 -0.034635 0.980103
+v -0.097010 -0.104925 0.304672 0.752941 0.752941 0.752941
+vn -0.347747 0.424343 0.836065
+v -0.130875 0.097661 0.228471 0.752941 0.752941 0.752941
+vn -0.350348 0.409560 0.842328
+v -0.136386 0.067217 0.241424 0.752941 0.752941 0.752941
+vn -0.354617 0.383835 0.852594
+v -0.141540 0.037047 0.253537 0.752941 0.752941 0.752941
+vn -0.360415 0.345273 0.866538
+v -0.146157 0.007286 0.264390 0.752941 0.752941 0.752941
+vn -0.367407 0.291106 0.883328
+v -0.150059 -0.021927 0.273562 0.752941 0.752941 0.752941
+vn -0.374856 0.217524 0.901203
+v -0.153069 -0.050459 0.280635 0.752941 0.752941 0.752941
+vn -0.381274 0.120225 0.916611
+v -0.155005 -0.078170 0.285185 0.752941 0.752941 0.752941
+vn -0.383855 -0.034690 0.922742
+v -0.155689 -0.104925 0.286795 0.752941 0.752941 0.752941
+vn -0.503922 0.424740 0.752103
+v -0.172977 0.097661 0.205871 0.752941 0.752941 0.752941
+vn -0.507703 0.409966 0.757737
+v -0.180875 0.067217 0.217543 0.752941 0.752941 0.752941
+vn -0.513911 0.384231 0.766982
+v -0.188262 0.037047 0.228458 0.752941 0.752941 0.752941
+vn -0.522333 0.345637 0.779553
+v -0.194880 0.007286 0.238237 0.752941 0.752941 0.752941
+vn -0.532479 0.291416 0.794697
+v -0.200471 -0.021927 0.246503 0.752941 0.752941 0.752941
+vn -0.543287 0.217774 0.810810
+v -0.204784 -0.050459 0.252876 0.752941 0.752941 0.752941
+vn -0.552601 0.120381 0.824707
+v -0.207559 -0.078170 0.256976 0.752941 0.752941 0.752941
+vn -0.556321 -0.034750 0.830240
+v -0.208541 -0.104925 0.258427 0.752941 0.752941 0.752941
+vn -0.640104 0.424900 0.640099
+v -0.209508 0.097661 0.175842 0.752941 0.752941 0.752941
+vn -0.644907 0.410095 0.644916
+v -0.219478 0.067217 0.185812 0.752941 0.752941 0.752941
+vn -0.652789 0.384355 0.652792
+v -0.228799 0.037047 0.195134 0.752941 0.752941 0.752941
+vn -0.663494 0.345770 0.663490
+v -0.237153 0.007286 0.203487 0.752941 0.752941 0.752941
+vn -0.676395 0.291514 0.676395
+v -0.244212 -0.021927 0.210546 0.752941 0.752941 0.752941
+vn -0.690127 0.217864 0.690116
+v -0.249655 -0.050459 0.215989 0.752941 0.752941 0.752941
+vn -0.701963 0.120444 0.701955
+v -0.253158 -0.078170 0.219492 0.752941 0.752941 0.752941
+vn -0.706678 -0.034775 0.706680
+v -0.254397 -0.104925 0.220731 0.752941 0.752941 0.752941
+vn -0.752101 0.424747 0.503918
+v -0.239537 0.097661 0.139311 0.752941 0.752941 0.752941
+vn -0.757745 0.409965 0.507692
+v -0.251209 0.067217 0.147210 0.752941 0.752941 0.752941
+vn -0.766990 0.384222 0.513907
+v -0.262123 0.037047 0.154596 0.752941 0.752941 0.752941
+vn -0.779551 0.345646 0.522330
+v -0.271903 0.007286 0.161214 0.752941 0.752941 0.752941
+vn -0.794698 0.291405 0.532484
+v -0.280168 -0.021927 0.166806 0.752941 0.752941 0.752941
+vn -0.810815 0.217760 0.543286
+v -0.286541 -0.050459 0.171118 0.752941 0.752941 0.752941
+vn -0.824706 0.120403 0.552596
+v -0.290641 -0.078170 0.173893 0.752941 0.752941 0.752941
+vn -0.830239 -0.034740 0.556324
+v -0.292093 -0.104925 0.174875 0.752941 0.752941 0.752941
+vn -0.836072 0.424337 0.347738
+v -0.262137 0.097661 0.097208 0.752941 0.752941 0.752941
+vn -0.842331 0.409557 0.350347
+v -0.275089 0.067217 0.102719 0.752941 0.752941 0.752941
+vn -0.852589 0.383846 0.354618
+v -0.287202 0.037047 0.107874 0.752941 0.752941 0.752941
+vn -0.866531 0.345291 0.360414
+v -0.298056 0.007286 0.112491 0.752941 0.752941 0.752941
+vn -0.883328 0.291093 0.367418
+v -0.307228 -0.021927 0.116394 0.752941 0.752941 0.752941
+vn -0.901202 0.217504 0.374869
+v -0.314300 -0.050459 0.119403 0.752941 0.752941 0.752941
+vn -0.916604 0.120262 0.381281
+v -0.318850 -0.078170 0.121339 0.752941 0.752941 0.752941
+vn -0.922743 -0.034686 0.383853
+v -0.320462 -0.104925 0.122024 0.752941 0.752941 0.752941
+vn -0.888279 0.423803 0.177063
+v -0.276377 0.097661 0.050462 0.752941 0.752941 0.752941
+vn -0.894913 0.409030 0.178394
+v -0.290138 0.067217 0.053323 0.752941 0.752941 0.752941
+vn -0.905791 0.383320 0.180579
+v -0.303006 0.037047 0.055999 0.752941 0.752941 0.752941
+vn -0.920561 0.344798 0.183524
+v -0.314535 0.007286 0.058395 0.752941 0.752941 0.752941
+vn -0.938352 0.290691 0.187066
+v -0.324279 -0.021927 0.060421 0.752941 0.752941 0.752941
+vn -0.957287 0.217199 0.190855
+v -0.331793 -0.050459 0.061984 0.752941 0.752941 0.752941
+vn -0.973603 0.120062 0.194120
+v -0.336627 -0.078170 0.062988 0.752941 0.752941 0.752941
+vn -0.980103 -0.034653 0.195440
+v -0.338338 -0.104925 0.063345 0.752941 0.752941 0.752941
+vn -0.905907 0.423476 0.000006
+v -0.281330 0.097661 0.000001 0.752941 0.752941 0.752941
+vn -0.912662 0.408716 0.000001
+v -0.295371 0.067217 0.000001 0.752941 0.752941 0.752941
+vn -0.923730 0.383044 -0.000006
+v -0.308502 0.037047 0.000001 0.752941 0.752941 0.752941
+vn -0.938774 0.344533 -0.000000
+v -0.320268 0.007286 0.000001 0.752941 0.752941 0.752941
+vn -0.956898 0.290425 0.000007
+v -0.330210 -0.021927 0.000001 0.752941 0.752941 0.752941
+vn -0.976170 0.217007 0.000003
+v -0.337876 -0.050459 0.000001 0.752941 0.752941 0.752941
+vn -0.992778 0.119964 -0.000000
+v -0.342809 -0.078170 0.000001 0.752941 0.752941 0.752941
+vn -0.861333 0.508040 -0.000456
+v -0.344555 -0.104925 0.000001 0.752941 0.752941 0.752941
+vn -0.888279 0.423802 -0.177069
+v -0.276377 0.097662 -0.050462 0.752941 0.752941 0.752941
+vn -0.894917 0.409022 -0.178395
+v -0.290138 0.067217 -0.053322 0.752941 0.752941 0.752941
+vn -0.905793 0.383322 -0.180563
+v -0.303006 0.037047 -0.055997 0.752941 0.752941 0.752941
+vn -0.920560 0.344805 -0.183518
+v -0.314535 0.007286 -0.058395 0.752941 0.752941 0.752941
+vn -0.938352 0.290684 -0.187077
+v -0.324279 -0.021927 -0.060421 0.752941 0.752941 0.752941
+vn -0.957287 0.217199 -0.190855
+v -0.331793 -0.050459 -0.061982 0.752941 0.752941 0.752941
+vn -0.973603 0.120066 -0.194118
+v -0.336627 -0.078170 -0.062988 0.752941 0.752941 0.752941
+vn -0.980105 -0.034658 -0.195429
+v -0.338338 -0.104925 -0.063343 0.752941 0.752941 0.752941
+vn -0.836071 0.424340 -0.347735
+v -0.262137 0.097661 -0.097208 0.752941 0.752941 0.752941
+vn -0.842336 0.409547 -0.350345
+v -0.275089 0.067217 -0.102719 0.752941 0.752941 0.752941
+vn -0.852584 0.383852 -0.354623
+v -0.287202 0.037047 -0.107873 0.752941 0.752941 0.752941
+vn -0.866528 0.345293 -0.360420
+v -0.298056 0.007286 -0.112491 0.752941 0.752941 0.752941
+vn -0.883332 0.291087 -0.367414
+v -0.307228 -0.021927 -0.116394 0.752941 0.752941 0.752941
+vn -0.901206 0.217506 -0.374857
+v -0.314300 -0.050459 -0.119402 0.752941 0.752941 0.752941
+vn -0.916601 0.120269 -0.381284
+v -0.318850 -0.078170 -0.121339 0.752941 0.752941 0.752941
+vn -0.922740 -0.034691 -0.383859
+v -0.320462 -0.104925 -0.122024 0.752941 0.752941 0.752941
+vn -0.752092 0.424758 -0.503923
+v -0.239537 0.097661 -0.139311 0.752941 0.752941 0.752941
+vn -0.757745 0.409952 -0.507703
+v -0.251209 0.067217 -0.147210 0.752941 0.752941 0.752941
+vn -0.766994 0.384222 -0.513901
+v -0.262123 0.037047 -0.154595 0.752941 0.752941 0.752941
+vn -0.779551 0.345652 -0.522327
+v -0.271903 0.007286 -0.161213 0.752941 0.752941 0.752941
+vn -0.794694 0.291413 -0.532485
+v -0.280168 -0.021927 -0.166806 0.752941 0.752941 0.752941
+vn -0.810817 0.217762 -0.543283
+v -0.286541 -0.050459 -0.171118 0.752941 0.752941 0.752941
+vn -0.824708 0.120396 -0.552596
+v -0.290641 -0.078170 -0.173893 0.752941 0.752941 0.752941
+vn -0.830239 -0.034756 -0.556323
+v -0.292093 -0.104925 -0.174875 0.752941 0.752941 0.752941
+vn -0.640104 0.424890 -0.640106
+v -0.209508 0.097661 -0.175841 0.752941 0.752941 0.752941
+vn -0.644910 0.410107 -0.644906
+v -0.219478 0.067217 -0.185810 0.752941 0.752941 0.752941
+vn -0.652791 0.384364 -0.652785
+v -0.228799 0.037047 -0.195134 0.752941 0.752941 0.752941
+vn -0.663496 0.345772 -0.663487
+v -0.237153 0.007286 -0.203487 0.752941 0.752941 0.752941
+vn -0.676396 0.291513 -0.676394
+v -0.244212 -0.021927 -0.210546 0.752941 0.752941 0.752941
+vn -0.690118 0.217866 -0.690124
+v -0.249655 -0.050459 -0.215989 0.752941 0.752941 0.752941
+vn -0.701963 0.120442 -0.701956
+v -0.253158 -0.078170 -0.219492 0.752941 0.752941 0.752941
+vn -0.706683 -0.034772 -0.706676
+v -0.254397 -0.104925 -0.220731 0.752941 0.752941 0.752941
+vn -0.503931 0.424736 -0.752099
+v -0.172977 0.097661 -0.205870 0.752941 0.752941 0.752941
+vn -0.507701 0.409980 -0.757731
+v -0.180875 0.067217 -0.217543 0.752941 0.752941 0.752941
+vn -0.513909 0.384227 -0.766986
+v -0.188262 0.037047 -0.228458 0.752941 0.752941 0.752941
+vn -0.522329 0.345640 -0.779555
+v -0.194880 0.007286 -0.238237 0.752941 0.752941 0.752941
+vn -0.532480 0.291393 -0.794705
+v -0.200471 -0.021927 -0.246503 0.752941 0.752941 0.752941
+vn -0.543284 0.217773 -0.810813
+v -0.204784 -0.050459 -0.252874 0.752941 0.752941 0.752941
+vn -0.552592 0.120409 -0.824708
+v -0.207559 -0.078170 -0.256976 0.752941 0.752941 0.752941
+vn -0.556317 -0.034750 -0.830243
+v -0.208541 -0.104925 -0.258427 0.752941 0.752941 0.752941
+vn -0.347734 0.424338 -0.836073
+v -0.130875 0.097661 -0.228470 0.752941 0.752941 0.752941
+vn -0.350341 0.409573 -0.842325
+v -0.136386 0.067217 -0.241424 0.752941 0.752941 0.752941
+vn -0.354621 0.383825 -0.852598
+v -0.141540 0.037047 -0.253537 0.752941 0.752941 0.752941
+vn -0.360418 0.345275 -0.866536
+v -0.146157 0.007286 -0.264389 0.752941 0.752941 0.752941
+vn -0.367410 0.291091 -0.883333
+v -0.150059 -0.021927 -0.273562 0.752941 0.752941 0.752941
+vn -0.374863 0.217524 -0.901200
+v -0.153069 -0.050459 -0.280633 0.752941 0.752941 0.752941
+vn -0.381276 0.120254 -0.916606
+v -0.155005 -0.078170 -0.285185 0.752941 0.752941 0.752941
+vn -0.383847 -0.034723 -0.922744
+v -0.155689 -0.104925 -0.286795 0.752941 0.752941 0.752941
+vn -0.177071 0.423785 -0.888286
+v -0.084127 0.097661 -0.242710 0.752941 0.752941 0.752941
+vn -0.178393 0.409044 -0.894907
+v -0.086989 0.067217 -0.256471 0.752941 0.752941 0.752941
+vn -0.180567 0.383323 -0.905792
+v -0.089664 0.037047 -0.269340 0.752941 0.752941 0.752941
+vn -0.183515 0.344796 -0.920564
+v -0.092060 0.007286 -0.280869 0.752941 0.752941 0.752941
+vn -0.187069 0.290681 -0.938355
+v -0.094087 -0.021927 -0.290613 0.752941 0.752941 0.752941
+vn -0.190860 0.217202 -0.957286
+v -0.095649 -0.050459 -0.298126 0.752941 0.752941 0.752941
+vn -0.194123 0.120063 -0.973602
+v -0.096654 -0.078170 -0.302961 0.752941 0.752941 0.752941
+vn -0.195446 -0.034671 -0.980101
+v -0.097010 -0.104925 -0.304671 0.752941 0.752941 0.752941
+vn 0.000001 0.423473 -0.905909
+v -0.033666 0.097661 -0.247664 0.752941 0.752941 0.752941
+vn -0.000001 0.408729 -0.912656
+v -0.033666 0.067217 -0.261706 0.752941 0.752941 0.752941
+vn -0.000002 0.383023 -0.923739
+v -0.033666 0.037047 -0.274837 0.752941 0.752941 0.752941
+vn -0.000004 0.344510 -0.938783
+v -0.033666 0.007286 -0.286601 0.752941 0.752941 0.752941
+vn -0.000001 0.290436 -0.956894
+v -0.033666 -0.021927 -0.296543 0.752941 0.752941 0.752941
+vn 0.000003 0.217035 -0.976164
+v -0.033666 -0.050459 -0.304210 0.752941 0.752941 0.752941
+vn 0.000001 0.119963 -0.992778
+v -0.033666 -0.078170 -0.309144 0.752941 0.752941 0.752941
+vn 0.000003 -0.034632 -0.999400
+v -0.033666 -0.104925 -0.310889 0.752941 0.752941 0.752941
+vn 0.177068 0.423784 -0.888287
+v 0.016795 0.097662 -0.242710 0.752941 0.752941 0.752941
+vn 0.178394 0.409038 -0.894910
+v 0.019656 0.067217 -0.256471 0.752941 0.752941 0.752941
+vn 0.180573 0.383329 -0.905788
+v 0.022332 0.037047 -0.269340 0.752941 0.752941 0.752941
+vn 0.183519 0.344801 -0.920561
+v 0.024729 0.007286 -0.280869 0.752941 0.752941 0.752941
+vn 0.187073 0.290671 -0.938357
+v 0.026756 -0.021927 -0.290613 0.752941 0.752941 0.752941
+vn 0.190857 0.217208 -0.957285
+v 0.028317 -0.050459 -0.298126 0.752941 0.752941 0.752941
+vn 0.194121 0.120062 -0.973603
+v 0.029323 -0.078170 -0.302961 0.752941 0.752941 0.752941
+vn 0.195440 -0.034679 -0.980102
+v 0.029678 -0.104925 -0.304671 0.752941 0.752941 0.752941
+vn 0.347736 0.424336 -0.836073
+v 0.063542 0.097661 -0.228470 0.752941 0.752941 0.752941
+vn 0.350338 0.409569 -0.842328
+v 0.069054 0.067217 -0.241424 0.752941 0.752941 0.752941
+vn 0.354614 0.383832 -0.852597
+v 0.074207 0.037047 -0.253537 0.752941 0.752941 0.752941
+vn 0.360422 0.345286 -0.866530
+v 0.078826 0.007286 -0.264389 0.752941 0.752941 0.752941
+vn 0.367411 0.291078 -0.883336
+v 0.082728 -0.021927 -0.273562 0.752941 0.752941 0.752941
+vn 0.374855 0.217529 -0.901202
+v 0.085736 -0.050459 -0.280633 0.752941 0.752941 0.752941
+vn 0.381276 0.120267 -0.916605
+v 0.087674 -0.078170 -0.285185 0.752941 0.752941 0.752941
+vn 0.383844 -0.034726 -0.922745
+v 0.088358 -0.104925 -0.286795 0.752941 0.752941 0.752941
+vn 0.503933 0.424740 -0.752095
+v 0.105646 0.097661 -0.205870 0.752941 0.752941 0.752941
+vn 0.507707 0.409972 -0.757731
+v 0.113543 0.067217 -0.217543 0.752941 0.752941 0.752941
+vn 0.513905 0.384223 -0.766991
+v 0.120929 0.037047 -0.228458 0.752941 0.752941 0.752941
+vn 0.522326 0.345652 -0.779551
+v 0.127547 0.007286 -0.238237 0.752941 0.752941 0.752941
+vn 0.532477 0.291409 -0.794701
+v 0.133140 -0.021927 -0.246503 0.752941 0.752941 0.752941
+vn 0.543279 0.217770 -0.810817
+v 0.137453 -0.050459 -0.252874 0.752941 0.752941 0.752941
+vn 0.552595 0.120412 -0.824706
+v 0.140228 -0.078170 -0.256976 0.752941 0.752941 0.752941
+vn 0.556320 -0.034760 -0.830241
+v 0.141210 -0.104925 -0.258427 0.752941 0.752941 0.752941
+vn 0.640105 0.424891 -0.640105
+v 0.142175 0.097661 -0.175841 0.752941 0.752941 0.752941
+vn 0.644903 0.410117 -0.644907
+v 0.152145 0.067217 -0.185810 0.752941 0.752941 0.752941
+vn 0.652785 0.384375 -0.652785
+v 0.161468 0.037047 -0.195134 0.752941 0.752941 0.752941
+vn 0.663487 0.345772 -0.663496
+v 0.169821 0.007286 -0.203487 0.752941 0.752941 0.752941
+vn 0.676394 0.291524 -0.676392
+v 0.176881 -0.021927 -0.210546 0.752941 0.752941 0.752941
+vn 0.690124 0.217862 -0.690120
+v 0.182324 -0.050459 -0.215989 0.752941 0.752941 0.752941
+vn 0.701960 0.120448 -0.701958
+v 0.185827 -0.078170 -0.219492 0.752941 0.752941 0.752941
+vn 0.706681 -0.034778 -0.706678
+v 0.187066 -0.104925 -0.220731 0.752941 0.752941 0.752941
+vn 0.752091 0.424764 -0.503919
+v 0.172204 0.097661 -0.139311 0.752941 0.752941 0.752941
+vn 0.757731 0.409972 -0.507707
+v 0.183878 0.067217 -0.147210 0.752941 0.752941 0.752941
+vn 0.766991 0.384220 -0.513907
+v 0.194792 0.037047 -0.154595 0.752941 0.752941 0.752941
+vn 0.779555 0.345653 -0.522319
+v 0.204572 0.007286 -0.161213 0.752941 0.752941 0.752941
+vn 0.794702 0.291401 -0.532480
+v 0.212837 -0.021927 -0.166806 0.752941 0.752941 0.752941
+vn 0.810817 0.217764 -0.543281
+v 0.219209 -0.050459 -0.171118 0.752941 0.752941 0.752941
+vn 0.824709 0.120413 -0.552591
+v 0.223310 -0.078170 -0.173893 0.752941 0.752941 0.752941
+vn 0.830240 -0.034760 -0.556321
+v 0.224762 -0.104925 -0.174875 0.752941 0.752941 0.752941
+vn 0.836073 0.424337 -0.347737
+v 0.194804 0.097661 -0.097208 0.752941 0.752941 0.752941
+vn 0.842329 0.409576 -0.350328
+v 0.207758 0.067217 -0.102719 0.752941 0.752941 0.752941
+vn 0.852597 0.383829 -0.354618
+v 0.219871 0.037047 -0.107873 0.752941 0.752941 0.752941
+vn 0.866530 0.345286 -0.360422
+v 0.230723 0.007286 -0.112491 0.752941 0.752941 0.752941
+vn 0.883331 0.291094 -0.367412
+v 0.239896 -0.021927 -0.116394 0.752941 0.752941 0.752941
+vn 0.901205 0.217521 -0.374852
+v 0.246968 -0.050459 -0.119402 0.752941 0.752941 0.752941
+vn 0.916607 0.120264 -0.381271
+v 0.251519 -0.078170 -0.121339 0.752941 0.752941 0.752941
+vn 0.922747 -0.034698 -0.383841
+v 0.253130 -0.104925 -0.122024 0.752941 0.752941 0.752941
+vn 0.888286 0.423781 -0.177082
+v 0.209044 0.097661 -0.050462 0.752941 0.752941 0.752941
+vn 0.894909 0.409041 -0.178393
+v 0.222805 0.067217 -0.053322 0.752941 0.752941 0.752941
+vn 0.905786 0.383340 -0.180561
+v 0.235674 0.037047 -0.055997 0.752941 0.752941 0.752941
+vn 0.920558 0.344811 -0.183517
+v 0.247204 0.007286 -0.058395 0.752941 0.752941 0.752941
+vn 0.938358 0.290663 -0.187080
+v 0.256948 -0.021927 -0.060421 0.752941 0.752941 0.752941
+vn 0.957289 0.217189 -0.190860
+v 0.264460 -0.050459 -0.061982 0.752941 0.752941 0.752941
+vn 0.973602 0.120063 -0.194125
+v 0.269295 -0.078170 -0.062988 0.752941 0.752941 0.752941
+vn 0.980103 -0.034656 -0.195439
+v 0.271005 -0.104925 -0.063343 0.752941 0.752941 0.752941
+vn 0.947691 -0.257232 0.188982
+v 0.267733 -0.129539 0.062664 0.752941 0.752941 0.752941
+vn 0.966393 -0.257070 -0.000006
+v 0.273884 -0.129539 0.000001 0.752941 0.752941 0.752941
+vn 0.865992 -0.469308 0.172648
+v 0.259105 -0.151011 0.060870 0.752941 0.752941 0.752941
+vn 0.883200 -0.468996 0.000003
+v 0.265079 -0.151011 0.000001 0.752941 0.752941 0.752941
+vn 0.771981 -0.616737 0.153882
+v 0.246905 -0.169478 0.058334 0.752941 0.752941 0.752941
+vn 0.787426 -0.616409 0.000003
+v 0.252632 -0.169478 0.000001 0.752941 0.752941 0.752941
+vn 0.692124 -0.708472 0.137953
+v 0.232922 -0.185077 0.055427 0.752941 0.752941 0.752941
+vn 0.706034 -0.708178 -0.000004
+v 0.238362 -0.185077 0.000001 0.752941 0.752941 0.752941
+vn 0.640985 -0.756848 0.127747
+v 0.218938 -0.197941 0.052519 0.752941 0.752941 0.752941
+vn 0.653946 -0.756541 0.000004
+v 0.224093 -0.197941 0.000001 0.752941 0.752941 0.752941
+vn 0.636593 -0.760691 0.126876
+v 0.206739 -0.208211 0.049982 0.752941 0.752941 0.752941
+vn 0.649461 -0.760395 0.000001
+v 0.211646 -0.208211 0.000001 0.752941 0.752941 0.752941
+vn 0.748535 -0.646095 0.149187
+v 0.198111 -0.216021 0.048189 0.752941 0.752941 0.752941
+vn 0.763553 -0.645745 -0.000003
+v 0.202841 -0.216021 0.000001 0.752941 0.752941 0.752941
+vn 0.909538 -0.374018 0.181248
+v 0.194838 -0.221508 0.047509 0.752941 0.752941 0.752941
+vn 0.927531 -0.373747 -0.000002
+v 0.199501 -0.221508 0.000001 0.752941 0.752941 0.752941
+vn 0.892134 -0.257617 0.371120
+v 0.250049 -0.129539 0.120714 0.752941 0.752941 0.752941
+vn 0.815040 -0.469868 0.339018
+v 0.241927 -0.151011 0.117258 0.752941 0.752941 0.752941
+vn 0.726378 -0.617340 0.302103
+v 0.230444 -0.169478 0.112372 0.752941 0.752941 0.752941
+vn 0.651107 -0.709038 0.270786
+v 0.217280 -0.185077 0.106772 0.752941 0.752941 0.752941
+vn 0.602946 -0.757349 0.250756
+v 0.204117 -0.197941 0.101171 0.752941 0.752941 0.752941
+vn 0.598805 -0.761193 0.249032
+v 0.192634 -0.208211 0.096285 0.752941 0.752941 0.752941
+vn 0.704292 -0.646668 0.292905
+v 0.184512 -0.216021 0.092830 0.752941 0.752941 0.752941
+vn 0.856147 -0.374528 0.356008
+v 0.181431 -0.221508 0.091518 0.752941 0.752941 0.752941
+vn 0.802634 -0.257912 0.537829
+v 0.221985 -0.129539 0.172998 0.752941 0.752941 0.752941
+vn 0.733139 -0.470314 0.491235
+v 0.214666 -0.151011 0.168045 0.752941 0.752941 0.752941
+vn 0.653266 -0.617788 0.437699
+v 0.204319 -0.169478 0.161043 0.752941 0.752941 0.752941
+vn 0.585474 -0.709469 0.392267
+v 0.192458 -0.185077 0.153017 0.752941 0.752941 0.752941
+vn 0.542126 -0.757742 0.363216
+v 0.180596 -0.197941 0.144989 0.752941 0.752941 0.752941
+vn 0.538407 -0.761571 0.360733
+v 0.170249 -0.208211 0.137988 0.752941 0.752941 0.752941
+vn 0.633431 -0.647032 0.424399
+v 0.162930 -0.216021 0.133035 0.752941 0.752941 0.752941
+vn 0.770207 -0.374825 0.516031
+v 0.160154 -0.221508 0.131157 0.752941 0.752941 0.752941
+vn 0.683165 -0.258001 0.683170
+v 0.184695 -0.129539 0.218360 0.752941 0.752941 0.752941
+vn 0.623965 -0.470456 0.623970
+v 0.178444 -0.151011 0.212109 0.752941 0.752941 0.752941
+vn 0.555933 -0.617955 0.555940
+v 0.169606 -0.169478 0.203272 0.752941 0.752941 0.752941
+vn 0.498216 -0.709621 0.498216
+v 0.159475 -0.185077 0.193140 0.752941 0.752941 0.752941
+vn 0.461317 -0.757871 0.461322
+v 0.149343 -0.197941 0.183009 0.752941 0.752941 0.752941
+vn 0.458159 -0.761700 0.458152
+v 0.140506 -0.208211 0.174171 0.752941 0.752941 0.752941
+vn 0.539043 -0.647208 0.539031
+v 0.134254 -0.216021 0.167920 0.752941 0.752941 0.752941
+vn 0.655540 -0.374899 0.655529
+v 0.131882 -0.221508 0.165549 0.752941 0.752941 0.752941
+vn 0.537833 -0.257907 0.802633
+v 0.139331 -0.129539 0.255651 0.752941 0.752941 0.752941
+vn 0.491231 -0.470314 0.733141
+v 0.134378 -0.151011 0.248333 0.752941 0.752941 0.752941
+vn 0.437688 -0.617797 0.653266
+v 0.127376 -0.169478 0.237985 0.752941 0.752941 0.752941
+vn 0.392267 -0.709463 0.585482
+v 0.119350 -0.185077 0.226124 0.752941 0.752941 0.752941
+vn 0.363223 -0.757737 0.542129
+v 0.111323 -0.197941 0.214262 0.752941 0.752941 0.752941
+vn 0.360742 -0.761557 0.538420
+v 0.104322 -0.208211 0.203915 0.752941 0.752941 0.752941
+vn 0.424392 -0.647041 0.633427
+v 0.099369 -0.216021 0.196597 0.752941 0.752941 0.752941
+vn 0.516032 -0.374751 0.770242
+v 0.097490 -0.221508 0.193821 0.752941 0.752941 0.752941
+vn 0.371122 -0.257611 0.892135
+v 0.087048 -0.129539 0.283716 0.752941 0.752941 0.752941
+vn 0.339010 -0.469901 0.815025
+v 0.083591 -0.151011 0.275593 0.752941 0.752941 0.752941
+vn 0.302110 -0.617341 0.726374
+v 0.078705 -0.169478 0.264109 0.752941 0.752941 0.752941
+vn 0.270792 -0.709028 0.651115
+v 0.073105 -0.185077 0.250946 0.752941 0.752941 0.752941
+vn 0.250756 -0.757339 0.602959
+v 0.067504 -0.197941 0.237783 0.752941 0.752941 0.752941
+vn 0.249028 -0.761197 0.598802
+v 0.062618 -0.208211 0.226301 0.752941 0.752941 0.752941
+vn 0.292898 -0.646651 0.704311
+v 0.059163 -0.216021 0.218178 0.752941 0.752941 0.752941
+vn 0.356031 -0.374465 0.856164
+v 0.057853 -0.221508 0.215097 0.752941 0.752941 0.752941
+vn 0.188972 -0.257256 0.947686
+v 0.028997 -0.129539 0.301400 0.752941 0.752941 0.752941
+vn 0.172653 -0.469312 0.865989
+v 0.027204 -0.151011 0.292770 0.752941 0.752941 0.752941
+vn 0.153887 -0.616715 0.771998
+v 0.024667 -0.169478 0.280572 0.752941 0.752941 0.752941
+vn 0.137953 -0.708482 0.692114
+v 0.021760 -0.185077 0.266589 0.752941 0.752941 0.752941
+vn 0.127750 -0.756843 0.640990
+v 0.018852 -0.197941 0.252604 0.752941 0.752941 0.752941
+vn 0.126870 -0.760714 0.636567
+v 0.016317 -0.208211 0.240406 0.752941 0.752941 0.752941
+vn 0.149175 -0.646095 0.748537
+v 0.014522 -0.216021 0.231776 0.752941 0.752941 0.752941
+vn 0.181249 -0.373974 0.909556
+v 0.013842 -0.221508 0.228504 0.752941 0.752941 0.752941
+vn -0.000002 -0.257057 0.966396
+v -0.033666 -0.129539 0.307550 0.752941 0.752941 0.752941
+vn -0.000004 -0.468996 0.883200
+v -0.033666 -0.151011 0.298745 0.752941 0.752941 0.752941
+vn 0.000001 -0.616395 0.787437
+v -0.033666 -0.169478 0.286298 0.752941 0.752941 0.752941
+vn 0.000001 -0.708178 0.706034
+v -0.033666 -0.185077 0.272029 0.752941 0.752941 0.752941
+vn 0.000002 -0.756563 0.653921
+v -0.033666 -0.197941 0.257759 0.752941 0.752941 0.752941
+vn 0.000000 -0.760408 0.649446
+v -0.033666 -0.208211 0.245311 0.752941 0.752941 0.752941
+vn -0.000002 -0.645699 0.763592
+v -0.033666 -0.216021 0.236506 0.752941 0.752941 0.752941
+vn -0.000002 -0.373586 0.927596
+v -0.033666 -0.221508 0.233167 0.752941 0.752941 0.752941
+vn -0.188970 -0.257262 0.947685
+v -0.096330 -0.129539 0.301400 0.752941 0.752941 0.752941
+vn -0.172646 -0.469318 0.865987
+v -0.094535 -0.151011 0.292770 0.752941 0.752941 0.752941
+vn -0.153895 -0.616710 0.772001
+v -0.091999 -0.169478 0.280572 0.752941 0.752941 0.752941
+vn -0.137952 -0.708478 0.692118
+v -0.089092 -0.185077 0.266589 0.752941 0.752941 0.752941
+vn -0.127749 -0.756845 0.640988
+v -0.086185 -0.197941 0.252604 0.752941 0.752941 0.752941
+vn -0.126861 -0.760714 0.636569
+v -0.083648 -0.208211 0.240406 0.752941 0.752941 0.752941
+vn -0.149181 -0.646098 0.748533
+v -0.081855 -0.216021 0.231776 0.752941 0.752941 0.752941
+vn -0.181241 -0.373966 0.909561
+v -0.081174 -0.221508 0.228504 0.752941 0.752941 0.752941
+vn -0.371130 -0.257592 0.892137
+v -0.154379 -0.129539 0.283716 0.752941 0.752941 0.752941
+vn -0.339004 -0.469893 0.815032
+v -0.150924 -0.151011 0.275593 0.752941 0.752941 0.752941
+vn -0.302097 -0.617346 0.726376
+v -0.146038 -0.169478 0.264109 0.752941 0.752941 0.752941
+vn -0.270794 -0.709027 0.651115
+v -0.140437 -0.185077 0.250946 0.752941 0.752941 0.752941
+vn -0.250767 -0.757337 0.602957
+v -0.134837 -0.197941 0.237783 0.752941 0.752941 0.752941
+vn -0.249032 -0.761201 0.598796
+v -0.129951 -0.208211 0.226301 0.752941 0.752941 0.752941
+vn -0.292888 -0.646680 0.704288
+v -0.126495 -0.216021 0.218178 0.752941 0.752941 0.752941
+vn -0.356021 -0.374449 0.856176
+v -0.125184 -0.221508 0.215097 0.752941 0.752941 0.752941
+vn -0.537836 -0.257890 0.802636
+v -0.206663 -0.129539 0.255651 0.752941 0.752941 0.752941
+vn -0.491247 -0.470293 0.733144
+v -0.201710 -0.151011 0.248333 0.752941 0.752941 0.752941
+vn -0.437695 -0.617798 0.653260
+v -0.194709 -0.169478 0.237986 0.752941 0.752941 0.752941
+vn -0.392262 -0.709473 0.585473
+v -0.186682 -0.185077 0.226124 0.752941 0.752941 0.752941
+vn -0.363223 -0.757742 0.542122
+v -0.178656 -0.197941 0.214262 0.752941 0.752941 0.752941
+vn -0.360737 -0.761568 0.538407
+v -0.171653 -0.208211 0.203915 0.752941 0.752941 0.752941
+vn -0.424416 -0.646990 0.633463
+v -0.166700 -0.216021 0.196597 0.752941 0.752941 0.752941
+vn -0.516034 -0.374790 0.770222
+v -0.164823 -0.221508 0.193821 0.752941 0.752941 0.752941
+vn -0.683168 -0.258001 0.683167
+v -0.252026 -0.129539 0.218360 0.752941 0.752941 0.752941
+vn -0.623970 -0.470451 0.623969
+v -0.245775 -0.151011 0.212109 0.752941 0.752941 0.752941
+vn -0.555934 -0.617958 0.555937
+v -0.236937 -0.169478 0.203272 0.752941 0.752941 0.752941
+vn -0.498217 -0.709622 0.498214
+v -0.226806 -0.185077 0.193140 0.752941 0.752941 0.752941
+vn -0.461318 -0.757872 0.461319
+v -0.216674 -0.197941 0.183009 0.752941 0.752941 0.752941
+vn -0.458166 -0.761689 0.458162
+v -0.207837 -0.208211 0.174171 0.752941 0.752941 0.752941
+vn -0.539064 -0.647159 0.539068
+v -0.201586 -0.216021 0.167920 0.752941 0.752941 0.752941
+vn -0.655554 -0.374856 0.655540
+v -0.199215 -0.221508 0.165549 0.752941 0.752941 0.752941
+vn -0.802632 -0.257902 0.537836
+v -0.289316 -0.129539 0.172998 0.752941 0.752941 0.752941
+vn -0.733151 -0.470289 0.491241
+v -0.281998 -0.151011 0.168045 0.752941 0.752941 0.752941
+vn -0.653265 -0.617795 0.437692
+v -0.271652 -0.169478 0.161043 0.752941 0.752941 0.752941
+vn -0.585471 -0.709471 0.392269
+v -0.259789 -0.185077 0.153017 0.752941 0.752941 0.752941
+vn -0.542124 -0.757743 0.363219
+v -0.247929 -0.197941 0.144989 0.752941 0.752941 0.752941
+vn -0.538410 -0.761564 0.360743
+v -0.237580 -0.208211 0.137988 0.752941 0.752941 0.752941
+vn -0.633436 -0.647038 0.424383
+v -0.230263 -0.216021 0.133035 0.752941 0.752941 0.752941
+vn -0.770220 -0.374789 0.516037
+v -0.227486 -0.221508 0.131157 0.752941 0.752941 0.752941
+vn -0.892127 -0.257632 0.371127
+v -0.317381 -0.129539 0.120714 0.752941 0.752941 0.752941
+vn -0.815030 -0.469883 0.339021
+v -0.309258 -0.151011 0.117258 0.752941 0.752941 0.752941
+vn -0.726378 -0.617338 0.302107
+v -0.297775 -0.169478 0.112372 0.752941 0.752941 0.752941
+vn -0.651103 -0.709042 0.270785
+v -0.284611 -0.185077 0.106772 0.752941 0.752941 0.752941
+vn -0.602963 -0.757337 0.250753
+v -0.271448 -0.197941 0.101171 0.752941 0.752941 0.752941
+vn -0.598800 -0.761198 0.249030
+v -0.259966 -0.208211 0.096285 0.752941 0.752941 0.752941
+vn -0.704278 -0.646687 0.292898
+v -0.251843 -0.216021 0.092830 0.752941 0.752941 0.752941
+vn -0.856219 -0.374346 0.356026
+v -0.248762 -0.221508 0.091518 0.752941 0.752941 0.752941
+vn -0.947689 -0.257244 0.188974
+v -0.335065 -0.129539 0.062664 0.752941 0.752941 0.752941
+vn -0.865996 -0.469297 0.172657
+v -0.326437 -0.151011 0.060870 0.752941 0.752941 0.752941
+vn -0.771982 -0.616736 0.153885
+v -0.314238 -0.169478 0.058334 0.752941 0.752941 0.752941
+vn -0.692102 -0.708495 0.137951
+v -0.300254 -0.185077 0.055427 0.752941 0.752941 0.752941
+vn -0.640998 -0.756836 0.127755
+v -0.286269 -0.197941 0.052519 0.752941 0.752941 0.752941
+vn -0.636586 -0.760698 0.126873
+v -0.274072 -0.208211 0.049982 0.752941 0.752941 0.752941
+vn -0.748499 -0.646138 0.149181
+v -0.265442 -0.216021 0.048189 0.752941 0.752941 0.752941
+vn -0.909540 -0.374015 0.181247
+v -0.262169 -0.221508 0.047509 0.752941 0.752941 0.752941
+vn -0.966401 -0.257038 -0.000001
+v -0.341215 -0.129539 0.000001 0.752941 0.752941 0.752941
+vn -0.883203 -0.468991 0.000000
+v -0.332412 -0.151011 0.000001 0.752941 0.752941 0.752941
+vn -0.787414 -0.616425 0.000002
+v -0.319963 -0.169478 0.000001 0.752941 0.752941 0.752941
+vn -0.706033 -0.708179 -0.000002
+v -0.305694 -0.185077 0.000001 0.752941 0.752941 0.752941
+vn -0.653935 -0.756550 0.000002
+v -0.291424 -0.197941 0.000001 0.752941 0.752941 0.752941
+vn -0.649480 -0.760379 -0.000001
+v -0.278977 -0.208211 0.000001 0.752941 0.752941 0.752941
+vn -0.763528 -0.645775 -0.000001
+v -0.270173 -0.216021 0.000001 0.752941 0.752941 0.752941
+vn -0.927545 -0.373711 0.000002
+v -0.266832 -0.221508 0.000001 0.752941 0.752941 0.752941
+vn -0.947689 -0.257244 -0.188973
+v -0.335065 -0.129539 -0.062663 0.752941 0.752941 0.752941
+vn -0.865998 -0.469292 -0.172663
+v -0.326437 -0.151011 -0.060870 0.752941 0.752941 0.752941
+vn -0.771975 -0.616745 -0.153881
+v -0.314238 -0.169478 -0.058332 0.752941 0.752941 0.752941
+vn -0.692107 -0.708490 -0.137947
+v -0.300254 -0.185077 -0.055425 0.752941 0.752941 0.752941
+vn -0.641002 -0.756833 -0.127754
+v -0.286269 -0.197941 -0.052518 0.752941 0.752941 0.752941
+vn -0.636582 -0.760702 -0.126874
+v -0.274072 -0.208211 -0.049982 0.752941 0.752941 0.752941
+vn -0.748493 -0.646146 -0.149177
+v -0.265442 -0.216021 -0.048188 0.752941 0.752941 0.752941
+vn -0.909537 -0.374028 -0.181235
+v -0.262169 -0.221508 -0.047507 0.752941 0.752941 0.752941
+vn -0.892126 -0.257637 -0.371126
+v -0.317381 -0.129539 -0.120714 0.752941 0.752941 0.752941
+vn -0.815035 -0.469881 -0.339013
+v -0.309258 -0.151011 -0.117257 0.752941 0.752941 0.752941
+vn -0.726371 -0.617347 -0.302106
+v -0.297775 -0.169478 -0.112372 0.752941 0.752941 0.752941
+vn -0.651104 -0.709041 -0.270784
+v -0.284611 -0.185077 -0.106770 0.752941 0.752941 0.752941
+vn -0.602960 -0.757338 -0.250757
+v -0.271448 -0.197941 -0.101170 0.752941 0.752941 0.752941
+vn -0.598801 -0.761197 -0.249030
+v -0.259966 -0.208211 -0.096284 0.752941 0.752941 0.752941
+vn -0.704300 -0.646665 -0.292892
+v -0.251843 -0.216021 -0.092828 0.752941 0.752941 0.752941
+vn -0.856199 -0.374371 -0.356048
+v -0.248762 -0.221508 -0.091518 0.752941 0.752941 0.752941
+vn -0.802632 -0.257918 -0.537830
+v -0.289316 -0.129539 -0.172996 0.752941 0.752941 0.752941
+vn -0.733151 -0.470284 -0.491246
+v -0.281998 -0.151011 -0.168043 0.752941 0.752941 0.752941
+vn -0.653265 -0.617795 -0.437692
+v -0.271652 -0.169478 -0.161042 0.752941 0.752941 0.752941
+vn -0.585479 -0.709468 -0.392263
+v -0.259789 -0.185077 -0.153015 0.752941 0.752941 0.752941
+vn -0.542138 -0.757731 -0.363222
+v -0.247929 -0.197941 -0.144989 0.752941 0.752941 0.752941
+vn -0.538415 -0.761562 -0.360739
+v -0.237580 -0.208211 -0.137988 0.752941 0.752941 0.752941
+vn -0.633417 -0.647064 -0.424371
+v -0.230263 -0.216021 -0.133035 0.752941 0.752941 0.752941
+vn -0.770234 -0.374776 -0.516026
+v -0.227486 -0.221508 -0.131156 0.752941 0.752941 0.752941
+vn -0.683168 -0.258008 -0.683164
+v -0.252026 -0.129539 -0.218360 0.752941 0.752941 0.752941
+vn -0.623971 -0.470450 -0.623969
+v -0.245775 -0.151011 -0.212109 0.752941 0.752941 0.752941
+vn -0.555938 -0.617954 -0.555937
+v -0.236937 -0.169478 -0.203272 0.752941 0.752941 0.752941
+vn -0.498220 -0.709623 -0.498209
+v -0.226806 -0.185077 -0.193140 0.752941 0.752941 0.752941
+vn -0.461321 -0.757869 -0.461322
+v -0.216674 -0.197941 -0.183009 0.752941 0.752941 0.752941
+vn -0.458159 -0.761692 -0.458165
+v -0.207837 -0.208211 -0.174171 0.752941 0.752941 0.752941
+vn -0.539068 -0.647153 -0.539072
+v -0.201586 -0.216021 -0.167920 0.752941 0.752941 0.752941
+vn -0.655507 -0.375004 -0.655502
+v -0.199215 -0.221508 -0.165549 0.752941 0.752941 0.752941
+vn -0.537829 -0.257919 -0.802632
+v -0.206663 -0.129539 -0.255651 0.752941 0.752941 0.752941
+vn -0.491242 -0.470310 -0.733137
+v -0.201710 -0.151011 -0.248331 0.752941 0.752941 0.752941
+vn -0.437701 -0.617774 -0.653279
+v -0.194709 -0.169478 -0.237985 0.752941 0.752941 0.752941
+vn -0.392270 -0.709463 -0.585479
+v -0.186682 -0.185077 -0.226124 0.752941 0.752941 0.752941
+vn -0.363224 -0.757746 -0.542116
+v -0.178656 -0.197941 -0.214262 0.752941 0.752941 0.752941
+vn -0.360726 -0.761581 -0.538396
+v -0.171653 -0.208211 -0.203915 0.752941 0.752941 0.752941
+vn -0.424420 -0.646966 -0.633484
+v -0.166700 -0.216021 -0.196596 0.752941 0.752941 0.752941
+vn -0.516018 -0.374823 -0.770216
+v -0.164823 -0.221508 -0.193821 0.752941 0.752941 0.752941
+vn -0.371115 -0.257595 -0.892143
+v -0.154379 -0.129539 -0.283714 0.752941 0.752941 0.752941
+vn -0.339015 -0.469864 -0.815044
+v -0.150924 -0.151011 -0.275593 0.752941 0.752941 0.752941
+vn -0.302107 -0.617343 -0.726374
+v -0.146038 -0.169478 -0.264109 0.752941 0.752941 0.752941
+vn -0.270783 -0.709026 -0.651121
+v -0.140437 -0.185077 -0.250946 0.752941 0.752941 0.752941
+vn -0.250746 -0.757358 -0.602939
+v -0.134837 -0.197941 -0.237783 0.752941 0.752941 0.752941
+vn -0.249029 -0.761194 -0.598806
+v -0.129951 -0.208211 -0.226299 0.752941 0.752941 0.752941
+vn -0.292907 -0.646641 -0.704316
+v -0.126495 -0.216021 -0.218178 0.752941 0.752941 0.752941
+vn -0.356016 -0.374535 -0.856140
+v -0.125184 -0.221508 -0.215097 0.752941 0.752941 0.752941
+vn -0.188987 -0.257249 -0.947685
+v -0.096330 -0.129539 -0.301398 0.752941 0.752941 0.752941
+vn -0.172653 -0.469292 -0.866000
+v -0.094535 -0.151011 -0.292770 0.752941 0.752941 0.752941
+vn -0.153882 -0.616741 -0.771979
+v -0.091999 -0.169478 -0.280571 0.752941 0.752941 0.752941
+vn -0.137945 -0.708469 -0.692129
+v -0.089092 -0.185077 -0.266587 0.752941 0.752941 0.752941
+vn -0.127751 -0.756846 -0.640986
+v -0.086185 -0.197941 -0.252604 0.752941 0.752941 0.752941
+vn -0.126873 -0.760706 -0.636576
+v -0.083648 -0.208211 -0.240404 0.752941 0.752941 0.752941
+vn -0.149188 -0.646053 -0.748571
+v -0.081855 -0.216021 -0.231776 0.752941 0.752941 0.752941
+vn -0.181241 -0.373967 -0.909561
+v -0.081174 -0.221508 -0.228504 0.752941 0.752941 0.752941
+vn 0.000000 -0.257054 -0.966397
+v -0.033666 -0.129539 -0.307550 0.752941 0.752941 0.752941
+vn -0.000001 -0.468995 -0.883201
+v -0.033666 -0.151011 -0.298745 0.752941 0.752941 0.752941
+vn -0.000001 -0.616421 -0.787417
+v -0.033666 -0.169478 -0.286298 0.752941 0.752941 0.752941
+vn -0.000004 -0.708179 -0.706033
+v -0.033666 -0.185077 -0.272027 0.752941 0.752941 0.752941
+vn 0.000003 -0.756541 -0.653946
+v -0.033666 -0.197941 -0.257759 0.752941 0.752941 0.752941
+vn 0.000000 -0.760409 -0.649445
+v -0.033666 -0.208211 -0.245311 0.752941 0.752941 0.752941
+vn -0.000003 -0.645696 -0.763595
+v -0.033666 -0.216021 -0.236506 0.752941 0.752941 0.752941
+vn 0.000003 -0.373586 -0.927595
+v -0.033666 -0.221508 -0.233167 0.752941 0.752941 0.752941
+vn 0.188979 -0.257241 -0.947689
+v 0.028997 -0.129539 -0.301398 0.752941 0.752941 0.752941
+vn 0.172658 -0.469296 -0.865997
+v 0.027204 -0.151011 -0.292770 0.752941 0.752941 0.752941
+vn 0.153885 -0.616737 -0.771981
+v 0.024667 -0.169478 -0.280571 0.752941 0.752941 0.752941
+vn 0.137949 -0.708475 -0.692123
+v 0.021760 -0.185077 -0.266587 0.752941 0.752941 0.752941
+vn 0.127747 -0.756844 -0.640990
+v 0.018852 -0.197941 -0.252604 0.752941 0.752941 0.752941
+vn 0.126878 -0.760704 -0.636577
+v 0.016317 -0.208211 -0.240404 0.752941 0.752941 0.752941
+vn 0.149183 -0.646056 -0.748570
+v 0.014522 -0.216021 -0.231776 0.752941 0.752941 0.752941
+vn 0.181253 -0.373976 -0.909554
+v 0.013842 -0.221508 -0.228504 0.752941 0.752941 0.752941
+vn 0.371123 -0.257612 -0.892134
+v 0.087048 -0.129539 -0.283714 0.752941 0.752941 0.752941
+vn 0.339014 -0.469870 -0.815041
+v 0.083591 -0.151011 -0.275593 0.752941 0.752941 0.752941
+vn 0.302101 -0.617341 -0.726378
+v 0.078705 -0.169478 -0.264109 0.752941 0.752941 0.752941
+vn 0.270787 -0.709028 -0.651117
+v 0.073105 -0.185077 -0.250946 0.752941 0.752941 0.752941
+vn 0.250745 -0.757358 -0.602940
+v 0.067504 -0.197941 -0.237783 0.752941 0.752941 0.752941
+vn 0.249030 -0.761190 -0.598810
+v 0.062618 -0.208211 -0.226299 0.752941 0.752941 0.752941
+vn 0.292911 -0.646614 -0.704339
+v 0.059163 -0.216021 -0.218178 0.752941 0.752941 0.752941
+vn 0.356012 -0.374552 -0.856134
+v 0.057853 -0.221508 -0.215097 0.752941 0.752941 0.752941
+vn 0.537815 -0.257931 -0.802637
+v 0.139331 -0.129539 -0.255651 0.752941 0.752941 0.752941
+vn 0.491231 -0.470314 -0.733142
+v 0.134378 -0.151011 -0.248331 0.752941 0.752941 0.752941
+vn 0.437698 -0.617779 -0.653276
+v 0.127376 -0.169478 -0.237985 0.752941 0.752941 0.752941
+vn 0.392266 -0.709462 -0.585483
+v 0.119350 -0.185077 -0.226124 0.752941 0.752941 0.752941
+vn 0.363220 -0.757737 -0.542132
+v 0.111323 -0.197941 -0.214262 0.752941 0.752941 0.752941
+vn 0.360727 -0.761572 -0.538409
+v 0.104322 -0.208211 -0.203915 0.752941 0.752941 0.752941
+vn 0.424405 -0.647017 -0.633443
+v 0.099369 -0.216021 -0.196596 0.752941 0.752941 0.752941
+vn 0.516029 -0.374784 -0.770228
+v 0.097490 -0.221508 -0.193821 0.752941 0.752941 0.752941
+vn 0.683174 -0.258004 -0.683160
+v 0.184695 -0.129539 -0.218360 0.752941 0.752941 0.752941
+vn 0.623972 -0.470454 -0.623964
+v 0.178444 -0.151011 -0.212109 0.752941 0.752941 0.752941
+vn 0.555935 -0.617955 -0.555939
+v 0.169606 -0.169478 -0.203272 0.752941 0.752941 0.752941
+vn 0.498219 -0.709620 -0.498214
+v 0.159475 -0.185077 -0.193140 0.752941 0.752941 0.752941
+vn 0.461320 -0.757871 -0.461320
+v 0.149343 -0.197941 -0.183009 0.752941 0.752941 0.752941
+vn 0.458156 -0.761701 -0.458153
+v 0.140506 -0.208211 -0.174171 0.752941 0.752941 0.752941
+vn 0.539037 -0.647208 -0.539037
+v 0.134254 -0.216021 -0.167920 0.752941 0.752941 0.752941
+vn 0.655487 -0.375038 -0.655502
+v 0.131882 -0.221508 -0.165549 0.752941 0.752941 0.752941
+vn 0.802628 -0.257933 -0.537828
+v 0.221985 -0.129539 -0.172996 0.752941 0.752941 0.752941
+vn 0.733144 -0.470306 -0.491235
+v 0.214666 -0.151011 -0.168043 0.752941 0.752941 0.752941
+vn 0.653270 -0.617788 -0.437695
+v 0.204319 -0.169478 -0.161042 0.752941 0.752941 0.752941
+vn 0.585485 -0.709463 -0.392263
+v 0.192458 -0.185077 -0.153015 0.752941 0.752941 0.752941
+vn 0.542135 -0.757732 -0.363224
+v 0.180596 -0.197941 -0.144989 0.752941 0.752941 0.752941
+vn 0.538411 -0.761569 -0.360730
+v 0.170249 -0.208211 -0.137988 0.752941 0.752941 0.752941
+vn 0.633415 -0.647058 -0.424384
+v 0.162930 -0.216021 -0.133035 0.752941 0.752941 0.752941
+vn 0.770222 -0.374809 -0.516019
+v 0.160154 -0.221508 -0.131156 0.752941 0.752941 0.752941
+vn 0.892130 -0.257625 -0.371124
+v 0.250049 -0.129539 -0.120714 0.752941 0.752941 0.752941
+vn 0.815038 -0.469874 -0.339017
+v 0.241927 -0.151011 -0.117257 0.752941 0.752941 0.752941
+vn 0.726376 -0.617341 -0.302108
+v 0.230444 -0.169478 -0.112372 0.752941 0.752941 0.752941
+vn 0.651103 -0.709042 -0.270784
+v 0.217280 -0.185077 -0.106770 0.752941 0.752941 0.752941
+vn 0.602951 -0.757346 -0.250753
+v 0.204117 -0.197941 -0.101170 0.752941 0.752941 0.752941
+vn 0.598802 -0.761197 -0.249030
+v 0.192634 -0.208211 -0.096284 0.752941 0.752941 0.752941
+vn 0.704316 -0.646643 -0.292902
+v 0.184512 -0.216021 -0.092828 0.752941 0.752941 0.752941
+vn 0.856128 -0.374555 -0.356025
+v 0.181431 -0.221508 -0.091518 0.752941 0.752941 0.752941
+vn 0.947695 -0.257225 -0.188970
+v 0.267733 -0.129539 -0.062663 0.752941 0.752941 0.752941
+vn 0.865990 -0.469309 -0.172655
+v 0.259105 -0.151011 -0.060870 0.752941 0.752941 0.752941
+vn 0.771977 -0.616744 -0.153879
+v 0.246905 -0.169478 -0.058332 0.752941 0.752941 0.752941
+vn 0.692128 -0.708471 -0.137944
+v 0.232922 -0.185077 -0.055425 0.752941 0.752941 0.752941
+vn 0.640990 -0.756843 -0.127754
+v 0.218938 -0.197941 -0.052518 0.752941 0.752941 0.752941
+vn 0.636589 -0.760694 -0.126879
+v 0.206739 -0.208211 -0.049982 0.752941 0.752941 0.752941
+vn 0.748526 -0.646107 -0.149182
+v 0.198111 -0.216021 -0.048188 0.752941 0.752941 0.752941
+vn 0.909536 -0.374029 -0.181235
+v 0.194838 -0.221508 -0.047507 0.752941 0.752941 0.752941
+vn 0.861565 -0.477682 0.171830
+v 0.193923 -0.225858 0.047319 0.752941 0.752941 0.752941
+vn 0.878651 -0.477465 0.000002
+v 0.198567 -0.225858 0.000001 0.752941 0.752941 0.752941
+vn 0.538123 -0.836020 0.107206
+v 0.189661 -0.230071 0.046432 0.752941 0.752941 0.752941
+vn 0.548990 -0.835829 0.000006
+v 0.194219 -0.230071 0.000001 0.752941 0.752941 0.752941
+vn 0.277939 -0.959003 0.055353
+v 0.179775 -0.234009 0.044377 0.752941 0.752941 0.752941
+vn 0.283578 -0.958949 0.000000
+v 0.184132 -0.234009 0.000001 0.752941 0.752941 0.752941
+vn 0.147286 -0.988659 0.029329
+v 0.161991 -0.237539 0.040680 0.752941 0.752941 0.752941
+vn 0.150275 -0.988644 -0.000001
+v 0.165983 -0.237539 0.000001 0.752941 0.752941 0.752941
+vn 0.079724 -0.996691 0.015873
+v 0.134030 -0.240522 0.034865 0.752941 0.752941 0.752941
+vn 0.081350 -0.996686 0.000001
+v 0.137453 -0.240522 0.000001 0.752941 0.752941 0.752941
+vn 0.041064 -0.999123 0.008175
+v 0.093617 -0.242821 0.026464 0.752941 0.752941 0.752941
+vn 0.041898 -0.999122 0.000000
+v 0.096215 -0.242821 0.000001 0.752941 0.752941 0.752941
+vn 0.016963 -0.999850 0.003374
+v 0.038478 -0.244301 0.014999 0.752941 0.752941 0.752941
+vn 0.017304 -0.999850 0.000000
+v 0.039950 -0.244301 0.000001 0.752941 0.752941 0.752941
+vn -0.000000 -1.000000 0.000000
+v -0.033666 -0.244825 0.000001 0.752941 0.752941 0.752941
+vn 0.810861 -0.478225 0.337351
+v 0.180569 -0.225858 0.091153 0.752941 0.752941 0.752941
+vn 0.506074 -0.836433 0.210401
+v 0.176557 -0.230071 0.089444 0.752941 0.752941 0.752941
+vn 0.261292 -0.959129 0.108618
+v 0.167251 -0.234009 0.085485 0.752941 0.752941 0.752941
+vn 0.138453 -0.988695 0.057555
+v 0.150511 -0.237539 0.078362 0.752941 0.752941 0.752941
+vn 0.074941 -0.996701 0.031150
+v 0.124191 -0.240522 0.067164 0.752941 0.752941 0.752941
+vn 0.038599 -0.999126 0.016042
+v 0.086149 -0.242821 0.050979 0.752941 0.752941 0.752941
+vn 0.015944 -0.999851 0.006625
+v 0.034246 -0.244301 0.028895 0.752941 0.752941 0.752941
+vn 0.729435 -0.478554 0.488785
+v 0.159378 -0.225858 0.130631 0.752941 0.752941 0.752941
+vn 0.455027 -0.836673 0.304843
+v 0.155764 -0.230071 0.128186 0.752941 0.752941 0.752941
+vn 0.234801 -0.959236 0.157274
+v 0.147378 -0.234009 0.122511 0.752941 0.752941 0.752941
+vn 0.124407 -0.988726 0.083332
+v 0.132292 -0.237539 0.112302 0.752941 0.752941 0.752941
+vn 0.067341 -0.996710 0.045109
+v 0.108577 -0.240522 0.096254 0.752941 0.752941 0.752941
+vn 0.034682 -0.999128 0.023231
+v 0.074298 -0.242821 0.073059 0.752941 0.752941 0.752941
+vn 0.014324 -0.999851 0.009594
+v 0.027528 -0.244301 0.041409 0.752941 0.752941 0.752941
+vn 0.620817 -0.478709 0.620826
+v 0.131219 -0.225858 0.164887 0.752941 0.752941 0.752941
+vn 0.387116 -0.836832 0.387109
+v 0.128132 -0.230071 0.161798 0.752941 0.752941 0.752941
+vn 0.199769 -0.959263 0.199767
+v 0.120971 -0.234009 0.154636 0.752941 0.752941 0.752941
+vn 0.105832 -0.988736 0.105831
+v 0.108085 -0.237539 0.141752 0.752941 0.752941 0.752941
+vn 0.057284 -0.996713 0.057284
+v 0.087828 -0.240522 0.121494 0.752941 0.752941 0.752941
+vn 0.029503 -0.999129 0.029502
+v 0.058549 -0.242821 0.092216 0.752941 0.752941 0.752941
+vn 0.012184 -0.999852 0.012184
+v 0.018601 -0.244301 0.052268 0.752941 0.752941 0.752941
+vn 0.488791 -0.478573 0.729418
+v 0.096966 -0.225858 0.193045 0.752941 0.752941 0.752941
+vn 0.304785 -0.836740 0.454942
+v 0.094519 -0.230071 0.189429 0.752941 0.752941 0.752941
+vn 0.157307 -0.959223 0.234833
+v 0.088846 -0.234009 0.181045 0.752941 0.752941 0.752941
+vn 0.083332 -0.988726 0.124404
+v 0.078637 -0.237539 0.165959 0.752941 0.752941 0.752941
+vn 0.045107 -0.996710 0.067338
+v 0.062588 -0.240522 0.142242 0.752941 0.752941 0.752941
+vn 0.023231 -0.999128 0.034683
+v 0.039392 -0.242821 0.107965 0.752941 0.752941 0.752941
+vn 0.009594 -0.999851 0.014325
+v 0.007743 -0.244301 0.061194 0.752941 0.752941 0.752941
+vn 0.337335 -0.478176 0.810897
+v 0.057486 -0.225858 0.214236 0.752941 0.752941 0.752941
+vn 0.210432 -0.836400 0.506116
+v 0.055779 -0.230071 0.210224 0.752941 0.752941 0.752941
+vn 0.108620 -0.959127 0.261300
+v 0.051820 -0.234009 0.200919 0.752941 0.752941 0.752941
+vn 0.057547 -0.988697 0.138440
+v 0.044697 -0.237539 0.184176 0.752941 0.752941 0.752941
+vn 0.031150 -0.996701 0.074942
+v 0.033498 -0.240522 0.157857 0.752941 0.752941 0.752941
+vn 0.016042 -0.999126 0.038599
+v 0.017312 -0.242821 0.119816 0.752941 0.752941 0.752941
+vn 0.006624 -0.999851 0.015944
+v -0.004772 -0.244301 0.067911 0.752941 0.752941 0.752941
+vn 0.171810 -0.477683 0.861569
+v 0.013651 -0.225858 0.227589 0.752941 0.752941 0.752941
+vn 0.107208 -0.836003 0.538150
+v 0.012766 -0.230071 0.223327 0.752941 0.752941 0.752941
+vn 0.055344 -0.959000 0.277949
+v 0.010710 -0.234009 0.213442 0.752941 0.752941 0.752941
+vn 0.029327 -0.988660 0.147281
+v 0.007013 -0.237539 0.195657 0.752941 0.752941 0.752941
+vn 0.015874 -0.996690 0.079725
+v 0.001200 -0.240522 0.167696 0.752941 0.752941 0.752941
+vn 0.008174 -0.999123 0.041064
+v -0.007203 -0.242821 0.127284 0.752941 0.752941 0.752941
+vn 0.003375 -0.999851 0.016963
+v -0.018667 -0.244301 0.072144 0.752941 0.752941 0.752941
+vn -0.000000 -0.477462 0.878652
+v -0.033666 -0.225858 0.232234 0.752941 0.752941 0.752941
+vn 0.000004 -0.835892 0.548894
+v -0.033666 -0.230071 0.227884 0.752941 0.752941 0.752941
+vn 0.000000 -0.958947 0.283584
+v -0.033666 -0.234009 0.217797 0.752941 0.752941 0.752941
+vn -0.000001 -0.988643 0.150282
+v -0.033666 -0.237539 0.199650 0.752941 0.752941 0.752941
+vn 0.000000 -0.996686 0.081347
+v -0.033666 -0.240522 0.171118 0.752941 0.752941 0.752941
+vn 0.000000 -0.999122 0.041898
+v -0.033666 -0.242821 0.129881 0.752941 0.752941 0.752941
+vn 0.000000 -0.999850 0.017304
+v -0.033666 -0.244301 0.073616 0.752941 0.752941 0.752941
+vn -0.171823 -0.477679 0.861568
+v -0.080984 -0.225858 0.227589 0.752941 0.752941 0.752941
+vn -0.107200 -0.836013 0.538135
+v -0.080097 -0.230071 0.223327 0.752941 0.752941 0.752941
+vn -0.055350 -0.958999 0.277952
+v -0.078043 -0.234009 0.213442 0.752941 0.752941 0.752941
+vn -0.029328 -0.988660 0.147282
+v -0.074345 -0.237539 0.195657 0.752941 0.752941 0.752941
+vn -0.015873 -0.996691 0.079725
+v -0.068531 -0.240522 0.167696 0.752941 0.752941 0.752941
+vn -0.008175 -0.999123 0.041064
+v -0.060130 -0.242821 0.127284 0.752941 0.752941 0.752941
+vn -0.003375 -0.999851 0.016963
+v -0.048666 -0.244301 0.072144 0.752941 0.752941 0.752941
+vn -0.337353 -0.478142 0.810909
+v -0.124818 -0.225858 0.214236 0.752941 0.752941 0.752941
+vn -0.210432 -0.836401 0.506113
+v -0.123111 -0.230071 0.210224 0.752941 0.752941 0.752941
+vn -0.108613 -0.959129 0.261294
+v -0.119151 -0.234009 0.200919 0.752941 0.752941 0.752941
+vn -0.057547 -0.988697 0.138441
+v -0.112028 -0.237539 0.184176 0.752941 0.752941 0.752941
+vn -0.031152 -0.996701 0.074942
+v -0.100830 -0.240522 0.157857 0.752941 0.752941 0.752941
+vn -0.016042 -0.999126 0.038599
+v -0.084644 -0.242821 0.119816 0.752941 0.752941 0.752941
+vn -0.006625 -0.999851 0.015944
+v -0.062560 -0.244301 0.067911 0.752941 0.752941 0.752941
+vn -0.488750 -0.478631 0.729408
+v -0.164297 -0.225858 0.193045 0.752941 0.752941 0.752941
+vn -0.304815 -0.836713 0.454972
+v -0.161852 -0.230071 0.189429 0.752941 0.752941 0.752941
+vn -0.157297 -0.959228 0.234820
+v -0.156177 -0.234009 0.181045 0.752941 0.752941 0.752941
+vn -0.083328 -0.988726 0.124405
+v -0.145968 -0.237539 0.165959 0.752941 0.752941 0.752941
+vn -0.045107 -0.996710 0.067340
+v -0.129920 -0.240522 0.142242 0.752941 0.752941 0.752941
+vn -0.023231 -0.999128 0.034683
+v -0.106724 -0.242821 0.107965 0.752941 0.752941 0.752941
+vn -0.009593 -0.999851 0.014325
+v -0.075075 -0.244301 0.061194 0.752941 0.752941 0.752941
+vn -0.620805 -0.478738 0.620815
+v -0.198552 -0.225858 0.164887 0.752941 0.752941 0.752941
+vn -0.387078 -0.836863 0.387080
+v -0.195464 -0.230071 0.161798 0.752941 0.752941 0.752941
+vn -0.199768 -0.959264 0.199764
+v -0.188302 -0.234009 0.154636 0.752941 0.752941 0.752941
+vn -0.105838 -0.988735 0.105835
+v -0.175418 -0.237539 0.141752 0.752941 0.752941 0.752941
+vn -0.057284 -0.996713 0.057284
+v -0.155161 -0.240522 0.121494 0.752941 0.752941 0.752941
+vn -0.029503 -0.999129 0.029503
+v -0.125882 -0.242821 0.092216 0.752941 0.752941 0.752941
+vn -0.012185 -0.999852 0.012184
+v -0.085934 -0.244301 0.052268 0.752941 0.752941 0.752941
+vn -0.729444 -0.478552 0.488774
+v -0.226711 -0.225858 0.130631 0.752941 0.752941 0.752941
+vn -0.454966 -0.836721 0.304801
+v -0.223095 -0.230071 0.128186 0.752941 0.752941 0.752941
+vn -0.234810 -0.959231 0.157290
+v -0.214710 -0.234009 0.122511 0.752941 0.752941 0.752941
+vn -0.124410 -0.988725 0.083333
+v -0.199625 -0.237539 0.112302 0.752941 0.752941 0.752941
+vn -0.067340 -0.996710 0.045106
+v -0.175908 -0.240522 0.096254 0.752941 0.752941 0.752941
+vn -0.034682 -0.999128 0.023231
+v -0.141630 -0.242821 0.073059 0.752941 0.752941 0.752941
+vn -0.014324 -0.999851 0.009593
+v -0.094859 -0.244301 0.041409 0.752941 0.752941 0.752941
+vn -0.810955 -0.478052 0.337370
+v -0.247902 -0.225858 0.091153 0.752941 0.752941 0.752941
+vn -0.506077 -0.836430 0.210407
+v -0.243890 -0.230071 0.089444 0.752941 0.752941 0.752941
+vn -0.261288 -0.959131 0.108614
+v -0.234584 -0.234009 0.085485 0.752941 0.752941 0.752941
+vn -0.138444 -0.988697 0.057548
+v -0.217842 -0.237539 0.078362 0.752941 0.752941 0.752941
+vn -0.074942 -0.996701 0.031150
+v -0.191522 -0.240522 0.067164 0.752941 0.752941 0.752941
+vn -0.038599 -0.999126 0.016043
+v -0.153482 -0.242821 0.050979 0.752941 0.752941 0.752941
+vn -0.015944 -0.999851 0.006625
+v -0.101577 -0.244301 0.028895 0.752941 0.752941 0.752941
+vn -0.861569 -0.477676 0.171828
+v -0.261254 -0.225858 0.047319 0.752941 0.752941 0.752941
+vn -0.538133 -0.836015 0.107198
+v -0.256992 -0.230071 0.046432 0.752941 0.752941 0.752941
+vn -0.277950 -0.959000 0.055348
+v -0.247107 -0.234009 0.044377 0.752941 0.752941 0.752941
+vn -0.147281 -0.988660 0.029328
+v -0.229322 -0.237539 0.040680 0.752941 0.752941 0.752941
+vn -0.079725 -0.996690 0.015875
+v -0.201361 -0.240522 0.034865 0.752941 0.752941 0.752941
+vn -0.041065 -0.999123 0.008176
+v -0.160950 -0.242821 0.026464 0.752941 0.752941 0.752941
+vn -0.016962 -0.999851 0.003375
+v -0.105809 -0.244301 0.014999 0.752941 0.752941 0.752941
+vn -0.878678 -0.477414 -0.000003
+v -0.265899 -0.225858 0.000001 0.752941 0.752941 0.752941
+vn -0.548943 -0.835860 0.000001
+v -0.261550 -0.230071 0.000001 0.752941 0.752941 0.752941
+vn -0.283581 -0.958948 0.000001
+v -0.251463 -0.234009 0.000001 0.752941 0.752941 0.752941
+vn -0.150278 -0.988644 -0.000000
+v -0.233315 -0.237539 0.000001 0.752941 0.752941 0.752941
+vn -0.081349 -0.996686 -0.000000
+v -0.204784 -0.240522 0.000001 0.752941 0.752941 0.752941
+vn -0.041899 -0.999122 0.000000
+v -0.163548 -0.242821 0.000001 0.752941 0.752941 0.752941
+vn -0.017305 -0.999850 -0.000000
+v -0.107283 -0.244301 0.000001 0.752941 0.752941 0.752941
+vn -0.861581 -0.477661 -0.171812
+v -0.261254 -0.225858 -0.047317 0.752941 0.752941 0.752941
+vn -0.538148 -0.836004 -0.107213
+v -0.256992 -0.230071 -0.046432 0.752941 0.752941 0.752941
+vn -0.277946 -0.959001 -0.055347
+v -0.247107 -0.234009 -0.044376 0.752941 0.752941 0.752941
+vn -0.147281 -0.988660 -0.029327
+v -0.229322 -0.237539 -0.040678 0.752941 0.752941 0.752941
+vn -0.079726 -0.996690 -0.015874
+v -0.201361 -0.240522 -0.034865 0.752941 0.752941 0.752941
+vn -0.041064 -0.999123 -0.008176
+v -0.160950 -0.242821 -0.026463 0.752941 0.752941 0.752941
+vn -0.016962 -0.999851 -0.003375
+v -0.105809 -0.244301 -0.014999 0.752941 0.752941 0.752941
+vn -0.810940 -0.478093 -0.337348
+v -0.247902 -0.225858 -0.091151 0.752941 0.752941 0.752941
+vn -0.506110 -0.836405 -0.210427
+v -0.243890 -0.230071 -0.089444 0.752941 0.752941 0.752941
+vn -0.261290 -0.959130 -0.108612
+v -0.234584 -0.234009 -0.085485 0.752941 0.752941 0.752941
+vn -0.138445 -0.988697 -0.057547
+v -0.217842 -0.237539 -0.078362 0.752941 0.752941 0.752941
+vn -0.074942 -0.996701 -0.031150
+v -0.191522 -0.240522 -0.067164 0.752941 0.752941 0.752941
+vn -0.038599 -0.999126 -0.016042
+v -0.153482 -0.242821 -0.050977 0.752941 0.752941 0.752941
+vn -0.015944 -0.999851 -0.006625
+v -0.101577 -0.244301 -0.028895 0.752941 0.752941 0.752941
+vn -0.729440 -0.478545 -0.488787
+v -0.226711 -0.225858 -0.130631 0.752941 0.752941 0.752941
+vn -0.454939 -0.836747 -0.304772
+v -0.223095 -0.230071 -0.128184 0.752941 0.752941 0.752941
+vn -0.234824 -0.959226 -0.157302
+v -0.214710 -0.234009 -0.122511 0.752941 0.752941 0.752941
+vn -0.124409 -0.988726 -0.083332
+v -0.199625 -0.237539 -0.112302 0.752941 0.752941 0.752941
+vn -0.067340 -0.996710 -0.045106
+v -0.175908 -0.240522 -0.096254 0.752941 0.752941 0.752941
+vn -0.034683 -0.999128 -0.023231
+v -0.141630 -0.242821 -0.073059 0.752941 0.752941 0.752941
+vn -0.014324 -0.999851 -0.009593
+v -0.094859 -0.244301 -0.041409 0.752941 0.752941 0.752941
+vn -0.620794 -0.478803 -0.620776
+v -0.198552 -0.225858 -0.164885 0.752941 0.752941 0.752941
+vn -0.387123 -0.836820 -0.387127
+v -0.195464 -0.230071 -0.161798 0.752941 0.752941 0.752941
+vn -0.199764 -0.959264 -0.199766
+v -0.188302 -0.234009 -0.154636 0.752941 0.752941 0.752941
+vn -0.105834 -0.988735 -0.105837
+v -0.175418 -0.237539 -0.141751 0.752941 0.752941 0.752941
+vn -0.057284 -0.996713 -0.057284
+v -0.155161 -0.240522 -0.121494 0.752941 0.752941 0.752941
+vn -0.029502 -0.999129 -0.029503
+v -0.125882 -0.242821 -0.092215 0.752941 0.752941 0.752941
+vn -0.012184 -0.999852 -0.012184
+v -0.085934 -0.244301 -0.052267 0.752941 0.752941 0.752941
+vn -0.488748 -0.478672 -0.729382
+v -0.164297 -0.225858 -0.193044 0.752941 0.752941 0.752941
+vn -0.304818 -0.836699 -0.454995
+v -0.161852 -0.230071 -0.189429 0.752941 0.752941 0.752941
+vn -0.157283 -0.959235 -0.234799
+v -0.156177 -0.234009 -0.181043 0.752941 0.752941 0.752941
+vn -0.083334 -0.988725 -0.124410
+v -0.145968 -0.237539 -0.165958 0.752941 0.752941 0.752941
+vn -0.045107 -0.996710 -0.067340
+v -0.129920 -0.240522 -0.142242 0.752941 0.752941 0.752941
+vn -0.023231 -0.999128 -0.034682
+v -0.106724 -0.242821 -0.107963 0.752941 0.752941 0.752941
+vn -0.009594 -0.999851 -0.014325
+v -0.075075 -0.244301 -0.061194 0.752941 0.752941 0.752941
+vn -0.337338 -0.478235 -0.810860
+v -0.124818 -0.225858 -0.214235 0.752941 0.752941 0.752941
+vn -0.210433 -0.836408 -0.506102
+v -0.123111 -0.230071 -0.210223 0.752941 0.752941 0.752941
+vn -0.108616 -0.959132 -0.261282
+v -0.119151 -0.234009 -0.200917 0.752941 0.752941 0.752941
+vn -0.057552 -0.988696 -0.138449
+v -0.112028 -0.237539 -0.184176 0.752941 0.752941 0.752941
+vn -0.031151 -0.996701 -0.074942
+v -0.100830 -0.240522 -0.157857 0.752941 0.752941 0.752941
+vn -0.016043 -0.999126 -0.038598
+v -0.084644 -0.242821 -0.119815 0.752941 0.752941 0.752941
+vn -0.006625 -0.999851 -0.015944
+v -0.062560 -0.244301 -0.067911 0.752941 0.752941 0.752941
+vn -0.171830 -0.477684 -0.861564
+v -0.080984 -0.225858 -0.227589 0.752941 0.752941 0.752941
+vn -0.107203 -0.836011 -0.538138
+v -0.080097 -0.230071 -0.223327 0.752941 0.752941 0.752941
+vn -0.055351 -0.958999 -0.277952
+v -0.078043 -0.234009 -0.213442 0.752941 0.752941 0.752941
+vn -0.029327 -0.988660 -0.147283
+v -0.074345 -0.237539 -0.195657 0.752941 0.752941 0.752941
+vn -0.015874 -0.996691 -0.079725
+v -0.068531 -0.240522 -0.167696 0.752941 0.752941 0.752941
+vn -0.008175 -0.999123 -0.041063
+v -0.060130 -0.242821 -0.127283 0.752941 0.752941 0.752941
+vn -0.003375 -0.999850 -0.016963
+v -0.048666 -0.244301 -0.072144 0.752941 0.752941 0.752941
+vn 0.000001 -0.477461 -0.878653
+v -0.033666 -0.225858 -0.232234 0.752941 0.752941 0.752941
+vn -0.000005 -0.835893 -0.548893
+v -0.033666 -0.230071 -0.227884 0.752941 0.752941 0.752941
+vn -0.000001 -0.958950 -0.283577
+v -0.033666 -0.234009 -0.217797 0.752941 0.752941 0.752941
+vn -0.000001 -0.988644 -0.150274
+v -0.033666 -0.237539 -0.199648 0.752941 0.752941 0.752941
+vn 0.000001 -0.996686 -0.081350
+v -0.033666 -0.240522 -0.171118 0.752941 0.752941 0.752941
+vn 0.000000 -0.999122 -0.041898
+v -0.033666 -0.242821 -0.129881 0.752941 0.752941 0.752941
+vn -0.000000 -0.999850 -0.017304
+v -0.033666 -0.244301 -0.073616 0.752941 0.752941 0.752941
+vn 0.171818 -0.477680 -0.861569
+v 0.013651 -0.225858 -0.227589 0.752941 0.752941 0.752941
+vn 0.107221 -0.836004 -0.538146
+v 0.012766 -0.230071 -0.223327 0.752941 0.752941 0.752941
+vn 0.055350 -0.959000 -0.277948
+v 0.010710 -0.234009 -0.213442 0.752941 0.752941 0.752941
+vn 0.029327 -0.988660 -0.147283
+v 0.007013 -0.237539 -0.195657 0.752941 0.752941 0.752941
+vn 0.015873 -0.996691 -0.079725
+v 0.001200 -0.240522 -0.167696 0.752941 0.752941 0.752941
+vn 0.008175 -0.999123 -0.041063
+v -0.007203 -0.242821 -0.127283 0.752941 0.752941 0.752941
+vn 0.003375 -0.999850 -0.016963
+v -0.018667 -0.244301 -0.072144 0.752941 0.752941 0.752941
+vn 0.337320 -0.478268 -0.810848
+v 0.057486 -0.225858 -0.214235 0.752941 0.752941 0.752941
+vn 0.210431 -0.836406 -0.506106
+v 0.055779 -0.230071 -0.210223 0.752941 0.752941 0.752941
+vn 0.108619 -0.959130 -0.261290
+v 0.051820 -0.234009 -0.200917 0.752941 0.752941 0.752941
+vn 0.057553 -0.988696 -0.138449
+v 0.044697 -0.237539 -0.184176 0.752941 0.752941 0.752941
+vn 0.031151 -0.996701 -0.074941
+v 0.033498 -0.240522 -0.157857 0.752941 0.752941 0.752941
+vn 0.016043 -0.999126 -0.038598
+v 0.017312 -0.242821 -0.119815 0.752941 0.752941 0.752941
+vn 0.006624 -0.999851 -0.015944
+v -0.004772 -0.244301 -0.067911 0.752941 0.752941 0.752941
+vn 0.488787 -0.478614 -0.729394
+v 0.096966 -0.225858 -0.193044 0.752941 0.752941 0.752941
+vn 0.304787 -0.836726 -0.454967
+v 0.094519 -0.230071 -0.189429 0.752941 0.752941 0.752941
+vn 0.157292 -0.959230 -0.234813
+v 0.088846 -0.234009 -0.181043 0.752941 0.752941 0.752941
+vn 0.083334 -0.988725 -0.124408
+v 0.078637 -0.237539 -0.165958 0.752941 0.752941 0.752941
+vn 0.045107 -0.996710 -0.067339
+v 0.062588 -0.240522 -0.142242 0.752941 0.752941 0.752941
+vn 0.023231 -0.999128 -0.034682
+v 0.039392 -0.242821 -0.107963 0.752941 0.752941 0.752941
+vn 0.009594 -0.999851 -0.014325
+v 0.007743 -0.244301 -0.061194 0.752941 0.752941 0.752941
+vn 0.620802 -0.478775 -0.620790
+v 0.131219 -0.225858 -0.164885 0.752941 0.752941 0.752941
+vn 0.387161 -0.836791 -0.387153
+v 0.128132 -0.230071 -0.161798 0.752941 0.752941 0.752941
+vn 0.199770 -0.959263 -0.199766
+v 0.120971 -0.234009 -0.154636 0.752941 0.752941 0.752941
+vn 0.105831 -0.988736 -0.105831
+v 0.108085 -0.237539 -0.141751 0.752941 0.752941 0.752941
+vn 0.057283 -0.996713 -0.057285
+v 0.087828 -0.240522 -0.121494 0.752941 0.752941 0.752941
+vn 0.029501 -0.999129 -0.029503
+v 0.058549 -0.242821 -0.092215 0.752941 0.752941 0.752941
+vn 0.012184 -0.999852 -0.012184
+v 0.018601 -0.244301 -0.052267 0.752941 0.752941 0.752941
+vn 0.729434 -0.478553 -0.488788
+v 0.159378 -0.225858 -0.130631 0.752941 0.752941 0.752941
+vn 0.455004 -0.836698 -0.304809
+v 0.155764 -0.230071 -0.128184 0.752941 0.752941 0.752941
+vn 0.234813 -0.959230 -0.157292
+v 0.147378 -0.234009 -0.122511 0.752941 0.752941 0.752941
+vn 0.124405 -0.988726 -0.083333
+v 0.132292 -0.237539 -0.112302 0.752941 0.752941 0.752941
+vn 0.067342 -0.996710 -0.045108
+v 0.108577 -0.240522 -0.096254 0.752941 0.752941 0.752941
+vn 0.034683 -0.999128 -0.023231
+v 0.074298 -0.242821 -0.073059 0.752941 0.752941 0.752941
+vn 0.014324 -0.999851 -0.009595
+v 0.027528 -0.244301 -0.041409 0.752941 0.752941 0.752941
+vn 0.810844 -0.478266 -0.337332
+v 0.180569 -0.225858 -0.091151 0.752941 0.752941 0.752941
+vn 0.506105 -0.836407 -0.210431
+v 0.176557 -0.230071 -0.089444 0.752941 0.752941 0.752941
+vn 0.261295 -0.959129 -0.108616
+v 0.167251 -0.234009 -0.085485 0.752941 0.752941 0.752941
+vn 0.138453 -0.988695 -0.057551
+v 0.150511 -0.237539 -0.078362 0.752941 0.752941 0.752941
+vn 0.074941 -0.996701 -0.031150
+v 0.124191 -0.240522 -0.067164 0.752941 0.752941 0.752941
+vn 0.038599 -0.999126 -0.016042
+v 0.086149 -0.242821 -0.050977 0.752941 0.752941 0.752941
+vn 0.015944 -0.999851 -0.006625
+v 0.034246 -0.244301 -0.028895 0.752941 0.752941 0.752941
+vn 0.861578 -0.477662 -0.171821
+v 0.193923 -0.225858 -0.047317 0.752941 0.752941 0.752941
+vn 0.538136 -0.836010 -0.107220
+v 0.189661 -0.230071 -0.046432 0.752941 0.752941 0.752941
+vn 0.277933 -0.959005 -0.055350
+v 0.179775 -0.234009 -0.044376 0.752941 0.752941 0.752941
+vn 0.147288 -0.988659 -0.029327
+v 0.161991 -0.237539 -0.040678 0.752941 0.752941 0.752941
+vn 0.079724 -0.996691 -0.015875
+v 0.134030 -0.240522 -0.034865 0.752941 0.752941 0.752941
+vn 0.041063 -0.999123 -0.008175
+v 0.093617 -0.242821 -0.026463 0.752941 0.752941 0.752941
+vn 0.016963 -0.999850 -0.003374
+v 0.038478 -0.244301 -0.014999 0.752941 0.752941 0.752941
+vn 0.001789 -0.999998 -0.000016
+v -0.282377 0.069951 0.000001 0.752941 0.752941 0.752941
+vn 0.001822 -0.973634 0.228107
+v -0.281710 0.071453 0.015302 0.752941 0.752941 0.752941
+vn 0.008062 -0.975336 0.220578
+v -0.320988 0.071381 0.015302 0.752941 0.752941 0.752941
+vn 0.007981 -0.999968 -0.000047
+v -0.320966 0.069883 0.000001 0.752941 0.752941 0.752941
+vn 0.029211 -0.975055 0.220032
+v -0.355594 0.070884 0.015302 0.752941 0.752941 0.752941
+vn 0.029088 -0.999577 -0.000208
+v -0.355000 0.069404 0.000001 0.752941 0.752941 0.752941
+vn 0.073370 -0.972692 0.220196
+v -0.385356 0.069529 0.015302 0.752941 0.752941 0.752941
+vn 0.073210 -0.997316 -0.000554
+v -0.384296 0.068106 0.000001 0.752941 0.752941 0.752941
+vn 0.156004 -0.962198 0.223245
+v -0.410096 0.066894 0.015302 0.752941 0.752941 0.752941
+vn 0.156030 -0.987752 -0.001166
+v -0.408676 0.065579 0.000001 0.752941 0.752941 0.752941
+vn 0.305644 -0.922881 0.234248
+v -0.429641 0.062547 0.015302 0.752941 0.752941 0.752941
+vn 0.307285 -0.951615 -0.002132
+v -0.427955 0.061412 0.000001 0.752941 0.752941 0.752941
+vn 0.554568 -0.790763 0.259129
+v -0.443819 0.056064 0.015302 0.752941 0.752941 0.752941
+vn 0.565293 -0.824884 -0.003159
+v -0.441951 0.055195 0.000001 0.752941 0.752941 0.752941
+vn 0.837376 -0.464712 0.287828
+v -0.452453 0.047015 0.015302 0.752941 0.752941 0.752941
+vn 0.870593 -0.491996 -0.002746
+v -0.450482 0.046519 0.000001 0.752941 0.752941 0.752941
+vn 0.954311 -0.067197 0.291163
+v -0.455371 0.034975 0.015302 0.752941 0.752941 0.752941
+vn 0.997408 -0.071948 -0.000812
+v -0.453367 0.034975 0.000001 0.752941 0.752941 0.752941
+vn 0.001701 -0.852035 0.523482
+v -0.279948 0.075415 0.026231 0.752941 0.752941 0.752941
+vn 0.007612 -0.864380 0.502782
+v -0.321046 0.075336 0.026231 0.752941 0.752941 0.752941
+vn 0.027546 -0.864149 0.502482
+v -0.357163 0.074783 0.026231 0.752941 0.752941 0.752941
+vn 0.069195 -0.860799 0.504219
+v -0.388144 0.073283 0.026231 0.752941 0.752941 0.752941
+vn 0.146433 -0.846036 0.512620
+v -0.413838 0.070359 0.026231 0.752941 0.752941 0.752941
+vn 0.281430 -0.796092 0.535756
+v -0.434089 0.065542 0.026231 0.752941 0.752941 0.752941
+vn 0.487456 -0.653650 0.578902
+v -0.448744 0.058355 0.026231 0.752941 0.752941 0.752941
+vn 0.696809 -0.365401 0.617202
+v -0.457650 0.048323 0.026231 0.752941 0.752941 0.752941
+vn 0.786132 -0.049974 0.616035
+v -0.460654 0.034975 0.026231 0.752941 0.752941 0.752941
+vn 0.001089 -0.513217 0.858258
+v -0.277459 0.081017 0.032790 0.752941 0.752941 0.752941
+vn 0.005258 -0.561133 0.827709
+v -0.321129 0.080926 0.032790 0.752941 0.752941 0.752941
+vn 0.019657 -0.559775 0.828412
+v -0.359379 0.080298 0.032790 0.752941 0.752941 0.752941
+vn 0.049568 -0.553275 0.831523
+v -0.392088 0.078588 0.032790 0.752941 0.752941 0.752941
+vn 0.103024 -0.531875 0.840533
+v -0.419128 0.075262 0.032790 0.752941 0.752941 0.752941
+vn 0.187959 -0.476063 0.859090
+v -0.440376 0.069776 0.032790 0.752941 0.752941 0.752941
+vn 0.297075 -0.359899 0.884431
+v -0.455707 0.061593 0.032790 0.752941 0.752941 0.752941
+vn 0.394316 -0.188964 0.899337
+v -0.464998 0.050172 0.032790 0.752941 0.752941 0.752941
+vn 0.446910 -0.024222 0.894251
+v -0.468122 0.034975 0.032790 0.752941 0.752941 0.752941
+vn -0.000219 0.086476 0.996254
+v -0.274605 0.087437 0.034975 0.752941 0.752941 0.752941
+vn -0.000095 0.001667 0.999999
+v -0.321223 0.087335 0.034975 0.752941 0.752941 0.752941
+vn 0.000927 0.004512 0.999989
+v -0.361921 0.086617 0.034975 0.752941 0.752941 0.752941
+vn 0.002702 0.010590 0.999940
+v -0.396609 0.084671 0.034975 0.752941 0.752941 0.752941
+vn 0.003556 0.021031 0.999772
+v -0.425192 0.080880 0.034975 0.752941 0.752941 0.752941
+vn -0.001323 0.034358 0.999409
+v -0.447584 0.074629 0.034975 0.752941 0.752941 0.752941
+vn -0.017950 0.038531 0.999096
+v -0.463689 0.065306 0.034975 0.752941 0.752941 0.752941
+vn -0.033156 0.019585 0.999258
+v -0.473419 0.052292 0.034975 0.752941 0.752941 0.752941
+vn -0.022988 0.001469 0.999735
+v -0.476683 0.034975 0.034975 0.752941 0.752941 0.752941
+vn -0.001457 0.611857 0.790967
+v -0.271751 0.093859 0.032790 0.752941 0.752941 0.752941
+vn -0.006039 0.562877 0.826519
+v -0.321318 0.093743 0.032790 0.752941 0.752941 0.752941
+vn -0.021879 0.563701 0.825689
+v -0.364463 0.092938 0.032790 0.752941 0.752941 0.752941
+vn -0.054883 0.559674 0.826893
+v -0.401129 0.090753 0.032790 0.752941 0.752941 0.752941
+vn -0.114546 0.541436 0.832903
+v -0.431258 0.086498 0.032790 0.752941 0.752941 0.752941
+vn -0.211755 0.490049 0.845583
+v -0.454790 0.079484 0.032790 0.752941 0.752941 0.752941
+vn -0.342003 0.374911 0.861670
+v -0.471671 0.069018 0.032790 0.752941 0.752941 0.752941
+vn -0.451240 0.190807 0.871765
+v -0.481842 0.054412 0.032790 0.752941 0.752941 0.752941
+vn -0.481456 0.019034 0.876263
+v -0.485246 0.034975 0.032790 0.752941 0.752941 0.752941
+vn -0.002144 0.877249 0.480031
+v -0.269261 0.099460 0.026231 0.752941 0.752941 0.752941
+vn -0.009557 0.864767 0.502083
+v -0.321401 0.099335 0.026231 0.752941 0.752941 0.752941
+vn -0.035914 0.864073 0.502084
+v -0.366681 0.098453 0.026231 0.752941 0.752941 0.752941
+vn -0.091406 0.857035 0.507086
+v -0.405072 0.096059 0.026231 0.752941 0.752941 0.752941
+vn -0.192546 0.830761 0.522266
+v -0.436548 0.091399 0.026231 0.752941 0.752941 0.752941
+vn -0.357735 0.754421 0.550341
+v -0.461077 0.083717 0.026231 0.752941 0.752941 0.752941
+vn -0.573345 0.577232 0.581445
+v -0.478635 0.072255 0.026231 0.752941 0.752941 0.752941
+vn -0.746840 0.294659 0.596160
+v -0.489190 0.056260 0.026231 0.752941 0.752941 0.752941
+vn -0.801068 0.027128 0.597959
+v -0.492713 0.034975 0.026231 0.752941 0.752941 0.752941
+vn -0.002429 0.977067 0.212919
+v -0.267501 0.103422 0.015302 0.752941 0.752941 0.752941
+vn -0.010991 0.975337 0.220446
+v -0.321459 0.103288 0.015302 0.752941 0.752941 0.752941
+vn -0.041530 0.974460 0.220687
+v -0.368249 0.102352 0.015302 0.752941 0.752941 0.752941
+vn -0.106497 0.968694 0.224253
+v -0.407862 0.099813 0.015302 0.752941 0.752941 0.752941
+vn -0.226954 0.945250 0.234510
+v -0.440290 0.094867 0.015302 0.752941 0.752941 0.752941
+vn -0.427950 0.867430 0.253818
+v -0.465525 0.086712 0.015302 0.752941 0.752941 0.752941
+vn -0.691131 0.668280 0.275209
+v -0.483559 0.074546 0.015302 0.752941 0.752941 0.752941
+vn -0.896322 0.340505 0.284012
+v -0.494386 0.057567 0.015302 0.752941 0.752941 0.752941
+vn -0.958601 0.029208 0.283252
+v -0.497996 0.034975 0.015302 0.752941 0.752941 0.752941
+vn -0.002486 0.999997 0.000008
+v -0.266832 0.104925 0.000001 0.752941 0.752941 0.752941
+vn -0.011306 0.999936 0.000038
+v -0.321481 0.104789 0.000001 0.752941 0.752941 0.752941
+vn -0.042741 0.999086 0.000140
+v -0.368844 0.103832 0.000001 0.752941 0.752941 0.752941
+vn -0.109810 0.993953 0.000362
+v -0.408919 0.101237 0.000001 0.752941 0.752941 0.752941
+vn -0.234937 0.972010 0.000745
+v -0.441708 0.096181 0.000001 0.752941 0.752941 0.752941
+vn -0.445565 0.895249 0.001244
+v -0.467211 0.087847 0.000001 0.752941 0.752941 0.752941
+vn -0.722683 0.691178 0.001487
+v -0.485427 0.075415 0.000001 0.752941 0.752941 0.752941
+vn -0.936408 0.350913 0.001007
+v -0.496357 0.058064 0.000001 0.752941 0.752941 0.752941
+vn -0.999581 0.028953 0.000275
+v -0.500000 0.034975 0.000001 0.752941 0.752941 0.752941
+vn -0.002394 0.977072 -0.212894
+v -0.267501 0.103422 -0.015302 0.752941 0.752941 0.752941
+vn -0.010865 0.975353 -0.220383
+v -0.321459 0.103288 -0.015302 0.752941 0.752941 0.752941
+vn -0.041187 0.974529 -0.220448
+v -0.368249 0.102352 -0.015302 0.752941 0.752941 0.752941
+vn -0.105746 0.968935 -0.223568
+v -0.407862 0.099813 -0.015302 0.752941 0.752941 0.752941
+vn -0.225770 0.945898 -0.233034
+v -0.440290 0.094867 -0.015302 0.752941 0.752941 0.752941
+vn -0.426865 0.868640 -0.251497
+v -0.465525 0.086712 -0.015302 0.752941 0.752941 0.752941
+vn -0.691410 0.668944 -0.272884
+v -0.483559 0.074546 -0.015302 0.752941 0.752941 0.752941
+vn -0.897328 0.339041 -0.282583
+v -0.494386 0.057567 -0.015302 0.752941 0.752941 0.752941
+vn -0.958748 0.028071 -0.282868
+v -0.497996 0.034975 -0.015302 0.752941 0.752941 0.752941
+vn -0.002087 0.877208 -0.480106
+v -0.269261 0.099460 -0.026231 0.752941 0.752941 0.752941
+vn -0.009340 0.864739 -0.502134
+v -0.321401 0.099335 -0.026231 0.752941 0.752941 0.752941
+vn -0.035321 0.864175 -0.501951
+v -0.366681 0.098453 -0.026231 0.752941 0.752941 0.752941
+vn -0.090187 0.857496 -0.506524
+v -0.405072 0.096059 -0.026231 0.752941 0.752941 0.752941
+vn -0.190700 0.831933 -0.521077
+v -0.436548 0.091399 -0.026231 0.752941 0.752941 0.752941
+vn -0.356161 0.756136 -0.549007
+v -0.461077 0.083717 -0.026231 0.752941 0.752941 0.752941
+vn -0.573484 0.577428 -0.581113
+v -0.478635 0.072255 -0.026231 0.752941 0.752941 0.752941
+vn -0.747884 0.291741 -0.596286
+v -0.489190 0.056260 -0.026231 0.752941 0.752941 0.752941
+vn -0.801124 0.025112 -0.597972
+v -0.492713 0.034975 -0.026231 0.752941 0.752941 0.752941
+vn -0.001415 0.611855 -0.790969
+v -0.271751 0.093859 -0.032788 0.752941 0.752941 0.752941
+vn -0.005842 0.562894 -0.826509
+v -0.321318 0.093743 -0.032788 0.752941 0.752941 0.752941
+vn -0.021404 0.563731 -0.825681
+v -0.364463 0.092938 -0.032788 0.752941 0.752941 0.752941
+vn -0.054092 0.559769 -0.826881
+v -0.401129 0.090753 -0.032788 0.752941 0.752941 0.752941
+vn -0.113525 0.541461 -0.833026
+v -0.431258 0.086498 -0.032788 0.752941 0.752941 0.752941
+vn -0.210829 0.489192 -0.846311
+v -0.454790 0.079484 -0.032788 0.752941 0.752941 0.752941
+vn -0.341148 0.372053 -0.863247
+v -0.471671 0.069018 -0.032788 0.752941 0.752941 0.752941
+vn -0.450559 0.186858 -0.872972
+v -0.481842 0.054412 -0.032788 0.752941 0.752941 0.752941
+vn -0.481080 0.017087 -0.876510
+v -0.485246 0.034975 -0.032788 0.752941 0.752941 0.752941
+vn -0.000201 0.086513 -0.996251
+v -0.274605 0.087437 -0.034975 0.752941 0.752941 0.752941
+vn -0.000112 0.001541 -0.999999
+v -0.321223 0.087335 -0.034975 0.752941 0.752941 0.752941
+vn 0.000789 0.003971 -0.999992
+v -0.361921 0.086617 -0.034975 0.752941 0.752941 0.752941
+vn 0.002199 0.008893 -0.999958
+v -0.396609 0.084671 -0.034975 0.752941 0.752941 0.752941
+vn 0.002865 0.017146 -0.999849
+v -0.425192 0.080880 -0.034975 0.752941 0.752941 0.752941
+vn -0.001019 0.028040 -0.999606
+v -0.447584 0.074629 -0.034975 0.752941 0.752941 0.752941
+vn -0.015301 0.032406 -0.999358
+v -0.463689 0.065306 -0.034975 0.752941 0.752941 0.752941
+vn -0.030121 0.016938 -0.999403
+v -0.473421 0.052292 -0.034975 0.752941 0.752941 0.752941
+vn -0.022016 0.001205 -0.999757
+v -0.476684 0.034975 -0.034975 0.752941 0.752941 0.752941
+vn 0.001027 -0.513314 -0.858200
+v -0.277459 0.081017 -0.032788 0.752941 0.752941 0.752941
+vn 0.005018 -0.561259 -0.827625
+v -0.321129 0.080926 -0.032788 0.752941 0.752941 0.752941
+vn 0.019007 -0.560286 -0.828081
+v -0.359379 0.080298 -0.032788 0.752941 0.752941 0.752941
+vn 0.048384 -0.554673 -0.830660
+v -0.392088 0.078588 -0.032788 0.752941 0.752941 0.752941
+vn 0.101448 -0.534872 -0.838821
+v -0.419128 0.075262 -0.032788 0.752941 0.752941 0.752941
+vn 0.187445 -0.480541 -0.856706
+v -0.440376 0.069776 -0.032788 0.752941 0.752941 0.752941
+vn 0.299433 -0.362501 -0.882572
+v -0.455707 0.061593 -0.032788 0.752941 0.752941 0.752941
+vn 0.397492 -0.186470 -0.898459
+v -0.464998 0.050172 -0.032788 0.752941 0.752941 0.752941
+vn 0.447764 -0.021694 -0.893889
+v -0.468122 0.034975 -0.032788 0.752941 0.752941 0.752941
+vn 0.001608 -0.851969 -0.523589
+v -0.279948 0.075415 -0.026231 0.752941 0.752941 0.752941
+vn 0.007293 -0.864344 -0.502847
+v -0.321046 0.075336 -0.026231 0.752941 0.752941 0.752941
+vn 0.026833 -0.864189 -0.502451
+v -0.357163 0.074783 -0.026231 0.752941 0.752941 0.752941
+vn 0.068032 -0.861008 -0.504021
+v -0.388144 0.073283 -0.026231 0.752941 0.752941 0.752941
+vn 0.144929 -0.846467 -0.512338
+v -0.413838 0.070359 -0.026231 0.752941 0.752941 0.752941
+vn 0.280173 -0.796471 -0.535851
+v -0.434089 0.065542 -0.026231 0.752941 0.752941 0.752941
+vn 0.487847 -0.652120 -0.580297
+v -0.448744 0.058355 -0.026231 0.752941 0.752941 0.752941
+vn 0.698415 -0.359160 -0.619048
+v -0.457650 0.048323 -0.026231 0.752941 0.752941 0.752941
+vn 0.786156 -0.045718 -0.616335
+v -0.460654 0.034975 -0.026231 0.752941 0.752941 0.752941
+vn 0.001759 -0.973633 -0.228114
+v -0.281710 0.071453 -0.015302 0.752941 0.752941 0.752941
+vn 0.007859 -0.975318 -0.220666
+v -0.320988 0.071381 -0.015302 0.752941 0.752941 0.752941
+vn 0.028760 -0.975009 -0.220296
+v -0.355594 0.070884 -0.015302 0.752941 0.752941 0.752941
+vn 0.072638 -0.972596 -0.220862
+v -0.385356 0.069529 -0.015302 0.752941 0.752941 0.752941
+vn 0.155071 -0.961994 -0.224770
+v -0.410096 0.066894 -0.015302 0.752941 0.752941 0.752941
+vn 0.304570 -0.922459 -0.237292
+v -0.429641 0.062547 -0.015302 0.752941 0.752941 0.752941
+vn 0.554043 -0.789446 -0.264219
+v -0.443819 0.056064 -0.015302 0.752941 0.752941 0.752941
+vn 0.838092 -0.460424 -0.292594
+v -0.452453 0.047015 -0.015302 0.752941 0.752941 0.752941
+vn 0.954131 -0.064100 -0.292448
+v -0.455371 0.034975 -0.015302 0.752941 0.752941 0.752941
+vn 0.941301 0.174446 0.288999
+v -0.453837 0.019870 0.015302 0.752941 0.752941 0.752941
+vn 0.983533 0.180728 -0.000253
+v -0.451879 0.020357 0.000001 0.752941 0.752941 0.752941
+vn 0.905049 0.314873 0.285904
+v -0.449115 0.002437 0.015302 0.752941 0.752941 0.752941
+vn 0.945885 0.324500 -0.000984
+v -0.447294 0.003279 0.000001 0.752941 0.752941 0.752941
+vn 0.857246 0.434731 0.275933
+v -0.441030 -0.016535 0.015302 0.752941 0.752941 0.752941
+vn 0.894841 0.446381 -0.001729
+v -0.439431 -0.015439 0.000001 0.752941 0.752941 0.752941
+vn 0.797743 0.544465 0.259160
+v -0.429401 -0.036259 0.015302 0.752941 0.752941 0.752941
+vn 0.830309 0.557299 -0.002240
+v -0.428107 -0.034975 0.000001 0.752941 0.752941 0.752941
+vn 0.724026 0.647135 0.238753
+v -0.414051 -0.055948 0.015302 0.752941 0.752941 0.752941
+vn 0.750493 0.660874 -0.002372
+v -0.413140 -0.054512 0.000001 0.752941 0.752941 0.752941
+vn 0.633740 0.741343 0.220870
+v -0.394801 -0.074815 0.015302 0.752941 0.752941 0.752941
+vn 0.653907 0.756572 -0.002065
+v -0.394346 -0.073229 0.000001 0.752941 0.752941 0.752941
+vn 0.526453 0.822808 0.214088
+v -0.371472 -0.092071 0.015302 0.752941 0.752941 0.752941
+vn 0.540667 0.841236 -0.001282
+v -0.371546 -0.090307 0.000001 0.752941 0.752941 0.752941
+vn 0.462203 0.856621 0.229280
+v -0.343888 -0.106929 0.015302 0.752941 0.752941 0.752941
+vn 0.777418 0.146355 0.611721
+v -0.458997 0.018586 0.026231 0.752941 0.752941 0.752941
+vn 0.747316 0.267822 0.608104
+v -0.453917 0.000219 0.026231 0.752941 0.752941 0.752941
+vn 0.711375 0.374595 0.594663
+v -0.445246 -0.019424 0.026231 0.752941 0.752941 0.752941
+vn 0.669482 0.475794 0.570451
+v -0.432813 -0.039643 0.026231 0.752941 0.752941 0.752941
+vn 0.617231 0.573400 0.538738
+v -0.416453 -0.059733 0.026231 0.752941 0.752941 0.752941
+vn 0.549083 0.663192 0.508610
+v -0.395997 -0.078993 0.026231 0.752941 0.752941 0.752941
+vn 0.461592 0.735969 0.495260
+v -0.371279 -0.096719 0.026231 0.752941 0.752941 0.752941
+vn 0.397899 0.745633 0.534517
+v -0.342126 -0.112212 0.026231 0.752941 0.752941 0.752941
+vn 0.446521 0.085788 0.890651
+v -0.466293 0.016773 0.032790 0.752941 0.752941 0.752941
+vn 0.429240 0.159420 0.889010
+v -0.460706 -0.002917 0.032790 0.752941 0.752941 0.752941
+vn 0.411447 0.226793 0.882766
+v -0.451204 -0.023511 0.032790 0.752941 0.752941 0.752941
+vn 0.393701 0.294269 0.870865
+v -0.437637 -0.044428 0.032790 0.752941 0.752941 0.752941
+vn 0.371928 0.363620 0.854078
+v -0.419849 -0.065084 0.032790 0.752941 0.752941 0.752941
+vn 0.339248 0.429816 0.836761
+v -0.397689 -0.084900 0.032790 0.752941 0.752941 0.752941
+vn 0.289225 0.479768 0.828354
+v -0.371004 -0.103293 0.032790 0.752941 0.752941 0.752941
+vn 0.220105 0.418527 0.881130
+v -0.339638 -0.119680 0.032790 0.752941 0.752941 0.752941
+vn -0.014437 -0.002313 0.999893
+v -0.474657 0.014693 0.034975 0.752941 0.752941 0.752941
+vn -0.012865 -0.005157 0.999904
+v -0.468486 -0.006512 0.034975 0.752941 0.752941 0.752941
+vn -0.011377 -0.007807 0.999905
+v -0.458035 -0.028195 0.034975 0.752941 0.752941 0.752941
+vn -0.010057 -0.009695 0.999902
+v -0.443166 -0.049912 0.034975 0.752941 0.752941 0.752941
+vn -0.009504 -0.010466 0.999900
+v -0.423742 -0.071220 0.034975 0.752941 0.752941 0.752941
+vn -0.010457 -0.010410 0.999891
+v -0.399629 -0.091673 0.034975 0.752941 0.752941 0.752941
+vn -0.012718 -0.010824 0.999861
+v -0.370689 -0.110829 0.034975 0.752941 0.752941 0.752941
+vn -0.075856 -0.148775 0.985957
+v -0.336783 -0.128242 0.034975 0.752941 0.752941 0.752941
+vn -0.466968 -0.091867 0.879489
+v -0.483020 0.012613 0.032790 0.752941 0.752941 0.752941
+vn -0.443651 -0.176396 0.878669
+v -0.476267 -0.010107 0.032790 0.752941 0.752941 0.752941
+vn -0.416916 -0.253595 0.872852
+v -0.464865 -0.032879 0.032790 0.752941 0.752941 0.752941
+vn -0.389697 -0.325781 0.861396
+v -0.448695 -0.055397 0.032790 0.752941 0.752941 0.752941
+vn -0.360831 -0.393248 0.845670
+v -0.427636 -0.077355 0.032790 0.752941 0.752941 0.752941
+vn -0.326762 -0.451924 0.830055
+v -0.401569 -0.098445 0.032790 0.752941 0.752941 0.752941
+vn -0.284183 -0.492992 0.822313
+v -0.370374 -0.118363 0.032790 0.752941 0.752941 0.752941
+vn -0.299629 -0.591167 0.748829
+v -0.333929 -0.136804 0.032790 0.752941 0.752941 0.752941
+vn -0.783732 -0.156239 0.601127
+v -0.490317 0.010798 0.026231 0.752941 0.752941 0.752941
+vn -0.741604 -0.301246 0.599395
+v -0.483056 -0.013244 0.026231 0.752941 0.752941 0.752941
+vn -0.685523 -0.429134 0.588135
+v -0.470824 -0.036966 0.026231 0.752941 0.752941 0.752941
+vn -0.623175 -0.538886 0.566793
+v -0.453519 -0.060182 0.026231 0.752941 0.752941 0.752941
+vn -0.557857 -0.630660 0.539503
+v -0.431032 -0.082706 0.026231 0.752941 0.752941 0.752941
+vn -0.490488 -0.703443 0.514382
+v -0.403261 -0.104353 0.026231 0.752941 0.752941 0.752941
+vn -0.421675 -0.754837 0.502406
+v -0.370099 -0.124937 0.026231 0.752941 0.752941 0.752941
+vn -0.399963 -0.797417 0.451836
+v -0.331441 -0.144272 0.026231 0.752941 0.752941 0.752941
+vn -0.939916 -0.188502 0.284649
+v -0.495478 0.009516 0.015302 0.752941 0.752941 0.752941
+vn -0.886810 -0.364874 0.283611
+v -0.487857 -0.015462 0.015302 0.752941 0.752941 0.752941
+vn -0.810336 -0.516855 0.276073
+v -0.475040 -0.039857 0.015302 0.752941 0.752941 0.752941
+vn -0.722854 -0.639403 0.262004
+v -0.456931 -0.063566 0.015302 0.752941 0.752941 0.752941
+vn -0.633794 -0.733733 0.244829
+v -0.433435 -0.086491 0.015302 0.752941 0.752941 0.752941
+vn -0.548752 -0.803841 0.229590
+v -0.404458 -0.108532 0.015302 0.752941 0.752941 0.752941
+vn -0.470290 -0.854079 0.222209
+v -0.369904 -0.129587 0.015302 0.752941 0.752941 0.752941
+vn -0.436236 -0.876612 0.203100
+v -0.329679 -0.149554 0.015302 0.752941 0.752941 0.752941
+vn -0.980449 -0.196775 0.000148
+v -0.497434 0.009028 0.000001 0.752941 0.752941 0.752941
+vn -0.924324 -0.381607 0.000553
+v -0.489678 -0.016303 0.000001 0.752941 0.752941 0.752941
+vn -0.841606 -0.540092 0.001028
+v -0.476638 -0.040953 0.000001 0.752941 0.752941 0.752941
+vn -0.746387 -0.665510 0.001320
+v -0.458225 -0.064849 0.000001 0.752941 0.752941 0.752941
+vn -0.650466 -0.759534 0.001348
+v -0.434346 -0.087928 0.000001 0.752941 0.752941 0.752941
+vn -0.560844 -0.827921 0.001092
+v -0.404911 -0.110117 0.000001 0.752941 0.752941 0.752941
+vn -0.480442 -0.877026 0.000590
+v -0.369830 -0.131350 0.000001 0.752941 0.752941 0.752941
+vn -0.444048 -0.896003 0.000297
+v -0.329012 -0.151558 0.000001 0.752941 0.752941 0.752941
+vn -0.940105 -0.187886 -0.284432
+v -0.495478 0.009516 -0.015302 0.752941 0.752941 0.752941
+vn -0.887461 -0.363932 -0.282782
+v -0.487857 -0.015462 -0.015302 0.752941 0.752941 0.752941
+vn -0.811245 -0.516244 -0.274542
+v -0.475040 -0.039857 -0.015302 0.752941 0.752941 0.752941
+vn -0.723585 -0.639404 -0.259976
+v -0.456931 -0.063566 -0.015302 0.752941 0.752941 0.752941
+vn -0.634094 -0.734167 -0.242743
+v -0.433435 -0.086491 -0.015302 0.752941 0.752941 0.752941
+vn -0.548491 -0.804492 -0.227924
+v -0.404458 -0.108532 -0.015302 0.752941 0.752941 0.752941
+vn -0.469435 -0.854755 -0.221413
+v -0.369904 -0.129587 -0.015302 0.752941 0.752941 0.752941
+vn -0.434935 -0.877292 -0.202955
+v -0.329679 -0.149554 -0.015302 0.752941 0.752941 0.752941
+vn -0.783939 -0.155167 -0.601134
+v -0.490317 0.010798 -0.026231 0.752941 0.752941 0.752941
+vn -0.742360 -0.299611 -0.599279
+v -0.483056 -0.013244 -0.026231 0.752941 0.752941 0.752941
+vn -0.686520 -0.427850 -0.587908
+v -0.470824 -0.036966 -0.026231 0.752941 0.752941 0.752941
+vn -0.623903 -0.538445 -0.566412
+v -0.453519 -0.060182 -0.026231 0.752941 0.752941 0.752941
+vn -0.557940 -0.631004 -0.539015
+v -0.431032 -0.082706 -0.026231 0.752941 0.752941 0.752941
+vn -0.489729 -0.704218 -0.514045
+v -0.403261 -0.104353 -0.026231 0.752941 0.752941 0.752941
+vn -0.419908 -0.755652 -0.502660
+v -0.370099 -0.124937 -0.026231 0.752941 0.752941 0.752941
+vn -0.397366 -0.798094 -0.452930
+v -0.331441 -0.144272 -0.026231 0.752941 0.752941 0.752941
+vn -0.467031 -0.090921 -0.879554
+v -0.483020 0.012613 -0.032788 0.752941 0.752941 0.752941
+vn -0.443553 -0.174758 -0.879045
+v -0.476267 -0.010107 -0.032788 0.752941 0.752941 0.752941
+vn -0.416405 -0.251814 -0.873611
+v -0.464865 -0.032879 -0.032788 0.752941 0.752941 0.752941
+vn -0.388682 -0.324238 -0.862436
+v -0.448695 -0.055397 -0.032788 0.752941 0.752941 0.752941
+vn -0.359183 -0.392268 -0.846825
+v -0.427636 -0.077355 -0.032788 0.752941 0.752941 0.752941
+vn -0.324403 -0.451492 -0.831214
+v -0.401569 -0.098445 -0.032788 0.752941 0.752941 0.752941
+vn -0.281186 -0.492773 -0.823474
+v -0.370374 -0.118363 -0.032788 0.752941 0.752941 0.752941
+vn -0.296157 -0.590555 -0.750690
+v -0.333929 -0.136804 -0.032788 0.752941 0.752941 0.752941
+vn -0.014033 -0.002211 -0.999899
+v -0.474657 0.014693 -0.034975 0.752941 0.752941 0.752941
+vn -0.011310 -0.004575 -0.999926
+v -0.468486 -0.006512 -0.034975 0.752941 0.752941 0.752941
+vn -0.008595 -0.006394 -0.999943
+v -0.458035 -0.028195 -0.034975 0.752941 0.752941 0.752941
+vn -0.006429 -0.007379 -0.999952
+v -0.443166 -0.049912 -0.034975 0.752941 0.752941 0.752941
+vn -0.005432 -0.007611 -0.999956
+v -0.423742 -0.071220 -0.034975 0.752941 0.752941 0.752941
+vn -0.006405 -0.007564 -0.999951
+v -0.399629 -0.091673 -0.034975 0.752941 0.752941 0.752941
+vn -0.009802 -0.008704 -0.999914
+v -0.370689 -0.110829 -0.034975 0.752941 0.752941 0.752941
+vn -0.074115 -0.147358 -0.986302
+v -0.336783 -0.128242 -0.034975 0.752941 0.752941 0.752941
+vn 0.447128 0.084726 -0.890448
+v -0.466293 0.016773 -0.032788 0.752941 0.752941 0.752941
+vn 0.431107 0.158236 -0.888317
+v -0.460706 -0.002917 -0.032788 0.752941 0.752941 0.752941
+vn 0.414200 0.226499 -0.881553
+v -0.451204 -0.023511 -0.032788 0.752941 0.752941 0.752941
+vn 0.396581 0.295198 -0.869242
+v -0.437637 -0.044428 -0.032788 0.752941 0.752941 0.752941
+vn 0.373961 0.365637 -0.852328
+v -0.419849 -0.065084 -0.032788 0.752941 0.752941 0.752941
+vn 0.339461 0.432154 -0.835469
+v -0.397689 -0.084900 -0.032788 0.752941 0.752941 0.752941
+vn 0.287126 0.481182 -0.828265
+v -0.371004 -0.103293 -0.032788 0.752941 0.752941 0.752941
+vn 0.216962 0.418549 -0.881898
+v -0.339638 -0.119680 -0.032788 0.752941 0.752941 0.752941
+vn 0.777733 0.144685 -0.611717
+v -0.458997 0.018586 -0.026231 0.752941 0.752941 0.752941
+vn 0.748155 0.265550 -0.608069
+v -0.453917 0.000219 -0.026231 0.752941 0.752941 0.752941
+vn 0.712240 0.372877 -0.594708
+v -0.445246 -0.019424 -0.026231 0.752941 0.752941 0.752941
+vn 0.669825 0.475030 -0.570684
+v -0.432813 -0.039643 -0.026231 0.752941 0.752941 0.752941
+vn 0.616359 0.573786 -0.539325
+v -0.416453 -0.059733 -0.026231 0.752941 0.752941 0.752941
+vn 0.546452 0.664454 -0.509795
+v -0.395997 -0.078993 -0.026231 0.752941 0.752941 0.752941
+vn 0.457295 0.737321 -0.497232
+v -0.371279 -0.096719 -0.026231 0.752941 0.752941 0.752941
+vn 0.393148 0.746243 -0.537175
+v -0.342126 -0.112212 -0.026231 0.752941 0.752941 0.752941
+vn 0.941422 0.173259 -0.289318
+v -0.453837 0.019870 -0.015302 0.752941 0.752941 0.752941
+vn 0.905216 0.313220 -0.287188
+v -0.449115 0.002437 -0.015302 0.752941 0.752941 0.752941
+vn 0.857201 0.433311 -0.278293
+v -0.441030 -0.016535 -0.015302 0.752941 0.752941 0.752941
+vn 0.797302 0.543602 -0.262308
+v -0.429401 -0.036259 -0.015302 0.752941 0.752941 0.752941
+vn 0.722960 0.647032 -0.242237
+v -0.414051 -0.055948 -0.015302 0.752941 0.752941 0.752941
+vn 0.631852 0.741982 -0.224113
+v -0.394801 -0.074815 -0.015302 0.752941 0.752941 0.752941
+vn 0.523734 0.823913 -0.216496
+v -0.371472 -0.092071 -0.015302 0.752941 0.752941 0.752941
+vn 0.459255 0.857681 -0.231231
+v -0.343888 -0.106929 -0.015302 0.752941 0.752941 0.752941
+vn -0.105858 0.994378 -0.002395
+v 0.230589 -0.023316 0.000001 0.752941 0.752941 0.752941
+vn -0.107866 0.932383 0.345002
+v 0.230589 -0.028826 0.033663 0.752941 0.752941 0.752941
+vn -0.230343 0.914993 0.331254
+v 0.275879 -0.023579 0.032765 0.752941 0.752941 0.752941
+vn -0.247838 0.968800 -0.001808
+v 0.274886 -0.018717 0.000001 0.752941 0.752941 0.752941
+vn -0.503982 0.804477 0.314353
+v 0.306721 -0.010279 0.030397 0.752941 0.752941 0.752941
+vn -0.545914 0.837841 -0.000450
+v 0.305155 -0.006194 0.000001 0.752941 0.752941 0.752941
+vn -0.740584 0.606440 0.289421
+v 0.326713 0.009103 0.027047 0.752941 0.752941 0.752941
+vn -0.791333 0.611384 0.001042
+v 0.324859 0.012341 0.000001 0.752941 0.752941 0.752941
+vn -0.860377 0.428140 0.276493
+v 0.339462 0.032595 0.023208 0.752941 0.752941 0.752941
+vn -0.910267 0.414014 0.002576
+v 0.337458 0.034975 0.000001 0.752941 0.752941 0.752941
+vn -0.885294 0.359601 0.294857
+v 0.348567 0.058227 0.019368 0.752941 0.752941 0.752941
+vn -0.940713 0.339175 0.004359
+v 0.346415 0.059794 0.000001 0.752941 0.752941 0.752941
+vn -0.846113 0.411649 0.338582
+v 0.357631 0.084026 0.016019 0.752941 0.752941 0.752941
+vn -0.916171 0.400739 0.006261
+v 0.355189 0.084888 0.000001 0.752941 0.752941 0.752941
+vn -0.736595 0.559839 0.379484
+v 0.370255 0.108023 0.013650 0.752941 0.752941 0.752941
+vn -0.816739 0.576961 0.007350
+v 0.367242 0.108340 0.000001 0.752941 0.752941 0.752941
+vn -0.578957 0.711638 0.397970
+v 0.390043 0.128242 0.012751 0.752941 0.752941 0.752941
+vn -0.651870 0.758306 0.006172
+v 0.386034 0.128242 0.000001 0.752941 0.752941 0.752941
+vn -0.089287 0.720620 0.687557
+v 0.230591 -0.043355 0.057708 0.752941 0.752941 0.752941
+vn -0.166948 0.723999 0.669293
+v 0.278500 -0.036400 0.056169 0.752941 0.752941 0.752941
+vn -0.357757 0.669351 0.651137
+v 0.310848 -0.021051 0.052108 0.752941 0.752941 0.752941
+vn -0.551235 0.554462 0.623468
+v 0.331604 0.000565 0.046366 0.752941 0.752941 0.752941
+vn -0.668786 0.433290 0.604140
+v 0.344745 0.026322 0.039784 0.752941 0.752941 0.752941
+vn -0.688888 0.377295 0.618936
+v 0.354242 0.054096 0.033203 0.752941 0.752941 0.752941
+vn -0.634413 0.403493 0.659328
+v 0.364069 0.081757 0.027461 0.752941 0.752941 0.752941
+vn -0.526812 0.495306 0.690754
+v 0.378200 0.107180 0.023400 0.752941 0.752941 0.752941
+vn -0.402685 0.590132 0.699707
+v 0.400608 0.128242 0.021859 0.752941 0.752941 0.752941
+vn -0.037139 0.376130 0.925822
+v 0.230591 -0.063893 0.072136 0.752941 0.752941 0.752941
+vn -0.052438 0.396830 0.916393
+v 0.282206 -0.054523 0.070211 0.752941 0.752941 0.752941
+vn -0.104981 0.402138 0.909540
+v 0.316683 -0.036279 0.065135 0.752941 0.752941 0.752941
+vn -0.190073 0.390647 0.900704
+v 0.338519 -0.011506 0.057958 0.752941 0.752941 0.752941
+vn -0.280288 0.357291 0.890944
+v 0.352213 0.017453 0.049731 0.752941 0.752941 0.752941
+vn -0.324961 0.328635 0.886792
+v 0.362264 0.048253 0.041503 0.752941 0.752941 0.752941
+vn -0.313569 0.330594 0.890158
+v 0.373171 0.078548 0.034326 0.752941 0.752941 0.752941
+vn -0.268338 0.363123 0.892265
+v 0.389432 0.105992 0.029250 0.752941 0.752941 0.752941
+vn -0.207224 0.401387 0.892158
+v 0.415545 0.128242 0.027324 0.752941 0.752941 0.752941
+vn 0.043363 -0.027473 0.998682
+v 0.230589 -0.087437 0.076945 0.752941 0.752941 0.752941
+vn 0.092369 -0.001966 0.995723
+v 0.286454 -0.075302 0.074892 0.752941 0.752941 0.752941
+vn 0.187025 0.049960 0.981084
+v 0.323371 -0.053738 0.069477 0.752941 0.752941 0.752941
+vn 0.235428 0.123414 0.964024
+v 0.346445 -0.025343 0.061822 0.752941 0.752941 0.752941
+vn 0.205938 0.175205 0.962753
+v 0.360776 0.007286 0.053045 0.752941 0.752941 0.752941
+vn 0.126350 0.189097 0.973796
+v 0.371461 0.041556 0.044270 0.752941 0.752941 0.752941
+vn 0.047305 0.179222 0.982671
+v 0.383606 0.074868 0.036615 0.752941 0.752941 0.752941
+vn -0.000195 0.150957 0.988540
+v 0.402309 0.104630 0.031200 0.752941 0.752941 0.752941
+vn -0.004634 0.126390 0.991970
+v 0.432669 0.128242 0.029146 0.752941 0.752941 0.752941
+vn 0.135604 -0.418123 0.898212
+v 0.230589 -0.110982 0.072136 0.752941 0.752941 0.752941
+vn 0.235432 -0.388802 0.890732
+v 0.290701 -0.096079 0.070211 0.752941 0.752941 0.752941
+vn 0.436132 -0.289557 0.852024
+v 0.330060 -0.071196 0.065135 0.752941 0.752941 0.752941
+vn 0.571887 -0.145508 0.807324
+v 0.354371 -0.039181 0.057958 0.752941 0.752941 0.752941
+vn 0.597359 -0.035115 0.801205
+v 0.369337 -0.002880 0.049731 0.752941 0.752941 0.752941
+vn 0.525226 0.001465 0.850961
+v 0.380658 0.034859 0.041503 0.752941 0.752941 0.752941
+vn 0.397471 -0.034308 0.916973
+v 0.394040 0.071190 0.034326 0.752941 0.752941 0.752941
+vn 0.276020 -0.144276 0.950262
+v 0.415184 0.103266 0.029250 0.752941 0.752941 0.752941
+vn 0.208718 -0.250053 0.945468
+v 0.449791 0.128242 0.027324 0.752941 0.752941 0.752941
+vn 0.216490 -0.728577 0.649852
+v 0.230589 -0.131521 0.057708 0.752941 0.752941 0.752941
+vn 0.347023 -0.688479 0.636845
+v 0.294406 -0.114202 0.056169 0.752941 0.752941 0.752941
+vn 0.601960 -0.539367 0.588836
+v 0.335894 -0.086424 0.052108 0.752941 0.752941 0.752941
+vn 0.772183 -0.338310 0.537847
+v 0.361285 -0.051251 0.046366 0.752941 0.752941 0.752941
+vn 0.825649 -0.196087 0.529012
+v 0.376805 -0.011750 0.039784 0.752941 0.752941 0.752941
+vn 0.791082 -0.167706 0.588272
+v 0.388682 0.029017 0.033203 0.752941 0.752941 0.752941
+vn 0.682436 -0.258342 0.683770
+v 0.403144 0.067981 0.027461 0.752941 0.752941 0.752941
+vn 0.517966 -0.460631 0.720785
+v 0.426416 0.102077 0.023400 0.752941 0.752941 0.752941
+vn 0.380736 -0.623306 0.683030
+v 0.464729 0.128242 0.021859 0.752941 0.752941 0.752941
+vn 0.265590 -0.908118 0.323704
+v 0.230589 -0.146048 0.033663 0.752941 0.752941 0.752941
+vn 0.410446 -0.856367 0.313319
+v 0.297026 -0.127023 0.032765 0.752941 0.752941 0.752941
+vn 0.683924 -0.672562 0.282679
+v 0.340023 -0.097196 0.030397 0.752941 0.752941 0.752941
+vn 0.861952 -0.439719 0.252361
+v 0.366176 -0.059790 0.027047 0.752941 0.752941 0.752941
+vn 0.925880 -0.285983 0.246902
+v 0.382087 -0.018022 0.023208 0.752941 0.752941 0.752941
+vn 0.919749 -0.273971 0.281074
+v 0.394357 0.024884 0.019368 0.752941 0.752941 0.752941
+vn 0.843741 -0.414433 0.341097
+v 0.409582 0.065711 0.016019 0.752941 0.752941 0.752941
+vn 0.651729 -0.669330 0.356717
+v 0.434361 0.101237 0.013650 0.752941 0.752941 0.752941
+vn 0.455022 -0.831682 0.318214
+v 0.475294 0.128242 0.012751 0.752941 0.752941 0.752941
+vn 0.279072 -0.960270 0.000826
+v 0.230589 -0.151558 0.000001 0.752941 0.752941 0.752941
+vn 0.429482 -0.903075 0.000409
+v 0.298020 -0.131885 0.000001 0.752941 0.752941 0.752941
+vn 0.705637 -0.708574 -0.000503
+v 0.341587 -0.101283 0.000001 0.752941 0.752941 0.752941
+vn 0.883873 -0.467724 -0.001286
+v 0.368031 -0.063028 0.000001 0.752941 0.752941 0.752941
+vn 0.949876 -0.312620 -0.002030
+v 0.384091 -0.020402 0.000001 0.752941 0.752941 0.752941
+vn 0.951608 -0.307300 -0.002964
+v 0.396509 0.023316 0.000001 0.752941 0.752941 0.752941
+vn 0.886021 -0.463629 -0.003863
+v 0.412023 0.064850 0.000001 0.752941 0.752941 0.752941
+vn 0.685302 -0.728251 -0.003426
+v 0.437374 0.100917 0.000001 0.752941 0.752941 0.752941
+vn 0.468684 -0.883364 -0.002072
+v 0.479302 0.128242 0.000001 0.752941 0.752941 0.752941
+vn 0.262218 -0.909348 -0.322998
+v 0.230589 -0.146048 -0.033663 0.752941 0.752941 0.752941
+vn 0.412516 -0.855609 -0.312671
+v 0.297026 -0.127023 -0.032765 0.752941 0.752941 0.752941
+vn 0.684912 -0.671259 -0.283385
+v 0.340023 -0.097196 -0.030395 0.752941 0.752941 0.752941
+vn 0.861882 -0.438637 -0.254475
+v 0.366176 -0.059790 -0.027047 0.752941 0.752941 0.752941
+vn 0.925317 -0.284871 -0.250274
+v 0.382087 -0.018022 -0.023207 0.752941 0.752941 0.752941
+vn 0.918797 -0.272271 -0.285800
+v 0.394357 0.024884 -0.019368 0.752941 0.752941 0.752941
+vn 0.842484 -0.412115 -0.346960
+v 0.409582 0.065711 -0.016018 0.752941 0.752941 0.752941
+vn 0.650325 -0.667811 -0.362086
+v 0.434361 0.101237 -0.013650 0.752941 0.752941 0.752941
+vn 0.453376 -0.830711 -0.323063
+v 0.475294 0.128242 -0.012751 0.752941 0.752941 0.752941
+vn 0.211229 -0.729276 -0.650798
+v 0.230591 -0.131521 -0.057708 0.752941 0.752941 0.752941
+vn 0.350406 -0.687038 -0.636548
+v 0.294406 -0.114202 -0.056168 0.752941 0.752941 0.752941
+vn 0.603815 -0.537283 -0.588842
+v 0.335894 -0.086424 -0.052106 0.752941 0.752941 0.752941
+vn 0.772151 -0.336674 -0.538919
+v 0.361285 -0.051251 -0.046366 0.752941 0.752941 0.752941
+vn 0.824714 -0.194778 -0.530950
+v 0.376805 -0.011750 -0.039784 0.752941 0.752941 0.752941
+vn 0.789858 -0.166292 -0.590315
+v 0.388682 0.029017 -0.033203 0.752941 0.752941 0.752941
+vn 0.681307 -0.256973 -0.685409
+v 0.403144 0.067981 -0.027461 0.752941 0.752941 0.752941
+vn 0.516687 -0.460260 -0.721939
+v 0.426416 0.102077 -0.023400 0.752941 0.752941 0.752941
+vn 0.376379 -0.624673 -0.684194
+v 0.464729 0.128242 -0.021859 0.752941 0.752941 0.752941
+vn 0.131649 -0.416799 -0.899415
+v 0.230591 -0.110982 -0.072136 0.752941 0.752941 0.752941
+vn 0.238682 -0.386772 -0.890752
+v 0.290701 -0.096079 -0.070211 0.752941 0.752941 0.752941
+vn 0.438768 -0.287615 -0.851329
+v 0.330060 -0.071196 -0.065133 0.752941 0.752941 0.752941
+vn 0.573024 -0.143869 -0.806812
+v 0.354371 -0.039181 -0.057957 0.752941 0.752941 0.752941
+vn 0.597707 -0.034242 -0.800983
+v 0.369337 -0.002880 -0.049730 0.752941 0.752941 0.752941
+vn 0.526142 0.000913 -0.850396
+v 0.380658 0.034859 -0.041503 0.752941 0.752941 0.752941
+vn 0.399307 -0.037500 -0.916050
+v 0.394040 0.071190 -0.034326 0.752941 0.752941 0.752941
+vn 0.278029 -0.151239 -0.948592
+v 0.415184 0.103266 -0.029250 0.752941 0.752941 0.752941
+vn 0.207938 -0.260677 -0.942767
+v 0.449791 0.128242 -0.027324 0.752941 0.752941 0.752941
+vn 0.044641 -0.024953 -0.998691
+v 0.230589 -0.087437 -0.076945 0.752941 0.752941 0.752941
+vn 0.094117 0.000110 -0.995561
+v 0.286454 -0.075302 -0.074890 0.752941 0.752941 0.752941
+vn 0.189884 0.050820 -0.980490
+v 0.323371 -0.053738 -0.069476 0.752941 0.752941 0.752941
+vn 0.239537 0.124044 -0.962931
+v 0.346445 -0.025343 -0.061820 0.752941 0.752941 0.752941
+vn 0.210994 0.175335 -0.961634
+v 0.360776 0.007286 -0.053045 0.752941 0.752941 0.752941
+vn 0.132097 0.187149 -0.973409
+v 0.371461 0.041556 -0.044270 0.752941 0.752941 0.752941
+vn 0.052965 0.172701 -0.983549
+v 0.383606 0.074868 -0.036614 0.752941 0.752941 0.752941
+vn 0.004781 0.136903 -0.990573
+v 0.402309 0.104630 -0.031199 0.752941 0.752941 0.752941
+vn -0.000878 0.114113 -0.993467
+v 0.432669 0.128242 -0.029146 0.752941 0.752941 0.752941
+vn -0.028806 0.378178 -0.925285
+v 0.230589 -0.063893 -0.072136 0.752941 0.752941 0.752941
+vn -0.052775 0.397749 -0.915975
+v 0.282206 -0.054525 -0.070211 0.752941 0.752941 0.752941
+vn -0.103746 0.401549 -0.909942
+v 0.316683 -0.036279 -0.065133 0.752941 0.752941 0.752941
+vn -0.186259 0.389669 -0.901923
+v 0.338519 -0.011506 -0.057957 0.752941 0.752941 0.752941
+vn -0.274325 0.356375 -0.893165
+v 0.352213 0.017453 -0.049730 0.752941 0.752941 0.752941
+vn -0.317843 0.326850 -0.890025
+v 0.362264 0.048253 -0.041503 0.752941 0.752941 0.752941
+vn -0.306701 0.325234 -0.894515
+v 0.373171 0.078548 -0.034326 0.752941 0.752941 0.752941
+vn -0.263659 0.350735 -0.898593
+v 0.389432 0.105992 -0.029250 0.752941 0.752941 0.752941
+vn -0.202852 0.399017 -0.894224
+v 0.415545 0.128242 -0.027324 0.752941 0.752941 0.752941
+vn -0.076791 0.721282 -0.688371
+v 0.230589 -0.043355 -0.057708 0.752941 0.752941 0.752941
+vn -0.168899 0.723098 -0.669778
+v 0.278500 -0.036400 -0.056168 0.752941 0.752941 0.752941
+vn -0.359235 0.667719 -0.651998
+v 0.310848 -0.021051 -0.052106 0.752941 0.752941 0.752941
+vn -0.552746 0.552063 -0.624258
+v 0.331604 0.000565 -0.046366 0.752941 0.752941 0.752941
+vn -0.670081 0.429966 -0.605079
+v 0.344745 0.026322 -0.039784 0.752941 0.752941 0.752941
+vn -0.688747 0.374040 -0.621065
+v 0.354242 0.054096 -0.033203 0.752941 0.752941 0.752941
+vn -0.632137 0.400964 -0.663047
+v 0.364069 0.081757 -0.027461 0.752941 0.752941 0.752941
+vn -0.524615 0.492529 -0.694402
+v 0.378200 0.107180 -0.023400 0.752941 0.752941 0.752941
+vn -0.398098 0.598782 -0.694966
+v 0.400608 0.128242 -0.021859 0.752941 0.752941 0.752941
+vn -0.098577 0.932136 -0.348432
+v 0.230589 -0.028826 -0.033663 0.752941 0.752941 0.752941
+vn -0.232183 0.913590 -0.333832
+v 0.275879 -0.023579 -0.032765 0.752941 0.752941 0.752941
+vn -0.505829 0.802998 -0.315168
+v 0.306721 -0.010279 -0.030395 0.752941 0.752941 0.752941
+vn -0.743028 0.604167 -0.287908
+v 0.326713 0.009103 -0.027047 0.752941 0.752941 0.752941
+vn -0.863374 0.424452 -0.272813
+v 0.339462 0.032595 -0.023207 0.752941 0.752941 0.752941
+vn -0.888747 0.355227 -0.289728
+v 0.348567 0.058227 -0.019368 0.752941 0.752941 0.752941
+vn -0.849287 0.409703 -0.332950
+v 0.357631 0.084026 -0.016018 0.752941 0.752941 0.752941
+vn -0.737194 0.563696 -0.372548
+v 0.370255 0.108023 -0.013650 0.752941 0.752941 0.752941
+vn -0.573236 0.722636 -0.386261
+v 0.390043 0.128242 -0.012751 0.752941 0.752941 0.752941
+vn -0.457991 0.819616 0.344200
+v 0.396034 0.132114 0.012533 0.752941 0.752941 0.752941
+vn -0.509869 0.860247 0.003052
+v 0.391803 0.132068 0.000001 0.752941 0.752941 0.752941
+vn -0.360140 0.889603 0.280901
+v 0.401499 0.134887 0.011955 0.752941 0.752941 0.752941
+vn -0.402759 0.915304 0.002045
+v 0.397207 0.134800 0.000001 0.752941 0.752941 0.752941
+vn -0.232007 0.955336 0.183044
+v 0.406098 0.136560 0.011138 0.752941 0.752941 0.752941
+vn -0.261543 0.965191 0.000880
+v 0.401882 0.136440 0.000001 0.752941 0.752941 0.752941
+vn -0.001958 0.999932 -0.011517
+v 0.409494 0.137126 0.010202 0.752941 0.752941 0.752941
+vn 0.001634 0.999998 -0.000615
+v 0.405466 0.136986 0.000001 0.752941 0.752941 0.752941
+vn 0.458488 0.767279 -0.448410
+v 0.411345 0.136582 0.009265 0.752941 0.752941 0.752941
+vn 0.659460 0.751738 -0.001479
+v 0.407591 0.136440 0.000001 0.752941 0.752941 0.752941
+vn 0.765157 -0.082531 -0.638532
+v 0.411316 0.134923 0.008448 0.752941 0.752941 0.752941
+vn 0.971814 -0.235735 0.002647
+v 0.407894 0.134800 0.000001 0.752941 0.752941 0.752941
+vn 0.634525 -0.590185 -0.499058
+v 0.409064 0.132145 0.007870 0.752941 0.752941 0.752941
+vn 0.727484 -0.686106 0.005005
+v 0.406012 0.132068 0.000001 0.752941 0.752941 0.752941
+vn 0.599522 -0.709161 -0.371031
+v 0.404252 0.128242 0.007651 0.752941 0.752941 0.752941
+vn 0.649806 -0.760091 0.003729
+v 0.401579 0.128242 0.000001 0.752941 0.752941 0.752941
+vn -0.329353 0.703265 0.630036
+v 0.407189 0.132236 0.021483 0.752941 0.752941 0.752941
+vn -0.259304 0.818252 0.513054
+v 0.412814 0.135121 0.020494 0.752941 0.752941 0.752941
+vn -0.167304 0.930107 0.326973
+v 0.417213 0.136879 0.019093 0.752941 0.752941 0.752941
+vn -0.017693 0.999736 -0.014662
+v 0.420115 0.137497 0.017487 0.752941 0.752941 0.752941
+vn 0.195973 0.806785 -0.557397
+v 0.421245 0.136960 0.015883 0.752941 0.752941 0.752941
+vn 0.399292 0.189469 -0.897032
+v 0.420333 0.135248 0.014482 0.752941 0.752941 0.752941
+vn 0.412324 -0.335353 -0.847070
+v 0.417106 0.132347 0.013491 0.752941 0.752941 0.752941
+vn 0.443716 -0.545362 -0.711124
+v 0.411295 0.128242 0.013117 0.752941 0.752941 0.752941
+vn -0.173444 0.517580 0.837871
+v 0.422959 0.132408 0.026855 0.752941 0.752941 0.752941
+vn -0.140323 0.705596 0.694582
+v 0.428812 0.135449 0.025616 0.752941 0.752941 0.752941
+vn -0.095989 0.890535 0.444671
+v 0.432927 0.137331 0.023866 0.752941 0.752941 0.752941
+vn -0.033140 0.999304 0.017137
+v 0.435129 0.138023 0.021859 0.752941 0.752941 0.752941
+vn 0.044874 0.855067 -0.516572
+v 0.435240 0.137493 0.019854 0.752941 0.752941 0.752941
+vn 0.143494 0.412794 -0.899450
+v 0.433082 0.135707 0.018102 0.752941 0.752941 0.752941
+vn 0.184258 -0.036809 -0.982188
+v 0.428478 0.132635 0.016865 0.752941 0.752941 0.752941
+vn 0.249825 -0.299668 -0.920753
+v 0.421252 0.128242 0.016395 0.752941 0.752941 0.752941
+vn 0.004200 0.233884 0.972256
+v 0.441037 0.132605 0.028645 0.752941 0.752941 0.752941
+vn 0.003482 0.518518 0.855060
+v 0.447150 0.135825 0.027324 0.752941 0.752941 0.752941
+vn -0.005617 0.822572 0.568633
+v 0.450941 0.137848 0.025457 0.752941 0.752941 0.752941
+vn -0.031375 0.996875 0.072502
+v 0.452342 0.138625 0.023316 0.752941 0.752941 0.752941
+vn -0.044620 0.897470 -0.438812
+v 0.451283 0.138105 0.021177 0.752941 0.752941 0.752941
+vn -0.025210 0.594208 -0.803916
+v 0.447697 0.136235 0.019310 0.752941 0.752941 0.752941
+vn -0.009029 0.265554 -0.964054
+v 0.441514 0.132964 0.017989 0.752941 0.752941 0.752941
+vn 0.060906 -0.002221 -0.998141
+v 0.432669 0.128242 0.017487 0.752941 0.752941 0.752941
+vn 0.203849 -0.170721 0.964002
+v 0.459115 0.132803 0.026855 0.752941 0.752941 0.752941
+vn 0.201910 0.184584 0.961853
+v 0.465489 0.136201 0.025616 0.752941 0.752941 0.752941
+vn 0.150645 0.677297 0.720122
+v 0.468955 0.138365 0.023866 0.752941 0.752941 0.752941
+vn -0.003107 0.989704 0.143093
+v 0.469554 0.139227 0.021859 0.752941 0.752941 0.752941
+vn -0.106059 0.933535 -0.342438
+v 0.467327 0.138716 0.019854 0.752941 0.752941 0.752941
+vn -0.146515 0.747058 -0.648412
+v 0.462312 0.136761 0.018102 0.752941 0.752941 0.752941
+vn -0.167268 0.551182 -0.817447
+v 0.454551 0.133293 0.016865 0.752941 0.752941 0.752941
+vn -0.120131 0.334087 -0.934855
+v 0.444084 0.128242 0.016395 0.752941 0.752941 0.752941
+vn 0.368623 -0.588542 0.719538
+v 0.474884 0.132975 0.021483 0.752941 0.752941 0.752941
+vn 0.426873 -0.290195 0.856485
+v 0.481486 0.136529 0.020494 0.752941 0.752941 0.752941
+vn 0.448463 0.367454 0.814775
+v 0.484669 0.138817 0.019093 0.752941 0.752941 0.752941
+vn 0.083640 0.971287 0.222725
+v 0.484570 0.139752 0.017487 0.752941 0.752941 0.752941
+vn -0.148899 0.962227 -0.227920
+v 0.481322 0.139249 0.015883 0.752941 0.752941 0.752941
+vn -0.232480 0.864945 -0.444774
+v 0.475061 0.137221 0.014482 0.752941 0.752941 0.752941
+vn -0.281218 0.773419 -0.568101
+v 0.465923 0.133580 0.013491 0.752941 0.752941 0.752941
+vn -0.276261 0.654961 -0.703354
+v 0.454042 0.128242 0.013117 0.752941 0.752941 0.752941
+vn 0.439406 -0.831677 0.339464
+v 0.486039 0.133097 0.012533 0.752941 0.752941 0.752941
+vn 0.557985 -0.691456 0.458848
+v 0.492801 0.136761 0.011955 0.752941 0.752941 0.752941
+vn 0.812766 0.039513 0.581249
+v 0.495784 0.139136 0.011138 0.752941 0.752941 0.752941
+vn 0.304397 0.924125 0.230943
+v 0.495190 0.140124 0.010202 0.752941 0.752941 0.752941
+vn -0.170345 0.979656 -0.106092
+v 0.491220 0.139626 0.009265 0.752941 0.752941 0.752941
+vn -0.282205 0.934444 -0.217200
+v 0.484078 0.137545 0.008448 0.752941 0.752941 0.752941
+vn -0.343424 0.897773 -0.275796
+v 0.473966 0.133784 0.007870 0.752941 0.752941 0.752941
+vn -0.368696 0.861446 -0.349248
+v 0.461086 0.128242 0.007651 0.752941 0.752941 0.752941
+vn 0.450922 -0.892561 -0.002127
+v 0.490270 0.133143 0.000001 0.752941 0.752941 0.752941
+vn 0.576482 -0.817103 -0.003335
+v 0.497093 0.136850 0.000001 0.752941 0.752941 0.752941
+vn 0.996016 -0.089003 -0.005598
+v 0.500000 0.139258 0.000001 0.752941 0.752941 0.752941
+vn 0.474156 0.880428 -0.004788
+v 0.499219 0.140265 0.000001 0.752941 0.752941 0.752941
+vn -0.175093 0.984552 -0.000076
+v 0.494976 0.139769 0.000001 0.752941 0.752941 0.752941
+vn -0.297778 0.954635 0.000090
+v 0.487499 0.137668 0.000001 0.752941 0.752941 0.752941
+vn -0.361055 0.932544 -0.000522
+v 0.477017 0.133861 0.000001 0.752941 0.752941 0.752941
+vn -0.391225 0.920294 -0.001321
+v 0.463757 0.128242 0.000001 0.752941 0.752941 0.752941
+vn 0.439839 -0.828462 -0.346688
+v 0.486039 0.133097 -0.012531 0.752941 0.752941 0.752941
+vn 0.557442 -0.685589 -0.468217
+v 0.492801 0.136761 -0.011954 0.752941 0.752941 0.752941
+vn 0.811578 0.040041 -0.582871
+v 0.495784 0.139136 -0.011138 0.752941 0.752941 0.752941
+vn 0.307483 0.922571 -0.233059
+v 0.495190 0.140124 -0.010201 0.752941 0.752941 0.752941
+vn -0.170096 0.979778 0.105367
+v 0.491220 0.139626 -0.009265 0.752941 0.752941 0.752941
+vn -0.282654 0.934066 0.218237
+v 0.484078 0.137545 -0.008448 0.752941 0.752941 0.752941
+vn -0.344115 0.897642 0.275363
+v 0.473966 0.133784 -0.007870 0.752941 0.752941 0.752941
+vn -0.365636 0.865331 0.342802
+v 0.461086 0.128242 -0.007650 0.752941 0.752941 0.752941
+vn 0.366773 -0.584152 -0.724047
+v 0.474884 0.132975 -0.021483 0.752941 0.752941 0.752941
+vn 0.425532 -0.288437 -0.857745
+v 0.481486 0.136529 -0.020492 0.752941 0.752941 0.752941
+vn 0.457929 0.355909 -0.814635
+v 0.484669 0.138817 -0.019093 0.752941 0.752941 0.752941
+vn 0.088766 0.970210 -0.225415
+v 0.484570 0.139752 -0.017487 0.752941 0.752941 0.752941
+vn -0.148990 0.962669 0.225989
+v 0.481322 0.139249 -0.015881 0.752941 0.752941 0.752941
+vn -0.232570 0.863729 0.447082
+v 0.475061 0.137221 -0.014482 0.752941 0.752941 0.752941
+vn -0.282276 0.770590 0.571411
+v 0.465923 0.133580 -0.013491 0.752941 0.752941 0.752941
+vn -0.275394 0.664772 0.694432
+v 0.454042 0.128242 -0.013115 0.752941 0.752941 0.752941
+vn 0.205167 -0.175323 -0.962896
+v 0.459115 0.132803 -0.026855 0.752941 0.752941 0.752941
+vn 0.205879 0.176383 -0.962550
+v 0.465489 0.136201 -0.025616 0.752941 0.752941 0.752941
+vn 0.159101 0.668475 -0.726517
+v 0.468955 0.138365 -0.023866 0.752941 0.752941 0.752941
+vn 0.000092 0.989339 -0.145631
+v 0.469554 0.139227 -0.021859 0.752941 0.752941 0.752941
+vn -0.106823 0.934309 0.340081
+v 0.467327 0.138716 -0.019852 0.752941 0.752941 0.752941
+vn -0.145891 0.745795 0.650005
+v 0.462312 0.136761 -0.018102 0.752941 0.752941 0.752941
+vn -0.165876 0.543525 0.822840
+v 0.454551 0.133293 -0.016863 0.752941 0.752941 0.752941
+vn -0.120253 0.337866 0.933480
+v 0.444084 0.128242 -0.016394 0.752941 0.752941 0.752941
+vn 0.007215 0.228017 -0.973631
+v 0.441037 0.132605 -0.028645 0.752941 0.752941 0.752941
+vn 0.006566 0.513899 -0.857826
+v 0.447150 0.135825 -0.027324 0.752941 0.752941 0.752941
+vn -0.002256 0.819760 -0.572703
+v 0.450941 0.137848 -0.025457 0.752941 0.752941 0.752941
+vn -0.029278 0.996786 -0.074563
+v 0.452342 0.138625 -0.023316 0.752941 0.752941 0.752941
+vn -0.045841 0.898550 0.436471
+v 0.451283 0.138105 -0.021176 0.752941 0.752941 0.752941
+vn -0.025182 0.595012 0.803322
+v 0.447697 0.136235 -0.019308 0.752941 0.752941 0.752941
+vn -0.005732 0.257649 0.966222
+v 0.441514 0.132964 -0.017988 0.752941 0.752941 0.752941
+vn 0.065762 -0.016906 0.997692
+v 0.432669 0.128242 -0.017487 0.752941 0.752941 0.752941
+vn -0.172325 0.517035 -0.838438
+v 0.422959 0.132408 -0.026855 0.752941 0.752941 0.752941
+vn -0.139314 0.705301 -0.695084
+v 0.428812 0.135449 -0.025616 0.752941 0.752941 0.752941
+vn -0.094907 0.890206 -0.445562
+v 0.432927 0.137331 -0.023866 0.752941 0.752941 0.752941
+vn -0.031906 0.999317 -0.018619
+v 0.435129 0.138023 -0.021859 0.752941 0.752941 0.752941
+vn 0.043668 0.856088 0.514982
+v 0.435240 0.137493 -0.019852 0.752941 0.752941 0.752941
+vn 0.141900 0.416885 0.897815
+v 0.433082 0.135707 -0.018102 0.752941 0.752941 0.752941
+vn 0.186544 -0.039063 0.981670
+v 0.428478 0.132635 -0.016863 0.752941 0.752941 0.752941
+vn 0.257030 -0.327387 0.909259
+v 0.421252 0.128242 -0.016394 0.752941 0.752941 0.752941
+vn -0.329525 0.706233 -0.626617
+v 0.407189 0.132236 -0.021483 0.752941 0.752941 0.752941
+vn -0.259145 0.819873 -0.510540
+v 0.412814 0.135121 -0.020492 0.752941 0.752941 0.752941
+vn -0.166745 0.930634 -0.325756
+v 0.417213 0.136879 -0.019093 0.752941 0.752941 0.752941
+vn -0.016975 0.999753 0.014355
+v 0.420115 0.137497 -0.017487 0.752941 0.752941 0.752941
+vn 0.195010 0.808009 0.555960
+v 0.421245 0.136960 -0.015881 0.752941 0.752941 0.752941
+vn 0.396203 0.196454 0.896899
+v 0.420333 0.135248 -0.014482 0.752941 0.752941 0.752941
+vn 0.412336 -0.331238 0.848681
+v 0.417106 0.132347 -0.013491 0.752941 0.752941 0.752941
+vn 0.443638 -0.569433 0.692049
+v 0.411295 0.128242 -0.013115 0.752941 0.752941 0.752941
+vn -0.457513 0.822676 -0.337471
+v 0.396034 0.132114 -0.012531 0.752941 0.752941 0.752941
+vn -0.359666 0.891164 -0.276525
+v 0.401499 0.134887 -0.011954 0.752941 0.752941 0.752941
+vn -0.231240 0.955957 -0.180762
+v 0.406098 0.136560 -0.011138 0.752941 0.752941 0.752941
+vn -0.000745 0.999936 0.011332
+v 0.409494 0.137126 -0.010201 0.752941 0.752941 0.752941
+vn 0.458037 0.768634 0.446546
+v 0.411345 0.136582 -0.009265 0.752941 0.752941 0.752941
+vn 0.762797 -0.075208 0.642250
+v 0.411314 0.134923 -0.008448 0.752941 0.752941 0.752941
+vn 0.634229 -0.583270 0.507493
+v 0.409064 0.132145 -0.007870 0.752941 0.752941 0.752941
+vn 0.591839 -0.718307 0.365735
+v 0.404250 0.128242 -0.007650 0.752941 0.752941 0.752941
+vn 0.189014 0.981265 0.037319
+v 0.001387 0.242777 0.007313 0.752941 0.752941 0.752941
+vn 0.192741 0.981250 0.000007
+v 0.002098 0.242777 0.000001 0.752941 0.752941 0.752941
+vn -0.000000 1.000000 0.000001
+v -0.033666 0.244825 0.000001 0.752941 0.752941 0.752941
+vn 0.683472 0.717324 0.135327
+v 0.018228 0.237175 0.010826 0.752941 0.752941 0.752941
+vn 0.696797 0.717268 0.000003
+v 0.019282 0.237175 0.000001 0.752941 0.752941 0.752941
+vn 0.978867 -0.064032 0.194212
+v 0.021503 0.228841 0.011508 0.752941 0.752941 0.752941
+vn 0.997949 -0.064012 0.000003
+v 0.022623 0.228841 0.000001 0.752941 0.752941 0.752941
+vn 0.799583 -0.579283 0.158424
+v 0.015849 0.218594 0.010327 0.752941 0.752941 0.752941
+vn 0.815422 -0.578867 0.000020
+v 0.016854 0.218594 0.000001 0.752941 0.752941 0.752941
+vn 0.740060 -0.656342 0.146719
+v 0.005909 0.207254 0.008251 0.752941 0.752941 0.752941
+vn 0.754886 -0.655856 0.000034
+v 0.006714 0.207254 0.000001 0.752941 0.752941 0.752941
+vn 0.833432 -0.527232 0.165582
+v -0.003673 0.195642 0.006249 0.752941 0.752941 0.752941
+vn 0.850040 -0.526718 0.000017
+v -0.003062 0.195642 0.000001 0.752941 0.752941 0.752941
+vn 0.979792 0.045659 0.194738
+v -0.008256 0.184576 0.005286 0.752941 0.752941 0.752941
+vn 0.998953 0.045751 0.000050
+v -0.007739 0.184576 0.000001 0.752941 0.752941 0.752941
+vn 0.667103 0.733010 0.132930
+v -0.003199 0.174875 0.006335 0.752941 0.752941 0.752941
+vn 0.680571 0.732682 0.000031
+v -0.002577 0.174875 0.000001 0.752941 0.752941 0.752941
+vn 0.177704 0.981337 0.073482
+v -0.000660 0.242777 0.014075 0.752941 0.752941 0.752941
+vn 0.643464 0.717640 0.266360
+v 0.015198 0.237175 0.020839 0.752941 0.752941 0.752941
+vn 0.921899 -0.064302 0.382058
+v 0.018279 0.228841 0.022150 0.752941 0.752941 0.752941
+vn 0.752530 -0.580067 0.311801
+v 0.012955 0.218594 0.019879 0.752941 0.752941 0.752941
+vn 0.696308 -0.657194 0.288532
+v 0.003596 0.207254 0.015884 0.752941 0.752941 0.752941
+vn 0.784344 -0.528131 0.325395
+v -0.005429 0.195642 0.012031 0.752941 0.752941 0.752941
+vn 0.922605 0.045410 0.383063
+v -0.009746 0.184576 0.010183 0.752941 0.752941 0.752941
+vn 0.627699 0.733370 0.261079
+v -0.004986 0.174875 0.012203 0.752941 0.752941 0.752941
+vn 0.159614 0.981401 0.106655
+v -0.003914 0.242777 0.020157 0.752941 0.752941 0.752941
+vn 0.578543 0.718104 0.386801
+v 0.010382 0.237175 0.029841 0.752941 0.752941 0.752941
+vn 0.829521 -0.064440 0.554745
+v 0.013160 0.228841 0.031722 0.752941 0.752941 0.752941
+vn 0.676729 -0.580778 0.452476
+v 0.008358 0.218594 0.028468 0.752941 0.752941 0.752941
+vn 0.626074 -0.657825 0.418685
+v -0.000079 0.207254 0.022749 0.752941 0.752941 0.752941
+vn 0.705406 -0.528836 0.471948
+v -0.008216 0.195642 0.017233 0.752941 0.752941 0.752941
+vn 0.830120 0.045164 0.555752
+v -0.012109 0.184576 0.014590 0.752941 0.752941 0.752941
+vn 0.564695 0.733484 0.378313
+v -0.007824 0.174875 0.017487 0.752941 0.752941 0.752941
+vn 0.135667 0.981424 0.135652
+v -0.008240 0.242777 0.025426 0.752941 0.752941 0.752941
+vn 0.492002 0.718239 0.492003
+v 0.003976 0.237175 0.037643 0.752941 0.752941 0.752941
+vn 0.705624 -0.064425 0.705652
+v 0.006350 0.228841 0.040016 0.752941 0.752941 0.752941
+vn 0.575545 -0.581026 0.575462
+v 0.002247 0.218594 0.035912 0.752941 0.752941 0.752941
+vn 0.532467 -0.658062 0.532385
+v -0.004965 0.207254 0.028700 0.752941 0.752941 0.752941
+vn 0.600081 -0.529145 0.599924
+v -0.011921 0.195642 0.021745 0.752941 0.752941 0.752941
+vn 0.706317 0.045084 0.706458
+v -0.015253 0.184576 0.018414 0.752941 0.752941 0.752941
+vn 0.480598 0.733586 0.480497
+v -0.011592 0.174875 0.022073 0.752941 0.752941 0.752941
+vn 0.106649 0.981399 0.159632
+v -0.013509 0.242777 0.029753 0.752941 0.752941 0.752941
+vn 0.386811 0.718041 0.578614
+v -0.003825 0.237175 0.044049 0.752941 0.752941 0.752941
+vn 0.554769 -0.064427 0.829506
+v -0.001944 0.228841 0.046825 0.752941 0.752941 0.752941
+vn 0.452467 -0.580749 0.676760
+v -0.005197 0.218594 0.042025 0.752941 0.752941 0.752941
+vn 0.418653 -0.657812 0.626110
+v -0.010917 0.207254 0.033588 0.752941 0.752941 0.752941
+vn 0.471988 -0.528865 0.705357
+v -0.016432 0.195642 0.025451 0.752941 0.752941 0.752941
+vn 0.555801 0.045095 0.830091
+v -0.019077 0.184576 0.021556 0.752941 0.752941 0.752941
+vn 0.378247 0.733547 0.564658
+v -0.016178 0.174875 0.025843 0.752941 0.752941 0.752941
+vn 0.073476 0.981339 0.177695
+v -0.019591 0.242777 0.033005 0.752941 0.752941 0.752941
+vn 0.266341 0.717715 0.643388
+v -0.012828 0.237175 0.048863 0.752941 0.752941 0.752941
+vn 0.382073 -0.064286 0.921894
+v -0.011515 0.228841 0.051945 0.752941 0.752941 0.752941
+vn 0.311713 -0.580102 0.752540
+v -0.013788 0.218594 0.046620 0.752941 0.752941 0.752941
+vn 0.288528 -0.657144 0.696357
+v -0.017783 0.207254 0.037261 0.752941 0.752941 0.752941
+vn 0.325300 -0.528099 0.784405
+v -0.021636 0.195642 0.028238 0.752941 0.752941 0.752941
+vn 0.383167 0.045336 0.922566
+v -0.023484 0.184576 0.023921 0.752941 0.752941 0.752941
+vn 0.261095 0.733281 0.627797
+v -0.021464 0.174875 0.028679 0.752941 0.752941 0.752941
+vn 0.037354 0.981263 0.189017
+v -0.026353 0.242777 0.035054 0.752941 0.752941 0.752941
+vn 0.135358 0.717262 0.683530
+v -0.022840 0.237175 0.051895 0.752941 0.752941 0.752941
+vn 0.194158 -0.064116 0.978873
+v -0.022158 0.228841 0.055168 0.752941 0.752941 0.752941
+vn 0.158449 -0.579266 0.799590
+v -0.023339 0.218594 0.049514 0.752941 0.752941 0.752941
+vn 0.146707 -0.656319 0.740082
+v -0.025416 0.207254 0.039576 0.752941 0.752941 0.752941
+vn 0.165438 -0.527216 0.833471
+v -0.027418 0.195642 0.029993 0.752941 0.752941 0.752941
+vn 0.194730 0.045671 0.979793
+v -0.028379 0.184576 0.025410 0.752941 0.752941 0.752941
+vn 0.132966 0.733008 0.667097
+v -0.027332 0.174875 0.030468 0.752941 0.752941 0.752941
+vn -0.000005 0.981250 0.192741
+v -0.033666 0.242777 0.035765 0.752941 0.752941 0.752941
+vn 0.000002 0.717194 0.696874
+v -0.033666 0.237175 0.052949 0.752941 0.752941 0.752941
+vn -0.000009 -0.064087 0.997944
+v -0.033666 0.228841 0.056288 0.752941 0.752941 0.752941
+vn -0.000009 -0.578842 0.815440
+v -0.033666 0.218594 0.050520 0.752941 0.752941 0.752941
+vn -0.000002 -0.655857 0.754885
+v -0.033666 0.207254 0.040379 0.752941 0.752941 0.752941
+vn -0.000035 -0.526673 0.850068
+v -0.033666 0.195642 0.030603 0.752941 0.752941 0.752941
+vn -0.000040 0.045791 0.998951
+v -0.033666 0.184576 0.025928 0.752941 0.752941 0.752941
+vn -0.000007 0.732660 0.680595
+v -0.033666 0.174875 0.031089 0.752941 0.752941 0.752941
+vn -0.037339 0.981264 0.189016
+v -0.040978 0.242777 0.035054 0.752941 0.752941 0.752941
+vn -0.135358 0.717261 0.683531
+v -0.044492 0.237175 0.051895 0.752941 0.752941 0.752941
+vn -0.194155 -0.064154 0.978871
+v -0.045173 0.228841 0.055168 0.752941 0.752941 0.752941
+vn -0.158468 -0.579247 0.799600
+v -0.043992 0.218594 0.049514 0.752941 0.752941 0.752941
+vn -0.146730 -0.656327 0.740071
+v -0.041917 0.207254 0.039576 0.752941 0.752941 0.752941
+vn -0.165454 -0.527249 0.833447
+v -0.039915 0.195642 0.029993 0.752941 0.752941 0.752941
+vn -0.194767 0.045689 0.979785
+v -0.038952 0.184576 0.025410 0.752941 0.752941 0.752941
+vn -0.132975 0.733051 0.667048
+v -0.040001 0.174875 0.030468 0.752941 0.752941 0.752941
+vn -0.073484 0.981338 0.177695
+v -0.047742 0.242777 0.033005 0.752941 0.752941 0.752941
+vn -0.266385 0.717692 0.643395
+v -0.054504 0.237175 0.048863 0.752941 0.752941 0.752941
+vn -0.382087 -0.064277 0.921888
+v -0.055817 0.228841 0.051945 0.752941 0.752941 0.752941
+vn -0.311684 -0.580100 0.752554
+v -0.053544 0.218594 0.046620 0.752941 0.752941 0.752941
+vn -0.288522 -0.657149 0.696355
+v -0.049550 0.207254 0.037261 0.752941 0.752941 0.752941
+vn -0.325325 -0.528144 0.784364
+v -0.045696 0.195642 0.028238 0.752941 0.752941 0.752941
+vn -0.383073 0.045404 0.922602
+v -0.043848 0.184576 0.023921 0.752941 0.752941 0.752941
+vn -0.261082 0.733319 0.627758
+v -0.045869 0.174875 0.028679 0.752941 0.752941 0.752941
+vn -0.106651 0.981401 0.159617
+v -0.053822 0.242777 0.029753 0.752941 0.752941 0.752941
+vn -0.386779 0.718016 0.578667
+v -0.063507 0.237175 0.044049 0.752941 0.752941 0.752941
+vn -0.554761 -0.064452 0.829510
+v -0.065387 0.228841 0.046825 0.752941 0.752941 0.752941
+vn -0.452511 -0.580735 0.676743
+v -0.062134 0.218594 0.042025 0.752941 0.752941 0.752941
+vn -0.418692 -0.657822 0.626073
+v -0.056416 0.207254 0.033588 0.752941 0.752941 0.752941
+vn -0.471967 -0.528870 0.705368
+v -0.050900 0.195642 0.025451 0.752941 0.752941 0.752941
+vn -0.555750 0.045142 0.830123
+v -0.048256 0.184576 0.021556 0.752941 0.752941 0.752941
+vn -0.378291 0.733543 0.564633
+v -0.051154 0.174875 0.025843 0.752941 0.752941 0.752941
+vn -0.135648 0.981427 0.135653
+v -0.059091 0.242777 0.025426 0.752941 0.752941 0.752941
+vn -0.492043 0.718202 0.492016
+v -0.071309 0.237175 0.037643 0.752941 0.752941 0.752941
+vn -0.705608 -0.064512 0.705660
+v -0.073681 0.228841 0.040016 0.752941 0.752941 0.752941
+vn -0.575502 -0.581009 0.575523
+v -0.069578 0.218594 0.035912 0.752941 0.752941 0.752941
+vn -0.532465 -0.658053 0.532398
+v -0.062366 0.207254 0.028700 0.752941 0.752941 0.752941
+vn -0.600043 -0.529090 0.600010
+v -0.055410 0.195642 0.021745 0.752941 0.752941 0.752941
+vn -0.706379 0.045028 0.706400
+v -0.052080 0.184576 0.018414 0.752941 0.752941 0.752941
+vn -0.480574 0.733569 0.480547
+v -0.055739 0.174875 0.022073 0.752941 0.752941 0.752941
+vn -0.159630 0.981397 0.106666
+v -0.063419 0.242777 0.020157 0.752941 0.752941 0.752941
+vn -0.578586 0.718080 0.386780
+v -0.077714 0.237175 0.029841 0.752941 0.752941 0.752941
+vn -0.829484 -0.064415 0.554803
+v -0.080491 0.228841 0.031722 0.752941 0.752941 0.752941
+vn -0.676704 -0.580769 0.452525
+v -0.075691 0.218594 0.028468 0.752941 0.752941 0.752941
+vn -0.626074 -0.657811 0.418707
+v -0.067253 0.207254 0.022749 0.752941 0.752941 0.752941
+vn -0.705340 -0.528833 0.472050
+v -0.059117 0.195642 0.017233 0.752941 0.752941 0.752941
+vn -0.830077 0.045108 0.555821
+v -0.055222 0.184576 0.014590 0.752941 0.752941 0.752941
+vn -0.564669 0.733509 0.378303
+v -0.059509 0.174875 0.017487 0.752941 0.752941 0.752941
+vn -0.177698 0.981339 0.073466
+v -0.066671 0.242777 0.014075 0.752941 0.752941 0.752941
+vn -0.643380 0.717708 0.266380
+v -0.082529 0.237175 0.020839 0.752941 0.752941 0.752941
+vn -0.921902 -0.064245 0.382058
+v -0.085612 0.228841 0.022150 0.752941 0.752941 0.752941
+vn -0.752534 -0.580104 0.311724
+v -0.080287 0.218594 0.019879 0.752941 0.752941 0.752941
+vn -0.696340 -0.657150 0.288557
+v -0.070927 0.207254 0.015884 0.752941 0.752941 0.752941
+vn -0.784346 -0.528127 0.325397
+v -0.061904 0.195642 0.012031 0.752941 0.752941 0.752941
+vn -0.922615 0.045364 0.383046
+v -0.057587 0.184576 0.010183 0.752941 0.752941 0.752941
+vn -0.627788 0.733289 0.261094
+v -0.062345 0.174875 0.012203 0.752941 0.752941 0.752941
+vn -0.189006 0.981265 0.037346
+v -0.068719 0.242777 0.007313 0.752941 0.752941 0.752941
+vn -0.683526 0.717271 0.135331
+v -0.085561 0.237175 0.010826 0.752941 0.752941 0.752941
+vn -0.978878 -0.064122 0.194128
+v -0.088834 0.228841 0.011508 0.752941 0.752941 0.752941
+vn -0.799605 -0.579264 0.158381
+v -0.083180 0.218594 0.010327 0.752941 0.752941 0.752941
+vn -0.740092 -0.656310 0.146699
+v -0.073241 0.207254 0.008251 0.752941 0.752941 0.752941
+vn -0.833451 -0.527247 0.165440
+v -0.063660 0.195642 0.006249 0.752941 0.752941 0.752941
+vn -0.979802 0.045609 0.194700
+v -0.059075 0.184576 0.005286 0.752941 0.752941 0.752941
+vn -0.667105 0.733012 0.132910
+v -0.064133 0.174875 0.006335 0.752941 0.752941 0.752941
+vn -0.192752 0.981247 0.000005
+v -0.069431 0.242777 0.000001 0.752941 0.752941 0.752941
+vn -0.696833 0.717233 -0.000001
+v -0.086614 0.237175 0.000001 0.752941 0.752941 0.752941
+vn -0.997945 -0.064073 0.000001
+v -0.089954 0.228841 0.000001 0.752941 0.752941 0.752941
+vn -0.815426 -0.578861 0.000001
+v -0.084185 0.218594 0.000001 0.752941 0.752941 0.752941
+vn -0.754900 -0.655840 -0.000007
+v -0.074045 0.207254 0.000001 0.752941 0.752941 0.752941
+vn -0.850071 -0.526668 -0.000041
+v -0.064269 0.195642 0.000001 0.752941 0.752941 0.752941
+vn -0.998954 0.045734 -0.000028
+v -0.059594 0.184576 0.000001 0.752941 0.752941 0.752941
+vn -0.680602 0.732653 0.000006
+v -0.064754 0.174875 0.000001 0.752941 0.752941 0.752941
+vn -0.189004 0.981266 -0.037346
+v -0.068719 0.242777 -0.007313 0.752941 0.752941 0.752941
+vn -0.683532 0.717267 -0.135322
+v -0.085561 0.237175 -0.010826 0.752941 0.752941 0.752941
+vn -0.978879 -0.064134 -0.194123
+v -0.088834 0.228841 -0.011508 0.752941 0.752941 0.752941
+vn -0.799590 -0.579277 -0.158412
+v -0.083180 0.218594 -0.010327 0.752941 0.752941 0.752941
+vn -0.740083 -0.656315 -0.146723
+v -0.073241 0.207254 -0.008250 0.752941 0.752941 0.752941
+vn -0.833439 -0.527267 -0.165435
+v -0.063660 0.195642 -0.006247 0.752941 0.752941 0.752941
+vn -0.979786 0.045647 -0.194769
+v -0.059075 0.184576 -0.005286 0.752941 0.752941 0.752941
+vn -0.667074 0.733034 -0.132939
+v -0.064133 0.174875 -0.006334 0.752941 0.752941 0.752941
+vn -0.177701 0.981338 -0.073472
+v -0.066671 0.242777 -0.014075 0.752941 0.752941 0.752941
+vn -0.643352 0.717731 -0.266385
+v -0.082529 0.237175 -0.020837 0.752941 0.752941 0.752941
+vn -0.921893 -0.064242 -0.382081
+v -0.085612 0.228841 -0.022150 0.752941 0.752941 0.752941
+vn -0.752538 -0.580120 -0.311684
+v -0.080287 0.218594 -0.019877 0.752941 0.752941 0.752941
+vn -0.696340 -0.657168 -0.288516
+v -0.070927 0.207254 -0.015883 0.752941 0.752941 0.752941
+vn -0.784367 -0.528122 -0.325355
+v -0.061904 0.195642 -0.012029 0.752941 0.752941 0.752941
+vn -0.922637 0.045376 -0.382991
+v -0.057587 0.184576 -0.010181 0.752941 0.752941 0.752941
+vn -0.627767 0.733331 -0.261025
+v -0.062345 0.174875 -0.012202 0.752941 0.752941 0.752941
+vn -0.159634 0.981398 -0.106656
+v -0.063419 0.242777 -0.020157 0.752941 0.752941 0.752941
+vn -0.578621 0.718058 -0.386770
+v -0.077714 0.237175 -0.029841 0.752941 0.752941 0.752941
+vn -0.829493 -0.064400 -0.554791
+v -0.080491 0.228841 -0.031722 0.752941 0.752941 0.752941
+vn -0.676724 -0.580765 -0.452500
+v -0.075691 0.218594 -0.028468 0.752941 0.752941 0.752941
+vn -0.626080 -0.657833 -0.418664
+v -0.067253 0.207254 -0.022749 0.752941 0.752941 0.752941
+vn -0.705389 -0.528852 -0.471956
+v -0.059117 0.195642 -0.017233 0.752941 0.752941 0.752941
+vn -0.830117 0.045154 -0.555758
+v -0.055222 0.184576 -0.014590 0.752941 0.752941 0.752941
+vn -0.564662 0.733530 -0.378273
+v -0.059509 0.174875 -0.017487 0.752941 0.752941 0.752941
+vn -0.135634 0.981426 -0.135670
+v -0.059091 0.242777 -0.025426 0.752941 0.752941 0.752941
+vn -0.492007 0.718215 -0.492033
+v -0.071309 0.237175 -0.037642 0.752941 0.752941 0.752941
+vn -0.705625 -0.064452 -0.705649
+v -0.073681 0.228841 -0.040016 0.752941 0.752941 0.752941
+vn -0.575533 -0.581021 -0.575479
+v -0.069578 0.218594 -0.035912 0.752941 0.752941 0.752941
+vn -0.532426 -0.658065 -0.532422
+v -0.062366 0.207254 -0.028700 0.752941 0.752941 0.752941
+vn -0.600026 -0.529097 -0.600021
+v -0.055410 0.195642 -0.021745 0.752941 0.752941 0.752941
+vn -0.706417 0.045030 -0.706362
+v -0.052080 0.184576 -0.018413 0.752941 0.752941 0.752941
+vn -0.480555 0.733574 -0.480558
+v -0.055739 0.174875 -0.022073 0.752941 0.752941 0.752941
+vn -0.106654 0.981401 -0.159614
+v -0.053822 0.242777 -0.029752 0.752941 0.752941 0.752941
+vn -0.386798 0.718088 -0.578564
+v -0.063507 0.237175 -0.044047 0.752941 0.752941 0.752941
+vn -0.554762 -0.064367 -0.829516
+v -0.065387 0.228841 -0.046825 0.752941 0.752941 0.752941
+vn -0.452482 -0.580740 -0.676757
+v -0.062134 0.218594 -0.042026 0.752941 0.752941 0.752941
+vn -0.418708 -0.657835 -0.626049
+v -0.056416 0.207254 -0.033586 0.752941 0.752941 0.752941
+vn -0.471976 -0.528831 -0.705391
+v -0.050900 0.195642 -0.025450 0.752941 0.752941 0.752941
+vn -0.555775 0.045123 -0.830107
+v -0.048256 0.184576 -0.021556 0.752941 0.752941 0.752941
+vn -0.378331 0.733499 -0.564663
+v -0.051154 0.174875 -0.025842 0.752941 0.752941 0.752941
+vn -0.073478 0.981336 -0.177708
+v -0.047742 0.242777 -0.033005 0.752941 0.752941 0.752941
+vn -0.266405 0.717669 -0.643413
+v -0.054504 0.237175 -0.048864 0.752941 0.752941 0.752941
+vn -0.382108 -0.064307 -0.921878
+v -0.055817 0.228841 -0.051945 0.752941 0.752941 0.752941
+vn -0.311685 -0.580098 -0.752555
+v -0.053544 0.218594 -0.046620 0.752941 0.752941 0.752941
+vn -0.288519 -0.657159 -0.696347
+v -0.049550 0.207254 -0.037261 0.752941 0.752941 0.752941
+vn -0.325386 -0.528115 -0.784358
+v -0.045696 0.195642 -0.028237 0.752941 0.752941 0.752941
+vn -0.383084 0.045371 -0.922598
+v -0.043848 0.184576 -0.023920 0.752941 0.752941 0.752941
+vn -0.261043 0.733314 -0.627780
+v -0.045869 0.174875 -0.028679 0.752941 0.752941 0.752941
+vn -0.037326 0.981269 -0.188994
+v -0.040978 0.242777 -0.035052 0.752941 0.752941 0.752941
+vn -0.135307 0.717305 -0.683495
+v -0.044492 0.237175 -0.051894 0.752941 0.752941 0.752941
+vn -0.194125 -0.064095 -0.978881
+v -0.045173 0.228841 -0.055168 0.752941 0.752941 0.752941
+vn -0.158455 -0.579278 -0.799580
+v -0.043992 0.218594 -0.049514 0.752941 0.752941 0.752941
+vn -0.146753 -0.656316 -0.740077
+v -0.041917 0.207254 -0.039574 0.752941 0.752941 0.752941
+vn -0.165495 -0.527215 -0.833460
+v -0.039915 0.195642 -0.029993 0.752941 0.752941 0.752941
+vn -0.194823 0.045622 -0.979777
+v -0.038952 0.184576 -0.025410 0.752941 0.752941 0.752941
+vn -0.132993 0.732956 -0.667150
+v -0.040001 0.174875 -0.030466 0.752941 0.752941 0.752941
+vn 0.000001 0.981250 -0.192741
+v -0.033666 0.242777 -0.035764 0.752941 0.752941 0.752941
+vn -0.000019 0.717197 -0.696870
+v -0.033666 0.237175 -0.052949 0.752941 0.752941 0.752941
+vn -0.000011 -0.064077 -0.997945
+v -0.033666 0.228841 -0.056288 0.752941 0.752941 0.752941
+vn 0.000022 -0.578843 -0.815439
+v -0.033666 0.218594 -0.050520 0.752941 0.752941 0.752941
+vn 0.000022 -0.655863 -0.754880
+v -0.033666 0.207254 -0.040380 0.752941 0.752941 0.752941
+vn 0.000022 -0.526670 -0.850070
+v -0.033666 0.195642 -0.030603 0.752941 0.752941 0.752941
+vn 0.000053 0.045757 -0.998953
+v -0.033666 0.184576 -0.025928 0.752941 0.752941 0.752941
+vn 0.000021 0.732679 -0.680575
+v -0.033666 0.174875 -0.031089 0.752941 0.752941 0.752941
+vn 0.037330 0.981268 -0.188999
+v -0.026353 0.242777 -0.035052 0.752941 0.752941 0.752941
+vn 0.135346 0.717308 -0.683484
+v -0.022840 0.237175 -0.051894 0.752941 0.752941 0.752941
+vn 0.194181 -0.064107 -0.978869
+v -0.022158 0.228841 -0.055168 0.752941 0.752941 0.752941
+vn 0.158460 -0.579278 -0.799580
+v -0.023339 0.218594 -0.049514 0.752941 0.752941 0.752941
+vn 0.146762 -0.656326 -0.740066
+v -0.025416 0.207254 -0.039574 0.752941 0.752941 0.752941
+vn 0.165536 -0.527226 -0.833445
+v -0.027418 0.195642 -0.029993 0.752941 0.752941 0.752941
+vn 0.194848 0.045654 -0.979770
+v -0.028379 0.184576 -0.025410 0.752941 0.752941 0.752941
+vn 0.132982 0.732976 -0.667130
+v -0.027332 0.174875 -0.030466 0.752941 0.752941 0.752941
+vn 0.073474 0.981338 -0.177702
+v -0.019591 0.242777 -0.033005 0.752941 0.752941 0.752941
+vn 0.266377 0.717663 -0.643431
+v -0.012828 0.237175 -0.048864 0.752941 0.752941 0.752941
+vn 0.382045 -0.064290 -0.921905
+v -0.011515 0.228841 -0.051945 0.752941 0.752941 0.752941
+vn 0.311653 -0.580129 -0.752544
+v -0.013788 0.218594 -0.046620 0.752941 0.752941 0.752941
+vn 0.288516 -0.657175 -0.696333
+v -0.017783 0.207254 -0.037261 0.752941 0.752941 0.752941
+vn 0.325349 -0.528127 -0.784366
+v -0.021636 0.195642 -0.028237 0.752941 0.752941 0.752941
+vn 0.383155 0.045423 -0.922567
+v -0.023484 0.184576 -0.023920 0.752941 0.752941 0.752941
+vn 0.261021 0.733328 -0.627772
+v -0.021464 0.174875 -0.028679 0.752941 0.752941 0.752941
+vn 0.106649 0.981399 -0.159630
+v -0.013509 0.242777 -0.029752 0.752941 0.752941 0.752941
+vn 0.386795 0.718110 -0.578539
+v -0.003825 0.237175 -0.044047 0.752941 0.752941 0.752941
+vn 0.554788 -0.064353 -0.829499
+v -0.001944 0.228841 -0.046825 0.752941 0.752941 0.752941
+vn 0.452471 -0.580759 -0.676749
+v -0.005197 0.218594 -0.042026 0.752941 0.752941 0.752941
+vn 0.418617 -0.657847 -0.626096
+v -0.010917 0.207254 -0.033586 0.752941 0.752941 0.752941
+vn 0.471917 -0.528863 -0.705407
+v -0.016432 0.195642 -0.025450 0.752941 0.752941 0.752941
+vn 0.555753 0.045170 -0.830119
+v -0.019077 0.184576 -0.021556 0.752941 0.752941 0.752941
+vn 0.378263 0.733526 -0.564673
+v -0.016178 0.174875 -0.025842 0.752941 0.752941 0.752941
+vn 0.135662 0.981423 -0.135666
+v -0.008240 0.242777 -0.025426 0.752941 0.752941 0.752941
+vn 0.491970 0.718266 -0.491995
+v 0.003976 0.237175 -0.037642 0.752941 0.752941 0.752941
+vn 0.705624 -0.064419 -0.705653
+v 0.006350 0.228841 -0.040016 0.752941 0.752941 0.752941
+vn 0.575568 -0.580997 -0.575468
+v 0.002247 0.218594 -0.035912 0.752941 0.752941 0.752941
+vn 0.532401 -0.658087 -0.532420
+v -0.004965 0.207254 -0.028700 0.752941 0.752941 0.752941
+vn 0.600006 -0.529118 -0.600022
+v -0.011921 0.195642 -0.021745 0.752941 0.752941 0.752941
+vn 0.706293 0.045002 -0.706488
+v -0.015253 0.184576 -0.018413 0.752941 0.752941 0.752941
+vn 0.480543 0.733625 -0.480493
+v -0.011592 0.174875 -0.022073 0.752941 0.752941 0.752941
+vn 0.159617 0.981401 -0.106652
+v -0.003914 0.242777 -0.020157 0.752941 0.752941 0.752941
+vn 0.578570 0.718087 -0.386791
+v 0.010382 0.237175 -0.029841 0.752941 0.752941 0.752941
+vn 0.829512 -0.064400 -0.554763
+v 0.013160 0.228841 -0.031722 0.752941 0.752941 0.752941
+vn 0.676716 -0.580790 -0.452481
+v 0.008358 0.218594 -0.028468 0.752941 0.752941 0.752941
+vn 0.626085 -0.657822 -0.418674
+v -0.000079 0.207254 -0.022749 0.752941 0.752941 0.752941
+vn 0.705457 -0.528809 -0.471902
+v -0.008216 0.195642 -0.017233 0.752941 0.752941 0.752941
+vn 0.830105 0.045118 -0.555779
+v -0.012109 0.184576 -0.014590 0.752941 0.752941 0.752941
+vn 0.564693 0.733473 -0.378337
+v -0.007824 0.174875 -0.017487 0.752941 0.752941 0.752941
+vn 0.177711 0.981335 -0.073486
+v -0.000660 0.242777 -0.014075 0.752941 0.752941 0.752941
+vn 0.643403 0.717685 -0.266383
+v 0.015198 0.237175 -0.020837 0.752941 0.752941 0.752941
+vn 0.921886 -0.064280 -0.382093
+v 0.018279 0.228841 -0.022150 0.752941 0.752941 0.752941
+vn 0.752525 -0.580105 -0.311744
+v 0.012955 0.218594 -0.019877 0.752941 0.752941 0.752941
+vn 0.696337 -0.657164 -0.288530
+v 0.003596 0.207254 -0.015883 0.752941 0.752941 0.752941
+vn 0.784355 -0.528130 -0.325370
+v -0.005429 0.195642 -0.012029 0.752941 0.752941 0.752941
+vn 0.922632 0.045425 -0.382998
+v -0.009746 0.184576 -0.010181 0.752941 0.752941 0.752941
+vn 0.627765 0.733320 -0.261061
+v -0.004986 0.174875 -0.012202 0.752941 0.752941 0.752941
+vn 0.189012 0.981265 -0.037324
+v 0.001387 0.242777 -0.007313 0.752941 0.752941 0.752941
+vn 0.683461 0.717342 -0.135285
+v 0.018228 0.237175 -0.010826 0.752941 0.752941 0.752941
+vn 0.978876 -0.064057 -0.194161
+v 0.021503 0.228841 -0.011508 0.752941 0.752941 0.752941
+vn 0.799584 -0.579276 -0.158444
+v 0.015849 0.218594 -0.010327 0.752941 0.752941 0.752941
+vn 0.740072 -0.656329 -0.146721
+v 0.005909 0.207254 -0.008250 0.752941 0.752941 0.752941
+vn 0.833436 -0.527245 -0.165520
+v -0.003673 0.195642 -0.006247 0.752941 0.752941 0.752941
+vn 0.979789 0.045667 -0.194752
+v -0.008256 0.184576 -0.005286 0.752941 0.752941 0.752941
+vn 0.667130 0.732983 -0.132941
+v -0.003199 0.174875 -0.006334 0.752941 0.752941 0.752941
+vn 0.329646 0.941812 0.065747
+v 0.012748 0.167134 0.009651 0.752941 0.752941 0.752941
+vn 0.336463 0.941697 -0.000002
+v 0.013696 0.167134 0.000001 0.752941 0.752941 0.752941
+vn 0.207247 0.977416 0.041316
+v 0.035837 0.161031 0.014451 0.752941 0.752941 0.752941
+vn 0.211537 0.977370 0.000001
+v 0.037255 0.161031 0.000001 0.752941 0.752941 0.752941
+vn 0.159261 0.986726 0.031744
+v 0.063209 0.156022 0.020142 0.752941 0.752941 0.752941
+vn 0.162549 0.986701 -0.000001
+v 0.065187 0.156022 0.000001 0.752941 0.752941 0.752941
+vn 0.151087 0.988062 0.030104
+v 0.092011 0.151558 0.026130 0.752941 0.752941 0.752941
+vn 0.154192 0.988041 0.000000
+v 0.094575 0.151558 0.000001 0.752941 0.752941 0.752941
+vn 0.180770 0.982866 0.036012
+v 0.119384 0.147096 0.031821 0.752941 0.752941 0.752941
+vn 0.184467 0.982839 0.000001
+v 0.122508 0.147096 0.000001 0.752941 0.752941 0.752941
+vn 0.278933 0.958702 0.055556
+v 0.142473 0.142086 0.036621 0.752941 0.752941 0.752941
+vn 0.284607 0.958644 -0.000001
+v 0.146068 0.142086 0.000001 0.752941 0.752941 0.752941
+vn 0.589887 0.798886 0.117534
+v 0.158420 0.135984 0.039937 0.752941 0.752941 0.752941
+vn 0.601680 0.798737 -0.000003
+v 0.162340 0.135984 0.000001 0.752941 0.752941 0.752941
+vn 0.771340 0.617506 0.154015
+v 0.164371 0.128242 0.041174 0.752941 0.752941 0.752941
+vn 0.786859 0.617132 -0.000003
+v 0.168412 0.128242 0.000001 0.752941 0.752941 0.752941
+vn 0.309970 0.941964 0.128925
+v 0.010025 0.167134 0.018589 0.752941 0.752941 0.752941
+vn 0.194837 0.977482 0.081038
+v 0.031759 0.161031 0.027837 0.752941 0.752941 0.752941
+vn 0.149718 0.986766 0.062265
+v 0.057526 0.156022 0.038800 0.752941 0.752941 0.752941
+vn 0.142029 0.988099 0.059061
+v 0.084637 0.151558 0.050336 0.752941 0.752941 0.752941
+vn 0.169936 0.982919 0.070655
+v 0.110404 0.147096 0.061299 0.752941 0.752941 0.752941
+vn 0.262230 0.958828 0.109013
+v 0.132138 0.142086 0.070545 0.752941 0.752941 0.752941
+vn 0.554863 0.799309 0.230722
+v 0.147149 0.135984 0.076933 0.752941 0.752941 0.752941
+vn 0.725720 0.618110 0.302112
+v 0.152751 0.128242 0.079316 0.752941 0.752941 0.752941
+vn 0.278635 0.942078 0.186684
+v 0.005704 0.167134 0.026641 0.752941 0.752941 0.752941
+vn 0.175123 0.977530 0.117336
+v 0.025288 0.161031 0.039894 0.752941 0.752941 0.752941
+vn 0.134563 0.986795 0.090156
+v 0.048505 0.156022 0.055605 0.752941 0.752941 0.752941
+vn 0.127644 0.988127 0.085516
+v 0.072935 0.151558 0.072136 0.752941 0.752941 0.752941
+vn 0.152716 0.982960 0.102307
+v 0.096153 0.147096 0.087847 0.752941 0.752941 0.752941
+vn 0.235654 0.958930 0.157862
+v 0.115737 0.142086 0.101100 0.752941 0.752941 0.752941
+vn 0.498880 0.799637 0.334215
+v 0.129264 0.135984 0.110254 0.752941 0.752941 0.752941
+vn 0.652728 0.618501 0.437496
+v 0.134311 0.128242 0.113669 0.752941 0.752941 0.752941
+vn 0.237081 0.942117 0.237083
+v -0.000039 0.167134 0.033628 0.752941 0.752941 0.752941
+vn 0.149001 0.977546 0.149009
+v 0.016688 0.161031 0.050355 0.752941 0.752941 0.752941
+vn 0.114488 0.986806 0.114485
+v 0.036520 0.156022 0.070186 0.752941 0.752941 0.752941
+vn 0.108598 0.988136 0.108595
+v 0.057386 0.151558 0.091052 0.752941 0.752941 0.752941
+vn 0.129927 0.982975 0.129922
+v 0.077217 0.147096 0.110884 0.752941 0.752941 0.752941
+vn 0.200482 0.958965 0.200482
+v 0.093944 0.142086 0.127611 0.752941 0.752941 0.752941
+vn 0.424477 0.799778 0.424470
+v 0.105499 0.135984 0.139164 0.752941 0.752941 0.752941
+vn 0.555544 0.618677 0.555527
+v 0.109810 0.128242 0.143475 0.752941 0.752941 0.752941
+vn 0.186709 0.942074 0.278634
+v -0.007024 0.167134 0.039369 0.752941 0.752941 0.752941
+vn 0.117344 0.977529 0.175123
+v 0.006228 0.161031 0.058953 0.752941 0.752941 0.752941
+vn 0.090155 0.986796 0.134559
+v 0.021939 0.156022 0.082172 0.752941 0.752941 0.752941
+vn 0.085517 0.988127 0.127642
+v 0.038471 0.151558 0.106601 0.752941 0.752941 0.752941
+vn 0.102308 0.982961 0.152715
+v 0.054182 0.147096 0.129820 0.752941 0.752941 0.752941
+vn 0.157874 0.958925 0.235666
+v 0.067434 0.142086 0.149404 0.752941 0.752941 0.752941
+vn 0.334185 0.799679 0.498833
+v 0.076587 0.135984 0.162930 0.752941 0.752941 0.752941
+vn 0.437457 0.618609 0.652652
+v 0.080004 0.128242 0.167978 0.752941 0.752941 0.752941
+vn 0.128933 0.941973 0.309940
+v -0.015076 0.167134 0.043692 0.752941 0.752941 0.752941
+vn 0.081047 0.977482 0.194834
+v -0.005829 0.161031 0.065426 0.752941 0.752941 0.752941
+vn 0.062263 0.986766 0.149718
+v 0.005133 0.156022 0.091193 0.752941 0.752941 0.752941
+vn 0.059059 0.988099 0.142031
+v 0.016669 0.151558 0.118304 0.752941 0.752941 0.752941
+vn 0.070649 0.982919 0.169936
+v 0.027632 0.147096 0.144071 0.752941 0.752941 0.752941
+vn 0.109015 0.958827 0.262235
+v 0.036880 0.142086 0.165805 0.752941 0.752941 0.752941
+vn 0.230713 0.799313 0.554861
+v 0.043266 0.135984 0.180816 0.752941 0.752941 0.752941
+vn 0.302095 0.618137 0.725704
+v 0.045650 0.128242 0.186418 0.752941 0.752941 0.752941
+vn 0.065740 0.941813 0.329646
+v -0.024016 0.167134 0.046415 0.752941 0.752941 0.752941
+vn 0.041314 0.977416 0.207246
+v -0.019216 0.161031 0.069504 0.752941 0.752941 0.752941
+vn 0.031744 0.986725 0.159264
+v -0.013525 0.156022 0.096876 0.752941 0.752941 0.752941
+vn 0.030104 0.988062 0.151088
+v -0.007537 0.151558 0.125677 0.752941 0.752941 0.752941
+vn 0.036009 0.982865 0.180775
+v -0.001846 0.147096 0.153050 0.752941 0.752941 0.752941
+vn 0.055540 0.958707 0.278919
+v 0.002954 0.142086 0.176138 0.752941 0.752941 0.752941
+vn 0.117532 0.798873 0.589906
+v 0.006270 0.135984 0.192087 0.752941 0.752941 0.752941
+vn 0.154029 0.617454 0.771379
+v 0.007507 0.128242 0.198037 0.752941 0.752941 0.752941
+vn -0.000001 0.941699 0.336456
+v -0.033666 0.167134 0.047363 0.752941 0.752941 0.752941
+vn -0.000000 0.977370 0.211537
+v -0.033666 0.161031 0.070922 0.752941 0.752941 0.752941
+vn 0.000000 0.986700 0.162549
+v -0.033666 0.156022 0.098854 0.752941 0.752941 0.752941
+vn 0.000001 0.988041 0.154194
+v -0.033666 0.151558 0.128242 0.752941 0.752941 0.752941
+vn 0.000000 0.982837 0.184474
+v -0.033666 0.147096 0.156174 0.752941 0.752941 0.752941
+vn 0.000003 0.958646 0.284600
+v -0.033666 0.142086 0.179733 0.752941 0.752941 0.752941
+vn -0.000005 0.798767 0.601640
+v -0.033666 0.135984 0.196006 0.752941 0.752941 0.752941
+vn -0.000011 0.617185 0.786818
+v -0.033666 0.128242 0.202079 0.752941 0.752941 0.752941
+vn -0.065738 0.941813 0.329647
+v -0.043316 0.167134 0.046415 0.752941 0.752941 0.752941
+vn -0.041314 0.977416 0.207248
+v -0.048116 0.161031 0.069504 0.752941 0.752941 0.752941
+vn -0.031742 0.986726 0.159263
+v -0.053807 0.156022 0.096876 0.752941 0.752941 0.752941
+vn -0.030105 0.988062 0.151088
+v -0.059796 0.151558 0.125677 0.752941 0.752941 0.752941
+vn -0.036009 0.982865 0.180775
+v -0.065487 0.147096 0.153050 0.752941 0.752941 0.752941
+vn -0.055550 0.958706 0.278921
+v -0.070287 0.142086 0.176138 0.752941 0.752941 0.752941
+vn -0.117522 0.798876 0.589903
+v -0.073602 0.135984 0.192087 0.752941 0.752941 0.752941
+vn -0.154014 0.617466 0.771372
+v -0.074840 0.128242 0.198037 0.752941 0.752941 0.752941
+vn -0.128948 0.941971 0.309941
+v -0.052255 0.167134 0.043692 0.752941 0.752941 0.752941
+vn -0.081048 0.977483 0.194828
+v -0.061503 0.161031 0.065426 0.752941 0.752941 0.752941
+vn -0.062266 0.986766 0.149718
+v -0.072466 0.156022 0.091193 0.752941 0.752941 0.752941
+vn -0.059060 0.988099 0.142030
+v -0.084001 0.151558 0.118304 0.752941 0.752941 0.752941
+vn -0.070654 0.982919 0.169937
+v -0.094965 0.147096 0.144071 0.752941 0.752941 0.752941
+vn -0.109012 0.958827 0.262233
+v -0.104211 0.142086 0.165805 0.752941 0.752941 0.752941
+vn -0.230724 0.799303 0.554871
+v -0.110599 0.135984 0.180816 0.752941 0.752941 0.752941
+vn -0.302108 0.618084 0.725743
+v -0.112981 0.128242 0.186418 0.752941 0.752941 0.752941
+vn -0.186698 0.942072 0.278648
+v -0.060307 0.167134 0.039369 0.752941 0.752941 0.752941
+vn -0.117343 0.977528 0.175125
+v -0.073559 0.161031 0.058953 0.752941 0.752941 0.752941
+vn -0.090159 0.986796 0.134557
+v -0.089270 0.156022 0.082172 0.752941 0.752941 0.752941
+vn -0.085518 0.988127 0.127641
+v -0.105802 0.151558 0.106601 0.752941 0.752941 0.752941
+vn -0.102309 0.982960 0.152718
+v -0.121513 0.147096 0.129820 0.752941 0.752941 0.752941
+vn -0.157866 0.958929 0.235657
+v -0.134765 0.142086 0.149403 0.752941 0.752941 0.752941
+vn -0.334206 0.799670 0.498833
+v -0.143919 0.135984 0.162930 0.752941 0.752941 0.752941
+vn -0.437485 0.618578 0.652663
+v -0.147335 0.128242 0.167978 0.752941 0.752941 0.752941
+vn -0.237074 0.942117 0.237091
+v -0.067293 0.167134 0.033628 0.752941 0.752941 0.752941
+vn -0.148998 0.977546 0.149008
+v -0.084021 0.161031 0.050355 0.752941 0.752941 0.752941
+vn -0.114486 0.986805 0.114491
+v -0.103851 0.156022 0.070186 0.752941 0.752941 0.752941
+vn -0.108596 0.988137 0.108594
+v -0.124717 0.151558 0.091052 0.752941 0.752941 0.752941
+vn -0.129921 0.982976 0.129921
+v -0.144549 0.147096 0.110884 0.752941 0.752941 0.752941
+vn -0.200486 0.958961 0.200495
+v -0.161277 0.142086 0.127611 0.752941 0.752941 0.752941
+vn -0.424478 0.799769 0.424486
+v -0.172830 0.135984 0.139164 0.752941 0.752941 0.752941
+vn -0.555531 0.618684 0.555532
+v -0.177141 0.128242 0.143475 0.752941 0.752941 0.752941
+vn -0.278632 0.942077 0.186693
+v -0.073036 0.167134 0.026641 0.752941 0.752941 0.752941
+vn -0.175128 0.977529 0.117335
+v -0.092619 0.161031 0.039894 0.752941 0.752941 0.752941
+vn -0.134560 0.986795 0.090158
+v -0.115838 0.156022 0.055605 0.752941 0.752941 0.752941
+vn -0.127641 0.988126 0.085520
+v -0.140266 0.151558 0.072136 0.752941 0.752941 0.752941
+vn -0.152713 0.982961 0.102305
+v -0.163486 0.147096 0.087847 0.752941 0.752941 0.752941
+vn -0.235661 0.958928 0.157864
+v -0.183070 0.142086 0.101100 0.752941 0.752941 0.752941
+vn -0.498874 0.799633 0.334233
+v -0.196596 0.135984 0.110254 0.752941 0.752941 0.752941
+vn -0.652714 0.618498 0.437520
+v -0.201643 0.128242 0.113669 0.752941 0.752941 0.752941
+vn -0.309950 0.941970 0.128934
+v -0.077358 0.167134 0.018589 0.752941 0.752941 0.752941
+vn -0.194837 0.977482 0.081044
+v -0.099091 0.161031 0.027837 0.752941 0.752941 0.752941
+vn -0.149717 0.986766 0.062263
+v -0.124858 0.156022 0.038800 0.752941 0.752941 0.752941
+vn -0.142030 0.988099 0.059060
+v -0.151970 0.151558 0.050336 0.752941 0.752941 0.752941
+vn -0.169939 0.982918 0.070654
+v -0.177737 0.147096 0.061299 0.752941 0.752941 0.752941
+vn -0.262226 0.958830 0.109007
+v -0.199470 0.142086 0.070545 0.752941 0.752941 0.752941
+vn -0.554865 0.799311 0.230709
+v -0.214482 0.135984 0.076933 0.752941 0.752941 0.752941
+vn -0.725729 0.618106 0.302096
+v -0.220084 0.128242 0.079316 0.752941 0.752941 0.752941
+vn -0.329642 0.941814 0.065746
+v -0.080081 0.167134 0.009651 0.752941 0.752941 0.752941
+vn -0.207248 0.977415 0.041322
+v -0.103169 0.161031 0.014451 0.752941 0.752941 0.752941
+vn -0.159262 0.986726 0.031745
+v -0.130542 0.156022 0.020142 0.752941 0.752941 0.752941
+vn -0.151090 0.988062 0.030104
+v -0.159342 0.151558 0.026130 0.752941 0.752941 0.752941
+vn -0.180771 0.982866 0.036006
+v -0.186715 0.147096 0.031821 0.752941 0.752941 0.752941
+vn -0.278927 0.958705 0.055546
+v -0.209804 0.142086 0.036621 0.752941 0.752941 0.752941
+vn -0.589910 0.798870 0.117529
+v -0.225752 0.135984 0.039937 0.752941 0.752941 0.752941
+vn -0.771382 0.617452 0.154020
+v -0.231702 0.128242 0.041174 0.752941 0.752941 0.752941
+vn -0.336447 0.941702 -0.000003
+v -0.081029 0.167134 0.000001 0.752941 0.752941 0.752941
+vn -0.211538 0.977370 0.000002
+v -0.104588 0.161031 0.000001 0.752941 0.752941 0.752941
+vn -0.162550 0.986700 -0.000000
+v -0.132519 0.156022 0.000001 0.752941 0.752941 0.752941
+vn -0.154195 0.988040 0.000000
+v -0.161908 0.151558 0.000001 0.752941 0.752941 0.752941
+vn -0.184471 0.982838 0.000001
+v -0.189839 0.147096 0.000001 0.752941 0.752941 0.752941
+vn -0.284606 0.958645 0.000003
+v -0.213399 0.142086 0.000001 0.752941 0.752941 0.752941
+vn -0.601648 0.798761 -0.000005
+v -0.229671 0.135984 0.000001 0.752941 0.752941 0.752941
+vn -0.786818 0.617185 -0.000011
+v -0.235744 0.128242 0.000001 0.752941 0.752941 0.752941
+vn -0.329643 0.941815 -0.065732
+v -0.080081 0.167134 -0.009649 0.752941 0.752941 0.752941
+vn -0.207247 0.977416 -0.041323
+v -0.103169 0.161031 -0.014451 0.752941 0.752941 0.752941
+vn -0.159264 0.986726 -0.031741
+v -0.130542 0.156022 -0.020140 0.752941 0.752941 0.752941
+vn -0.151089 0.988062 -0.030104
+v -0.159342 0.151558 -0.026129 0.752941 0.752941 0.752941
+vn -0.180772 0.982866 -0.036008
+v -0.186715 0.147096 -0.031820 0.752941 0.752941 0.752941
+vn -0.278925 0.958705 -0.055550
+v -0.209804 0.142086 -0.036620 0.752941 0.752941 0.752941
+vn -0.589909 0.798872 -0.117514
+v -0.225752 0.135984 -0.039935 0.752941 0.752941 0.752941
+vn -0.771375 0.617466 -0.154000
+v -0.231702 0.128242 -0.041173 0.752941 0.752941 0.752941
+vn -0.309950 0.941971 -0.128926
+v -0.077358 0.167134 -0.018589 0.752941 0.752941 0.752941
+vn -0.194837 0.977482 -0.081042
+v -0.099091 0.161031 -0.027837 0.752941 0.752941 0.752941
+vn -0.149720 0.986766 -0.062264
+v -0.124858 0.156022 -0.038799 0.752941 0.752941 0.752941
+vn -0.142029 0.988099 -0.059058
+v -0.151970 0.151558 -0.050334 0.752941 0.752941 0.752941
+vn -0.169940 0.982919 -0.070649
+v -0.177737 0.147096 -0.061298 0.752941 0.752941 0.752941
+vn -0.262234 0.958828 -0.109008
+v -0.199470 0.142086 -0.070545 0.752941 0.752941 0.752941
+vn -0.554845 0.799327 -0.230703
+v -0.214482 0.135984 -0.076931 0.752941 0.752941 0.752941
+vn -0.725687 0.618152 -0.302104
+v -0.220084 0.128242 -0.079316 0.752941 0.752941 0.752941
+vn -0.278616 0.942080 -0.186703
+v -0.073036 0.167134 -0.026641 0.752941 0.752941 0.752941
+vn -0.175124 0.977529 -0.117340
+v -0.092619 0.161031 -0.039894 0.752941 0.752941 0.752941
+vn -0.134562 0.986795 -0.090156
+v -0.115838 0.156022 -0.055605 0.752941 0.752941 0.752941
+vn -0.127642 0.988127 -0.085519
+v -0.140266 0.151558 -0.072136 0.752941 0.752941 0.752941
+vn -0.152710 0.982961 -0.102308
+v -0.163486 0.147096 -0.087847 0.752941 0.752941 0.752941
+vn -0.235663 0.958927 -0.157867
+v -0.183070 0.142086 -0.101100 0.752941 0.752941 0.752941
+vn -0.498882 0.799632 -0.334223
+v -0.196596 0.135984 -0.110254 0.752941 0.752941 0.752941
+vn -0.652720 0.618506 -0.437501
+v -0.201643 0.128242 -0.113669 0.752941 0.752941 0.752941
+vn -0.237083 0.942112 -0.237099
+v -0.067293 0.167134 -0.033626 0.752941 0.752941 0.752941
+vn -0.149000 0.977546 -0.149006
+v -0.084021 0.161031 -0.050354 0.752941 0.752941 0.752941
+vn -0.114482 0.986806 -0.114490
+v -0.103851 0.156022 -0.070186 0.752941 0.752941 0.752941
+vn -0.108600 0.988136 -0.108598
+v -0.124717 0.151558 -0.091052 0.752941 0.752941 0.752941
+vn -0.129919 0.982976 -0.129922
+v -0.144549 0.147096 -0.110882 0.752941 0.752941 0.752941
+vn -0.200480 0.958965 -0.200485
+v -0.161277 0.142086 -0.127610 0.752941 0.752941 0.752941
+vn -0.424476 0.799774 -0.424477
+v -0.172830 0.135984 -0.139164 0.752941 0.752941 0.752941
+vn -0.555538 0.618676 -0.555533
+v -0.177141 0.128242 -0.143475 0.752941 0.752941 0.752941
+vn -0.186704 0.942075 -0.278631
+v -0.060307 0.167134 -0.039369 0.752941 0.752941 0.752941
+vn -0.117334 0.977529 -0.175127
+v -0.073559 0.161031 -0.058953 0.752941 0.752941 0.752941
+vn -0.090152 0.986796 -0.134561
+v -0.089270 0.156022 -0.082171 0.752941 0.752941 0.752941
+vn -0.085516 0.988127 -0.127644
+v -0.105802 0.151558 -0.106601 0.752941 0.752941 0.752941
+vn -0.102309 0.982960 -0.152717
+v -0.121513 0.147096 -0.129819 0.752941 0.752941 0.752941
+vn -0.157860 0.958930 -0.235654
+v -0.134765 0.142086 -0.149403 0.752941 0.752941 0.752941
+vn -0.334194 0.799668 -0.498844
+v -0.143919 0.135984 -0.162930 0.752941 0.752941 0.752941
+vn -0.437465 0.618577 -0.652676
+v -0.147335 0.128242 -0.167978 0.752941 0.752941 0.752941
+vn -0.128933 0.941967 -0.309958
+v -0.052255 0.167134 -0.043691 0.752941 0.752941 0.752941
+vn -0.081040 0.977482 -0.194836
+v -0.061503 0.161031 -0.065424 0.752941 0.752941 0.752941
+vn -0.062272 0.986766 -0.149716
+v -0.072466 0.156022 -0.091191 0.752941 0.752941 0.752941
+vn -0.059061 0.988099 -0.142030
+v -0.084001 0.151558 -0.118303 0.752941 0.752941 0.752941
+vn -0.070657 0.982919 -0.169937
+v -0.094965 0.147096 -0.144069 0.752941 0.752941 0.752941
+vn -0.109004 0.958833 -0.262218
+v -0.104211 0.142086 -0.165803 0.752941 0.752941 0.752941
+vn -0.230732 0.799289 -0.554888
+v -0.110599 0.135984 -0.180816 0.752941 0.752941 0.752941
+vn -0.302134 0.618038 -0.725772
+v -0.112981 0.128242 -0.186417 0.752941 0.752941 0.752941
+vn -0.065740 0.941812 -0.329649
+v -0.043316 0.167134 -0.046414 0.752941 0.752941 0.752941
+vn -0.041317 0.977416 -0.207245
+v -0.048116 0.161031 -0.069502 0.752941 0.752941 0.752941
+vn -0.031741 0.986727 -0.159257
+v -0.053807 0.156022 -0.096877 0.752941 0.752941 0.752941
+vn -0.030106 0.988062 -0.151087
+v -0.059796 0.151558 -0.125677 0.752941 0.752941 0.752941
+vn -0.036015 0.982865 -0.180775
+v -0.065487 0.147096 -0.153050 0.752941 0.752941 0.752941
+vn -0.055558 0.958701 -0.278937
+v -0.070287 0.142086 -0.176138 0.752941 0.752941 0.752941
+vn -0.117505 0.798915 -0.589854
+v -0.073602 0.135984 -0.192085 0.752941 0.752941 0.752941
+vn -0.153980 0.617570 -0.771296
+v -0.074840 0.128242 -0.198037 0.752941 0.752941 0.752941
+vn -0.000003 0.941698 -0.336460
+v -0.033666 0.167134 -0.047362 0.752941 0.752941 0.752941
+vn -0.000003 0.977370 -0.211535
+v -0.033666 0.161031 -0.070921 0.752941 0.752941 0.752941
+vn -0.000000 0.986700 -0.162550
+v -0.033666 0.156022 -0.098852 0.752941 0.752941 0.752941
+vn 0.000002 0.988041 -0.154191
+v -0.033666 0.151558 -0.128241 0.752941 0.752941 0.752941
+vn 0.000001 0.982838 -0.184472
+v -0.033666 0.147096 -0.156174 0.752941 0.752941 0.752941
+vn 0.000001 0.958646 -0.284602
+v -0.033666 0.142086 -0.179733 0.752941 0.752941 0.752941
+vn -0.000010 0.798719 -0.601705
+v -0.033666 0.135984 -0.196006 0.752941 0.752941 0.752941
+vn -0.000019 0.617079 -0.786901
+v -0.033666 0.128242 -0.202077 0.752941 0.752941 0.752941
+vn 0.065741 0.941812 -0.329649
+v -0.024016 0.167134 -0.046414 0.752941 0.752941 0.752941
+vn 0.041323 0.977416 -0.207244
+v -0.019216 0.161031 -0.069502 0.752941 0.752941 0.752941
+vn 0.031742 0.986727 -0.159257
+v -0.013525 0.156022 -0.096877 0.752941 0.752941 0.752941
+vn 0.030104 0.988062 -0.151090
+v -0.007537 0.151558 -0.125677 0.752941 0.752941 0.752941
+vn 0.036013 0.982865 -0.180773
+v -0.001846 0.147096 -0.153050 0.752941 0.752941 0.752941
+vn 0.055552 0.958702 -0.278935
+v 0.002954 0.142086 -0.176138 0.752941 0.752941 0.752941
+vn 0.117527 0.798911 -0.589855
+v 0.006270 0.135984 -0.192085 0.752941 0.752941 0.752941
+vn 0.154010 0.617558 -0.771299
+v 0.007507 0.128242 -0.198037 0.752941 0.752941 0.752941
+vn 0.128924 0.941970 -0.309953
+v -0.015076 0.167134 -0.043691 0.752941 0.752941 0.752941
+vn 0.081037 0.977481 -0.194843
+v -0.005829 0.161031 -0.065424 0.752941 0.752941 0.752941
+vn 0.062269 0.986767 -0.149714
+v 0.005133 0.156022 -0.091191 0.752941 0.752941 0.752941
+vn 0.059060 0.988099 -0.142032
+v 0.016669 0.151558 -0.118303 0.752941 0.752941 0.752941
+vn 0.070653 0.982919 -0.169936
+v 0.027632 0.147096 -0.144069 0.752941 0.752941 0.752941
+vn 0.109011 0.958831 -0.262220
+v 0.036880 0.142086 -0.165803 0.752941 0.752941 0.752941
+vn 0.230704 0.799302 -0.554880
+v 0.043266 0.135984 -0.180816 0.752941 0.752941 0.752941
+vn 0.302098 0.618084 -0.725747
+v 0.045650 0.128242 -0.186417 0.752941 0.752941 0.752941
+vn 0.186707 0.942080 -0.278616
+v -0.007024 0.167134 -0.039369 0.752941 0.752941 0.752941
+vn 0.117337 0.977529 -0.175125
+v 0.006228 0.161031 -0.058953 0.752941 0.752941 0.752941
+vn 0.090150 0.986796 -0.134563
+v 0.021939 0.156022 -0.082171 0.752941 0.752941 0.752941
+vn 0.085516 0.988127 -0.127644
+v 0.038471 0.151558 -0.106601 0.752941 0.752941 0.752941
+vn 0.102308 0.982960 -0.152718
+v 0.054182 0.147096 -0.129819 0.752941 0.752941 0.752941
+vn 0.157863 0.958928 -0.235660
+v 0.067434 0.142086 -0.149403 0.752941 0.752941 0.752941
+vn 0.334189 0.799681 -0.498827
+v 0.076587 0.135984 -0.162930 0.752941 0.752941 0.752941
+vn 0.437469 0.618611 -0.652642
+v 0.080004 0.128242 -0.167978 0.752941 0.752941 0.752941
+vn 0.237094 0.942110 -0.237099
+v -0.000039 0.167134 -0.033626 0.752941 0.752941 0.752941
+vn 0.149003 0.977545 -0.149007
+v 0.016688 0.161031 -0.050354 0.752941 0.752941 0.752941
+vn 0.114485 0.986806 -0.114484
+v 0.036520 0.156022 -0.070186 0.752941 0.752941 0.752941
+vn 0.108599 0.988136 -0.108599
+v 0.057386 0.151558 -0.091052 0.752941 0.752941 0.752941
+vn 0.129925 0.982975 -0.129922
+v 0.077217 0.147096 -0.110882 0.752941 0.752941 0.752941
+vn 0.200476 0.958968 -0.200475
+v 0.093944 0.142086 -0.127610 0.752941 0.752941 0.752941
+vn 0.424474 0.799777 -0.424474
+v 0.105499 0.135984 -0.139164 0.752941 0.752941 0.752941
+vn 0.555531 0.618687 -0.555528
+v 0.109810 0.128242 -0.143475 0.752941 0.752941 0.752941
+vn 0.278623 0.942081 -0.186688
+v 0.005704 0.167134 -0.026641 0.752941 0.752941 0.752941
+vn 0.175119 0.977529 -0.117343
+v 0.025288 0.161031 -0.039894 0.752941 0.752941 0.752941
+vn 0.134562 0.986795 -0.090155
+v 0.048505 0.156022 -0.055605 0.752941 0.752941 0.752941
+vn 0.127645 0.988127 -0.085514
+v 0.072935 0.151558 -0.072136 0.752941 0.752941 0.752941
+vn 0.152716 0.982960 -0.102308
+v 0.096153 0.147096 -0.087847 0.752941 0.752941 0.752941
+vn 0.235656 0.958929 -0.157862
+v 0.115737 0.142086 -0.101100 0.752941 0.752941 0.752941
+vn 0.498874 0.799640 -0.334216
+v 0.129264 0.135984 -0.110254 0.752941 0.752941 0.752941
+vn 0.652724 0.618498 -0.437506
+v 0.134311 0.128242 -0.113669 0.752941 0.752941 0.752941
+vn 0.309959 0.941969 -0.128918
+v 0.010025 0.167134 -0.018589 0.752941 0.752941 0.752941
+vn 0.194840 0.977482 -0.081036
+v 0.031759 0.161031 -0.027837 0.752941 0.752941 0.752941
+vn 0.149720 0.986766 -0.062263
+v 0.057526 0.156022 -0.038799 0.752941 0.752941 0.752941
+vn 0.142030 0.988099 -0.059059
+v 0.084637 0.151558 -0.050334 0.752941 0.752941 0.752941
+vn 0.169934 0.982919 -0.070654
+v 0.110404 0.147096 -0.061298 0.752941 0.752941 0.752941
+vn 0.262236 0.958826 -0.109019
+v 0.132138 0.142086 -0.070545 0.752941 0.752941 0.752941
+vn 0.554848 0.799327 -0.230696
+v 0.147149 0.135984 -0.076931 0.752941 0.752941 0.752941
+vn 0.725695 0.618149 -0.302090
+v 0.152751 0.128242 -0.079316 0.752941 0.752941 0.752941
+vn 0.329656 0.941810 -0.065734
+v 0.012748 0.167134 -0.009649 0.752941 0.752941 0.752941
+vn 0.207244 0.977416 -0.041315
+v 0.035837 0.161031 -0.014451 0.752941 0.752941 0.752941
+vn 0.159263 0.986726 -0.031741
+v 0.063209 0.156022 -0.020140 0.752941 0.752941 0.752941
+vn 0.151085 0.988062 -0.030104
+v 0.092011 0.151558 -0.026129 0.752941 0.752941 0.752941
+vn 0.180770 0.982866 -0.036011
+v 0.119384 0.147096 -0.031820 0.752941 0.752941 0.752941
+vn 0.278935 0.958702 -0.055554
+v 0.142473 0.142086 -0.036620 0.752941 0.752941 0.752941
+vn 0.589885 0.798889 -0.117527
+v 0.158420 0.135984 -0.039935 0.752941 0.752941 0.752941
+vn 0.771327 0.617523 -0.154014
+v 0.164371 0.128242 -0.041173 0.752941 0.752941 0.752941
+# 2081 vertices, 0 vertices normals
+
+f 1//1 2//2 3//3
+f 1//1 3//3 4//4
+f 4//4 3//3 5//5
+f 4//4 5//5 6//6
+f 6//6 5//5 7//7
+f 6//6 7//7 8//8
+f 8//8 7//7 9//9
+f 8//8 9//9 10//10
+f 10//10 9//9 11//11
+f 10//10 11//11 12//12
+f 12//12 11//11 13//13
+f 12//12 13//13 14//14
+f 14//14 13//13 15//15
+f 14//14 15//15 16//16
+f 16//16 15//15 17//17
+f 16//16 17//17 18//18
+f 2//2 19//19 20//20
+f 2//2 20//20 3//3
+f 3//3 20//20 21//21
+f 3//3 21//21 5//5
+f 5//5 21//21 22//22
+f 5//5 22//22 7//7
+f 7//7 22//22 23//23
+f 7//7 23//23 9//9
+f 9//9 23//23 24//24
+f 9//9 24//24 11//11
+f 11//11 24//24 25//25
+f 11//11 25//25 13//13
+f 13//13 25//25 26//26
+f 13//13 26//26 15//15
+f 15//15 26//26 27//27
+f 15//15 27//27 17//17
+f 19//19 28//28 29//29
+f 19//19 29//29 20//20
+f 20//20 29//29 30//30
+f 20//20 30//30 21//21
+f 21//21 30//30 31//31
+f 21//21 31//31 22//22
+f 22//22 31//31 32//32
+f 22//22 32//32 23//23
+f 23//23 32//32 33//33
+f 23//23 33//33 24//24
+f 24//24 33//33 34//34
+f 24//24 34//34 25//25
+f 25//25 34//34 35//35
+f 25//25 35//35 26//26
+f 26//26 35//35 36//36
+f 26//26 36//36 27//27
+f 28//28 37//37 38//38
+f 28//28 38//38 29//29
+f 29//29 38//38 39//39
+f 29//29 39//39 30//30
+f 30//30 39//39 40//40
+f 30//30 40//40 31//31
+f 31//31 40//40 41//41
+f 31//31 41//41 32//32
+f 32//32 41//41 42//42
+f 32//32 42//42 33//33
+f 33//33 42//42 43//43
+f 33//33 43//43 34//34
+f 34//34 43//43 44//44
+f 34//34 44//44 35//35
+f 35//35 44//44 45//45
+f 35//35 45//45 36//36
+f 37//37 46//46 47//47
+f 37//37 47//47 38//38
+f 38//38 47//47 48//48
+f 38//38 48//48 39//39
+f 39//39 48//48 49//49
+f 39//39 49//49 40//40
+f 40//40 49//49 50//50
+f 40//40 50//50 41//41
+f 41//41 50//50 51//51
+f 41//41 51//51 42//42
+f 42//42 51//51 52//52
+f 42//42 52//52 43//43
+f 43//43 52//52 53//53
+f 43//43 53//53 44//44
+f 44//44 53//53 54//54
+f 44//44 54//54 45//45
+f 46//46 55//55 56//56
+f 46//46 56//56 47//47
+f 47//47 56//56 57//57
+f 47//47 57//57 48//48
+f 48//48 57//57 58//58
+f 48//48 58//58 49//49
+f 49//49 58//58 59//59
+f 49//49 59//59 50//50
+f 50//50 59//59 60//60
+f 50//50 60//60 51//51
+f 51//51 60//60 61//61
+f 51//51 61//61 52//52
+f 52//52 61//61 62//62
+f 52//52 62//62 53//53
+f 53//53 62//62 63//63
+f 53//53 63//63 54//54
+f 55//55 64//64 65//65
+f 55//55 65//65 56//56
+f 56//56 65//65 66//66
+f 56//56 66//66 57//57
+f 57//57 66//66 67//67
+f 57//57 67//67 58//58
+f 58//58 67//67 68//68
+f 58//58 68//68 59//59
+f 59//59 68//68 69//69
+f 59//59 69//69 60//60
+f 60//60 69//69 70//70
+f 60//60 70//70 61//61
+f 61//61 70//70 71//71
+f 61//61 71//71 62//62
+f 62//62 71//71 72//72
+f 62//62 72//72 63//63
+f 64//64 73//73 74//74
+f 64//64 74//74 65//65
+f 65//65 74//74 75//75
+f 65//65 75//75 66//66
+f 66//66 75//75 76//76
+f 66//66 76//76 67//67
+f 67//67 76//76 77//77
+f 67//67 77//77 68//68
+f 68//68 77//77 78//78
+f 68//68 78//78 69//69
+f 69//69 78//78 79//79
+f 69//69 79//79 70//70
+f 70//70 79//79 80//80
+f 70//70 80//80 71//71
+f 71//71 80//80 81//81
+f 71//71 81//81 72//72
+f 73//73 82//82 83//83
+f 73//73 83//83 74//74
+f 74//74 83//83 84//84
+f 74//74 84//84 75//75
+f 75//75 84//84 85//85
+f 75//75 85//85 76//76
+f 76//76 85//85 86//86
+f 76//76 86//86 77//77
+f 77//77 86//86 87//87
+f 77//77 87//87 78//78
+f 78//78 87//87 88//88
+f 78//78 88//88 79//79
+f 79//79 88//88 89//89
+f 79//79 89//89 80//80
+f 80//80 89//89 90//90
+f 80//80 90//90 81//81
+f 82//82 91//91 92//92
+f 82//82 92//92 83//83
+f 83//83 92//92 93//93
+f 83//83 93//93 84//84
+f 84//84 93//93 94//94
+f 84//84 94//94 85//85
+f 85//85 94//94 95//95
+f 85//85 95//95 86//86
+f 86//86 95//95 96//96
+f 86//86 96//96 87//87
+f 87//87 96//96 97//97
+f 87//87 97//97 88//88
+f 88//88 97//97 98//98
+f 88//88 98//98 89//89
+f 89//89 98//98 99//99
+f 89//89 99//99 90//90
+f 91//91 100//100 101//101
+f 91//91 101//101 92//92
+f 92//92 101//101 102//102
+f 92//92 102//102 93//93
+f 93//93 102//102 103//103
+f 93//93 103//103 94//94
+f 94//94 103//103 104//104
+f 94//94 104//104 95//95
+f 95//95 104//104 105//105
+f 95//95 105//105 96//96
+f 96//96 105//105 106//106
+f 96//96 106//106 97//97
+f 97//97 106//106 107//107
+f 97//97 107//107 98//98
+f 98//98 107//107 108//108
+f 98//98 108//108 99//99
+f 100//100 109//109 110//110
+f 100//100 110//110 101//101
+f 101//101 110//110 111//111
+f 101//101 111//111 102//102
+f 102//102 111//111 112//112
+f 102//102 112//112 103//103
+f 103//103 112//112 113//113
+f 103//103 113//113 104//104
+f 104//104 113//113 114//114
+f 104//104 114//114 105//105
+f 105//105 114//114 115//115
+f 105//105 115//115 106//106
+f 106//106 115//115 116//116
+f 106//106 116//116 107//107
+f 107//107 116//116 117//117
+f 107//107 117//117 108//108
+f 109//109 118//118 119//119
+f 109//109 119//119 110//110
+f 110//110 119//119 120//120
+f 110//110 120//120 111//111
+f 111//111 120//120 121//121
+f 111//111 121//121 112//112
+f 112//112 121//121 122//122
+f 112//112 122//122 113//113
+f 113//113 122//122 123//123
+f 113//113 123//123 114//114
+f 114//114 123//123 124//124
+f 114//114 124//124 115//115
+f 115//115 124//124 125//125
+f 115//115 125//125 116//116
+f 116//116 125//125 126//126
+f 116//116 126//126 117//117
+f 118//118 127//127 128//128
+f 118//118 128//128 119//119
+f 119//119 128//128 129//129
+f 119//119 129//129 120//120
+f 120//120 129//129 130//130
+f 120//120 130//130 121//121
+f 121//121 130//130 131//131
+f 121//121 131//131 122//122
+f 122//122 131//131 132//132
+f 122//122 132//132 123//123
+f 123//123 132//132 133//133
+f 123//123 133//133 124//124
+f 124//124 133//133 134//134
+f 124//124 134//134 125//125
+f 125//125 134//134 135//135
+f 125//125 135//135 126//126
+f 127//127 136//136 137//137
+f 127//127 137//137 128//128
+f 128//128 137//137 138//138
+f 128//128 138//138 129//129
+f 129//129 138//138 139//139
+f 129//129 139//139 130//130
+f 130//130 139//139 140//140
+f 130//130 140//140 131//131
+f 131//131 140//140 141//141
+f 131//131 141//141 132//132
+f 132//132 141//141 142//142
+f 132//132 142//142 133//133
+f 133//133 142//142 143//143
+f 133//133 143//143 134//134
+f 134//134 143//143 144//144
+f 134//134 144//144 135//135
+f 136//136 145//145 146//146
+f 136//136 146//146 137//137
+f 137//137 146//146 147//147
+f 137//137 147//147 138//138
+f 138//138 147//147 148//148
+f 138//138 148//148 139//139
+f 139//139 148//148 149//149
+f 139//139 149//149 140//140
+f 140//140 149//149 150//150
+f 140//140 150//150 141//141
+f 141//141 150//150 151//151
+f 141//141 151//151 142//142
+f 142//142 151//151 152//152
+f 142//142 152//152 143//143
+f 143//143 152//152 153//153
+f 143//143 153//153 144//144
+f 145//145 154//154 155//155
+f 145//145 155//155 146//146
+f 146//146 155//155 156//156
+f 146//146 156//156 147//147
+f 147//147 156//156 157//157
+f 147//147 157//157 148//148
+f 148//148 157//157 158//158
+f 148//148 158//158 149//149
+f 149//149 158//158 159//159
+f 149//149 159//159 150//150
+f 150//150 159//159 160//160
+f 150//150 160//160 151//151
+f 151//151 160//160 161//161
+f 151//151 161//161 152//152
+f 152//152 161//161 162//162
+f 152//152 162//162 153//153
+f 154//154 163//163 164//164
+f 154//154 164//164 155//155
+f 155//155 164//164 165//165
+f 155//155 165//165 156//156
+f 156//156 165//165 166//166
+f 156//156 166//166 157//157
+f 157//157 166//166 167//167
+f 157//157 167//167 158//158
+f 158//158 167//167 168//168
+f 158//158 168//168 159//159
+f 159//159 168//168 169//169
+f 159//159 169//169 160//160
+f 160//160 169//169 170//170
+f 160//160 170//170 161//161
+f 161//161 170//170 171//171
+f 161//161 171//171 162//162
+f 163//163 172//172 173//173
+f 163//163 173//173 164//164
+f 164//164 173//173 174//174
+f 164//164 174//174 165//165
+f 165//165 174//174 175//175
+f 165//165 175//175 166//166
+f 166//166 175//175 176//176
+f 166//166 176//176 167//167
+f 167//167 176//176 177//177
+f 167//167 177//177 168//168
+f 168//168 177//177 178//178
+f 168//168 178//178 169//169
+f 169//169 178//178 179//179
+f 169//169 179//179 170//170
+f 170//170 179//179 180//180
+f 170//170 180//180 171//171
+f 172//172 181//181 182//182
+f 172//172 182//182 173//173
+f 173//173 182//182 183//183
+f 173//173 183//183 174//174
+f 174//174 183//183 184//184
+f 174//174 184//184 175//175
+f 175//175 184//184 185//185
+f 175//175 185//185 176//176
+f 176//176 185//185 186//186
+f 176//176 186//186 177//177
+f 177//177 186//186 187//187
+f 177//177 187//187 178//178
+f 178//178 187//187 188//188
+f 178//178 188//188 179//179
+f 179//179 188//188 189//189
+f 179//179 189//189 180//180
+f 181//181 190//190 191//191
+f 181//181 191//191 182//182
+f 182//182 191//191 192//192
+f 182//182 192//192 183//183
+f 183//183 192//192 193//193
+f 183//183 193//193 184//184
+f 184//184 193//193 194//194
+f 184//184 194//194 185//185
+f 185//185 194//194 195//195
+f 185//185 195//195 186//186
+f 186//186 195//195 196//196
+f 186//186 196//196 187//187
+f 187//187 196//196 197//197
+f 187//187 197//197 188//188
+f 188//188 197//197 198//198
+f 188//188 198//198 189//189
+f 190//190 199//199 200//200
+f 190//190 200//200 191//191
+f 191//191 200//200 201//201
+f 191//191 201//201 192//192
+f 192//192 201//201 202//202
+f 192//192 202//202 193//193
+f 193//193 202//202 203//203
+f 193//193 203//203 194//194
+f 194//194 203//203 204//204
+f 194//194 204//204 195//195
+f 195//195 204//204 205//205
+f 195//195 205//205 196//196
+f 196//196 205//205 206//206
+f 196//196 206//206 197//197
+f 197//197 206//206 207//207
+f 197//197 207//207 198//198
+f 199//199 208//208 209//209
+f 199//199 209//209 200//200
+f 200//200 209//209 210//210
+f 200//200 210//210 201//201
+f 201//201 210//210 211//211
+f 201//201 211//211 202//202
+f 202//202 211//211 212//212
+f 202//202 212//212 203//203
+f 203//203 212//212 213//213
+f 203//203 213//213 204//204
+f 204//204 213//213 214//214
+f 204//204 214//214 205//205
+f 205//205 214//214 215//215
+f 205//205 215//215 206//206
+f 206//206 215//215 216//216
+f 206//206 216//216 207//207
+f 208//208 217//217 218//218
+f 208//208 218//218 209//209
+f 209//209 218//218 219//219
+f 209//209 219//219 210//210
+f 210//210 219//219 220//220
+f 210//210 220//220 211//211
+f 211//211 220//220 221//221
+f 211//211 221//221 212//212
+f 212//212 221//221 222//222
+f 212//212 222//222 213//213
+f 213//213 222//222 223//223
+f 213//213 223//223 214//214
+f 214//214 223//223 224//224
+f 214//214 224//224 215//215
+f 215//215 224//224 225//225
+f 215//215 225//225 216//216
+f 217//217 226//226 227//227
+f 217//217 227//227 218//218
+f 218//218 227//227 228//228
+f 218//218 228//228 219//219
+f 219//219 228//228 229//229
+f 219//219 229//229 220//220
+f 220//220 229//229 230//230
+f 220//220 230//230 221//221
+f 221//221 230//230 231//231
+f 221//221 231//231 222//222
+f 222//222 231//231 232//232
+f 222//222 232//232 223//223
+f 223//223 232//232 233//233
+f 223//223 233//233 224//224
+f 224//224 233//233 234//234
+f 224//224 234//234 225//225
+f 226//226 235//235 236//236
+f 226//226 236//236 227//227
+f 227//227 236//236 237//237
+f 227//227 237//237 228//228
+f 228//228 237//237 238//238
+f 228//228 238//238 229//229
+f 229//229 238//238 239//239
+f 229//229 239//239 230//230
+f 230//230 239//239 240//240
+f 230//230 240//240 231//231
+f 231//231 240//240 241//241
+f 231//231 241//241 232//232
+f 232//232 241//241 242//242
+f 232//232 242//242 233//233
+f 233//233 242//242 243//243
+f 233//233 243//243 234//234
+f 235//235 244//244 245//245
+f 235//235 245//245 236//236
+f 236//236 245//245 246//246
+f 236//236 246//246 237//237
+f 237//237 246//246 247//247
+f 237//237 247//247 238//238
+f 238//238 247//247 248//248
+f 238//238 248//248 239//239
+f 239//239 248//248 249//249
+f 239//239 249//249 240//240
+f 240//240 249//249 250//250
+f 240//240 250//250 241//241
+f 241//241 250//250 251//251
+f 241//241 251//251 242//242
+f 242//242 251//251 252//252
+f 242//242 252//252 243//243
+f 244//244 253//253 254//254
+f 244//244 254//254 245//245
+f 245//245 254//254 255//255
+f 245//245 255//255 246//246
+f 246//246 255//255 256//256
+f 246//246 256//256 247//247
+f 247//247 256//256 257//257
+f 247//247 257//257 248//248
+f 248//248 257//257 258//258
+f 248//248 258//258 249//249
+f 249//249 258//258 259//259
+f 249//249 259//259 250//250
+f 250//250 259//259 260//260
+f 250//250 260//260 251//251
+f 251//251 260//260 261//261
+f 251//251 261//261 252//252
+f 253//253 262//262 263//263
+f 253//253 263//263 254//254
+f 254//254 263//263 264//264
+f 254//254 264//264 255//255
+f 255//255 264//264 265//265
+f 255//255 265//265 256//256
+f 256//256 265//265 266//266
+f 256//256 266//266 257//257
+f 257//257 266//266 267//267
+f 257//257 267//267 258//258
+f 258//258 267//267 268//268
+f 258//258 268//268 259//259
+f 259//259 268//268 269//269
+f 259//259 269//269 260//260
+f 260//260 269//269 270//270
+f 260//260 270//270 261//261
+f 262//262 271//271 272//272
+f 262//262 272//272 263//263
+f 263//263 272//272 273//273
+f 263//263 273//273 264//264
+f 264//264 273//273 274//274
+f 264//264 274//274 265//265
+f 265//265 274//274 275//275
+f 265//265 275//275 266//266
+f 266//266 275//275 276//276
+f 266//266 276//276 267//267
+f 267//267 276//276 277//277
+f 267//267 277//277 268//268
+f 268//268 277//277 278//278
+f 268//268 278//278 269//269
+f 269//269 278//278 279//279
+f 269//269 279//279 270//270
+f 271//271 280//280 281//281
+f 271//271 281//281 272//272
+f 272//272 281//281 282//282
+f 272//272 282//282 273//273
+f 273//273 282//282 283//283
+f 273//273 283//283 274//274
+f 274//274 283//283 284//284
+f 274//274 284//284 275//275
+f 275//275 284//284 285//285
+f 275//275 285//285 276//276
+f 276//276 285//285 286//286
+f 276//276 286//286 277//277
+f 277//277 286//286 287//287
+f 277//277 287//287 278//278
+f 278//278 287//287 288//288
+f 278//278 288//288 279//279
+f 280//280 1//1 4//4
+f 280//280 4//4 281//281
+f 281//281 4//4 6//6
+f 281//281 6//6 282//282
+f 282//282 6//6 8//8
+f 282//282 8//8 283//283
+f 283//283 8//8 10//10
+f 283//283 10//10 284//284
+f 284//284 10//10 12//12
+f 284//284 12//12 285//285
+f 285//285 12//12 14//14
+f 285//285 14//14 286//286
+f 286//286 14//14 16//16
+f 286//286 16//16 287//287
+f 287//287 16//16 18//18
+f 287//287 18//18 288//288
+f 18//18 17//17 289//289
+f 18//18 289//289 290//290
+f 290//290 289//289 291//291
+f 290//290 291//291 292//292
+f 292//292 291//291 293//293
+f 292//292 293//293 294//294
+f 294//294 293//293 295//295
+f 294//294 295//295 296//296
+f 296//296 295//295 297//297
+f 296//296 297//297 298//298
+f 298//298 297//297 299//299
+f 298//298 299//299 300//300
+f 300//300 299//299 301//301
+f 300//300 301//301 302//302
+f 302//302 301//301 303//303
+f 302//302 303//303 304//304
+f 17//17 27//27 305//305
+f 17//17 305//305 289//289
+f 289//289 305//305 306//306
+f 289//289 306//306 291//291
+f 291//291 306//306 307//307
+f 291//291 307//307 293//293
+f 293//293 307//307 308//308
+f 293//293 308//308 295//295
+f 295//295 308//308 309//309
+f 295//295 309//309 297//297
+f 297//297 309//309 310//310
+f 297//297 310//310 299//299
+f 299//299 310//310 311//311
+f 299//299 311//311 301//301
+f 301//301 311//311 312//312
+f 301//301 312//312 303//303
+f 27//27 36//36 313//313
+f 27//27 313//313 305//305
+f 305//305 313//313 314//314
+f 305//305 314//314 306//306
+f 306//306 314//314 315//315
+f 306//306 315//315 307//307
+f 307//307 315//315 316//316
+f 307//307 316//316 308//308
+f 308//308 316//316 317//317
+f 308//308 317//317 309//309
+f 309//309 317//317 318//318
+f 309//309 318//318 310//310
+f 310//310 318//318 319//319
+f 310//310 319//319 311//311
+f 311//311 319//319 320//320
+f 311//311 320//320 312//312
+f 36//36 45//45 321//321
+f 36//36 321//321 313//313
+f 313//313 321//321 322//322
+f 313//313 322//322 314//314
+f 314//314 322//322 323//323
+f 314//314 323//323 315//315
+f 315//315 323//323 324//324
+f 315//315 324//324 316//316
+f 316//316 324//324 325//325
+f 316//316 325//325 317//317
+f 317//317 325//325 326//326
+f 317//317 326//326 318//318
+f 318//318 326//326 327//327
+f 318//318 327//327 319//319
+f 319//319 327//327 328//328
+f 319//319 328//328 320//320
+f 45//45 54//54 329//329
+f 45//45 329//329 321//321
+f 321//321 329//329 330//330
+f 321//321 330//330 322//322
+f 322//322 330//330 331//331
+f 322//322 331//331 323//323
+f 323//323 331//331 332//332
+f 323//323 332//332 324//324
+f 324//324 332//332 333//333
+f 324//324 333//333 325//325
+f 325//325 333//333 334//334
+f 325//325 334//334 326//326
+f 326//326 334//334 335//335
+f 326//326 335//335 327//327
+f 327//327 335//335 336//336
+f 327//327 336//336 328//328
+f 54//54 63//63 337//337
+f 54//54 337//337 329//329
+f 329//329 337//337 338//338
+f 329//329 338//338 330//330
+f 330//330 338//338 339//339
+f 330//330 339//339 331//331
+f 331//331 339//339 340//340
+f 331//331 340//340 332//332
+f 332//332 340//340 341//341
+f 332//332 341//341 333//333
+f 333//333 341//341 342//342
+f 333//333 342//342 334//334
+f 334//334 342//342 343//343
+f 334//334 343//343 335//335
+f 335//335 343//343 344//344
+f 335//335 344//344 336//336
+f 63//63 72//72 345//345
+f 63//63 345//345 337//337
+f 337//337 345//345 346//346
+f 337//337 346//346 338//338
+f 338//338 346//346 347//347
+f 338//338 347//347 339//339
+f 339//339 347//347 348//348
+f 339//339 348//348 340//340
+f 340//340 348//348 349//349
+f 340//340 349//349 341//341
+f 341//341 349//349 350//350
+f 341//341 350//350 342//342
+f 342//342 350//350 351//351
+f 342//342 351//351 343//343
+f 343//343 351//351 352//352
+f 343//343 352//352 344//344
+f 72//72 81//81 353//353
+f 72//72 353//353 345//345
+f 345//345 353//353 354//354
+f 345//345 354//354 346//346
+f 346//346 354//354 355//355
+f 346//346 355//355 347//347
+f 347//347 355//355 356//356
+f 347//347 356//356 348//348
+f 348//348 356//356 357//357
+f 348//348 357//357 349//349
+f 349//349 357//357 358//358
+f 349//349 358//358 350//350
+f 350//350 358//358 359//359
+f 350//350 359//359 351//351
+f 351//351 359//359 360//360
+f 351//351 360//360 352//352
+f 81//81 90//90 361//361
+f 81//81 361//361 353//353
+f 353//353 361//361 362//362
+f 353//353 362//362 354//354
+f 354//354 362//362 363//363
+f 354//354 363//363 355//355
+f 355//355 363//363 364//364
+f 355//355 364//364 356//356
+f 356//356 364//364 365//365
+f 356//356 365//365 357//357
+f 357//357 365//365 366//366
+f 357//357 366//366 358//358
+f 358//358 366//366 367//367
+f 358//358 367//367 359//359
+f 359//359 367//367 368//368
+f 359//359 368//368 360//360
+f 90//90 99//99 369//369
+f 90//90 369//369 361//361
+f 361//361 369//369 370//370
+f 361//361 370//370 362//362
+f 362//362 370//370 371//371
+f 362//362 371//371 363//363
+f 363//363 371//371 372//372
+f 363//363 372//372 364//364
+f 364//364 372//372 373//373
+f 364//364 373//373 365//365
+f 365//365 373//373 374//374
+f 365//365 374//374 366//366
+f 366//366 374//374 375//375
+f 366//366 375//375 367//367
+f 367//367 375//375 376//376
+f 367//367 376//376 368//368
+f 99//99 108//108 377//377
+f 99//99 377//377 369//369
+f 369//369 377//377 378//378
+f 369//369 378//378 370//370
+f 370//370 378//378 379//379
+f 370//370 379//379 371//371
+f 371//371 379//379 380//380
+f 371//371 380//380 372//372
+f 372//372 380//380 381//381
+f 372//372 381//381 373//373
+f 373//373 381//381 382//382
+f 373//373 382//382 374//374
+f 374//374 382//382 383//383
+f 374//374 383//383 375//375
+f 375//375 383//383 384//384
+f 375//375 384//384 376//376
+f 108//108 117//117 385//385
+f 108//108 385//385 377//377
+f 377//377 385//385 386//386
+f 377//377 386//386 378//378
+f 378//378 386//386 387//387
+f 378//378 387//387 379//379
+f 379//379 387//387 388//388
+f 379//379 388//388 380//380
+f 380//380 388//388 389//389
+f 380//380 389//389 381//381
+f 381//381 389//389 390//390
+f 381//381 390//390 382//382
+f 382//382 390//390 391//391
+f 382//382 391//391 383//383
+f 383//383 391//391 392//392
+f 383//383 392//392 384//384
+f 117//117 126//126 393//393
+f 117//117 393//393 385//385
+f 385//385 393//393 394//394
+f 385//385 394//394 386//386
+f 386//386 394//394 395//395
+f 386//386 395//395 387//387
+f 387//387 395//395 396//396
+f 387//387 396//396 388//388
+f 388//388 396//396 397//397
+f 388//388 397//397 389//389
+f 389//389 397//397 398//398
+f 389//389 398//398 390//390
+f 390//390 398//398 399//399
+f 390//390 399//399 391//391
+f 391//391 399//399 400//400
+f 391//391 400//400 392//392
+f 126//126 135//135 401//401
+f 126//126 401//401 393//393
+f 393//393 401//401 402//402
+f 393//393 402//402 394//394
+f 394//394 402//402 403//403
+f 394//394 403//403 395//395
+f 395//395 403//403 404//404
+f 395//395 404//404 396//396
+f 396//396 404//404 405//405
+f 396//396 405//405 397//397
+f 397//397 405//405 406//406
+f 397//397 406//406 398//398
+f 398//398 406//406 407//407
+f 398//398 407//407 399//399
+f 399//399 407//407 408//408
+f 399//399 408//408 400//400
+f 135//135 144//144 409//409
+f 135//135 409//409 401//401
+f 401//401 409//409 410//410
+f 401//401 410//410 402//402
+f 402//402 410//410 411//411
+f 402//402 411//411 403//403
+f 403//403 411//411 412//412
+f 403//403 412//412 404//404
+f 404//404 412//412 413//413
+f 404//404 413//413 405//405
+f 405//405 413//413 414//414
+f 405//405 414//414 406//406
+f 406//406 414//414 415//415
+f 406//406 415//415 407//407
+f 407//407 415//415 416//416
+f 407//407 416//416 408//408
+f 144//144 153//153 417//417
+f 144//144 417//417 409//409
+f 409//409 417//417 418//418
+f 409//409 418//418 410//410
+f 410//410 418//418 419//419
+f 410//410 419//419 411//411
+f 411//411 419//419 420//420
+f 411//411 420//420 412//412
+f 412//412 420//420 421//421
+f 412//412 421//421 413//413
+f 413//413 421//421 422//422
+f 413//413 422//422 414//414
+f 414//414 422//422 423//423
+f 414//414 423//423 415//415
+f 415//415 423//423 424//424
+f 415//415 424//424 416//416
+f 153//153 162//162 425//425
+f 153//153 425//425 417//417
+f 417//417 425//425 426//426
+f 417//417 426//426 418//418
+f 418//418 426//426 427//427
+f 418//418 427//427 419//419
+f 419//419 427//427 428//428
+f 419//419 428//428 420//420
+f 420//420 428//428 429//429
+f 420//420 429//429 421//421
+f 421//421 429//429 430//430
+f 421//421 430//430 422//422
+f 422//422 430//430 431//431
+f 422//422 431//431 423//423
+f 423//423 431//431 432//432
+f 423//423 432//432 424//424
+f 162//162 171//171 433//433
+f 162//162 433//433 425//425
+f 425//425 433//433 434//434
+f 425//425 434//434 426//426
+f 426//426 434//434 435//435
+f 426//426 435//435 427//427
+f 427//427 435//435 436//436
+f 427//427 436//436 428//428
+f 428//428 436//436 437//437
+f 428//428 437//437 429//429
+f 429//429 437//437 438//438
+f 429//429 438//438 430//430
+f 430//430 438//438 439//439
+f 430//430 439//439 431//431
+f 431//431 439//439 440//440
+f 431//431 440//440 432//432
+f 171//171 180//180 441//441
+f 171//171 441//441 433//433
+f 433//433 441//441 442//442
+f 433//433 442//442 434//434
+f 434//434 442//442 443//443
+f 434//434 443//443 435//435
+f 435//435 443//443 444//444
+f 435//435 444//444 436//436
+f 436//436 444//444 445//445
+f 436//436 445//445 437//437
+f 437//437 445//445 446//446
+f 437//437 446//446 438//438
+f 438//438 446//446 447//447
+f 438//438 447//447 439//439
+f 439//439 447//447 448//448
+f 439//439 448//448 440//440
+f 180//180 189//189 449//449
+f 180//180 449//449 441//441
+f 441//441 449//449 450//450
+f 441//441 450//450 442//442
+f 442//442 450//450 451//451
+f 442//442 451//451 443//443
+f 443//443 451//451 452//452
+f 443//443 452//452 444//444
+f 444//444 452//452 453//453
+f 444//444 453//453 445//445
+f 445//445 453//453 454//454
+f 445//445 454//454 446//446
+f 446//446 454//454 455//455
+f 446//446 455//455 447//447
+f 447//447 455//455 456//456
+f 447//447 456//456 448//448
+f 189//189 198//198 457//457
+f 189//189 457//457 449//449
+f 449//449 457//457 458//458
+f 449//449 458//458 450//450
+f 450//450 458//458 459//459
+f 450//450 459//459 451//451
+f 451//451 459//459 460//460
+f 451//451 460//460 452//452
+f 452//452 460//460 461//461
+f 452//452 461//461 453//453
+f 453//453 461//461 462//462
+f 453//453 462//462 454//454
+f 454//454 462//462 463//463
+f 454//454 463//463 455//455
+f 455//455 463//463 464//464
+f 455//455 464//464 456//456
+f 198//198 207//207 465//465
+f 198//198 465//465 457//457
+f 457//457 465//465 466//466
+f 457//457 466//466 458//458
+f 458//458 466//466 467//467
+f 458//458 467//467 459//459
+f 459//459 467//467 468//468
+f 459//459 468//468 460//460
+f 460//460 468//468 469//469
+f 460//460 469//469 461//461
+f 461//461 469//469 470//470
+f 461//461 470//470 462//462
+f 462//462 470//470 471//471
+f 462//462 471//471 463//463
+f 463//463 471//471 472//472
+f 463//463 472//472 464//464
+f 207//207 216//216 473//473
+f 207//207 473//473 465//465
+f 465//465 473//473 474//474
+f 465//465 474//474 466//466
+f 466//466 474//474 475//475
+f 466//466 475//475 467//467
+f 467//467 475//475 476//476
+f 467//467 476//476 468//468
+f 468//468 476//476 477//477
+f 468//468 477//477 469//469
+f 469//469 477//477 478//478
+f 469//469 478//478 470//470
+f 470//470 478//478 479//479
+f 470//470 479//479 471//471
+f 471//471 479//479 480//480
+f 471//471 480//480 472//472
+f 216//216 225//225 481//481
+f 216//216 481//481 473//473
+f 473//473 481//481 482//482
+f 473//473 482//482 474//474
+f 474//474 482//482 483//483
+f 474//474 483//483 475//475
+f 475//475 483//483 484//484
+f 475//475 484//484 476//476
+f 476//476 484//484 485//485
+f 476//476 485//485 477//477
+f 477//477 485//485 486//486
+f 477//477 486//486 478//478
+f 478//478 486//486 487//487
+f 478//478 487//487 479//479
+f 479//479 487//487 488//488
+f 479//479 488//488 480//480
+f 225//225 234//234 489//489
+f 225//225 489//489 481//481
+f 481//481 489//489 490//490
+f 481//481 490//490 482//482
+f 482//482 490//490 491//491
+f 482//482 491//491 483//483
+f 483//483 491//491 492//492
+f 483//483 492//492 484//484
+f 484//484 492//492 493//493
+f 484//484 493//493 485//485
+f 485//485 493//493 494//494
+f 485//485 494//494 486//486
+f 486//486 494//494 495//495
+f 486//486 495//495 487//487
+f 487//487 495//495 496//496
+f 487//487 496//496 488//488
+f 234//234 243//243 497//497
+f 234//234 497//497 489//489
+f 489//489 497//497 498//498
+f 489//489 498//498 490//490
+f 490//490 498//498 499//499
+f 490//490 499//499 491//491
+f 491//491 499//499 500//500
+f 491//491 500//500 492//492
+f 492//492 500//500 501//501
+f 492//492 501//501 493//493
+f 493//493 501//501 502//502
+f 493//493 502//502 494//494
+f 494//494 502//502 503//503
+f 494//494 503//503 495//495
+f 495//495 503//503 504//504
+f 495//495 504//504 496//496
+f 243//243 252//252 505//505
+f 243//243 505//505 497//497
+f 497//497 505//505 506//506
+f 497//497 506//506 498//498
+f 498//498 506//506 507//507
+f 498//498 507//507 499//499
+f 499//499 507//507 508//508
+f 499//499 508//508 500//500
+f 500//500 508//508 509//509
+f 500//500 509//509 501//501
+f 501//501 509//509 510//510
+f 501//501 510//510 502//502
+f 502//502 510//510 511//511
+f 502//502 511//511 503//503
+f 503//503 511//511 512//512
+f 503//503 512//512 504//504
+f 252//252 261//261 513//513
+f 252//252 513//513 505//505
+f 505//505 513//513 514//514
+f 505//505 514//514 506//506
+f 506//506 514//514 515//515
+f 506//506 515//515 507//507
+f 507//507 515//515 516//516
+f 507//507 516//516 508//508
+f 508//508 516//516 517//517
+f 508//508 517//517 509//509
+f 509//509 517//517 518//518
+f 509//509 518//518 510//510
+f 510//510 518//518 519//519
+f 510//510 519//519 511//511
+f 511//511 519//519 520//520
+f 511//511 520//520 512//512
+f 261//261 270//270 521//521
+f 261//261 521//521 513//513
+f 513//513 521//521 522//522
+f 513//513 522//522 514//514
+f 514//514 522//522 523//523
+f 514//514 523//523 515//515
+f 515//515 523//523 524//524
+f 515//515 524//524 516//516
+f 516//516 524//524 525//525
+f 516//516 525//525 517//517
+f 517//517 525//525 526//526
+f 517//517 526//526 518//518
+f 518//518 526//526 527//527
+f 518//518 527//527 519//519
+f 519//519 527//527 528//528
+f 519//519 528//528 520//520
+f 270//270 279//279 529//529
+f 270//270 529//529 521//521
+f 521//521 529//529 530//530
+f 521//521 530//530 522//522
+f 522//522 530//530 531//531
+f 522//522 531//531 523//523
+f 523//523 531//531 532//532
+f 523//523 532//532 524//524
+f 524//524 532//532 533//533
+f 524//524 533//533 525//525
+f 525//525 533//533 534//534
+f 525//525 534//534 526//526
+f 526//526 534//534 535//535
+f 526//526 535//535 527//527
+f 527//527 535//535 536//536
+f 527//527 536//536 528//528
+f 279//279 288//288 537//537
+f 279//279 537//537 529//529
+f 529//529 537//537 538//538
+f 529//529 538//538 530//530
+f 530//530 538//538 539//539
+f 530//530 539//539 531//531
+f 531//531 539//539 540//540
+f 531//531 540//540 532//532
+f 532//532 540//540 541//541
+f 532//532 541//541 533//533
+f 533//533 541//541 542//542
+f 533//533 542//542 534//534
+f 534//534 542//542 543//543
+f 534//534 543//543 535//535
+f 535//535 543//543 544//544
+f 535//535 544//544 536//536
+f 288//288 18//18 290//290
+f 288//288 290//290 537//537
+f 537//537 290//290 292//292
+f 537//537 292//292 538//538
+f 538//538 292//292 294//294
+f 538//538 294//294 539//539
+f 539//539 294//294 296//296
+f 539//539 296//296 540//540
+f 540//540 296//296 298//298
+f 540//540 298//298 541//541
+f 541//541 298//298 300//300
+f 541//541 300//300 542//542
+f 542//542 300//300 302//302
+f 542//542 302//302 543//543
+f 543//543 302//302 304//304
+f 543//543 304//304 544//544
+f 304//304 303//303 545//545
+f 304//304 545//545 546//546
+f 546//546 545//545 547//547
+f 546//546 547//547 548//548
+f 548//548 547//547 549//549
+f 548//548 549//549 550//550
+f 550//550 549//549 551//551
+f 550//550 551//551 552//552
+f 552//552 551//551 553//553
+f 552//552 553//553 554//554
+f 554//554 553//553 555//555
+f 554//554 555//555 556//556
+f 556//556 555//555 557//557
+f 556//556 557//557 558//558
+f 558//558 557//557 559//559
+f 558//558 559//559 560//560
+f 303//303 312//312 561//561
+f 303//303 561//561 545//545
+f 545//545 561//561 562//562
+f 545//545 562//562 547//547
+f 547//547 562//562 563//563
+f 547//547 563//563 549//549
+f 549//549 563//563 564//564
+f 549//549 564//564 551//551
+f 551//551 564//564 565//565
+f 551//551 565//565 553//553
+f 553//553 565//565 566//566
+f 553//553 566//566 555//555
+f 555//555 566//566 567//567
+f 555//555 567//567 557//557
+f 557//557 567//567 568//568
+f 557//557 568//568 559//559
+f 312//312 320//320 569//569
+f 312//312 569//569 561//561
+f 561//561 569//569 570//570
+f 561//561 570//570 562//562
+f 562//562 570//570 571//571
+f 562//562 571//571 563//563
+f 563//563 571//571 572//572
+f 563//563 572//572 564//564
+f 564//564 572//572 573//573
+f 564//564 573//573 565//565
+f 565//565 573//573 574//574
+f 565//565 574//574 566//566
+f 566//566 574//574 575//575
+f 566//566 575//575 567//567
+f 567//567 575//575 576//576
+f 567//567 576//576 568//568
+f 320//320 328//328 577//577
+f 320//320 577//577 569//569
+f 569//569 577//577 578//578
+f 569//569 578//578 570//570
+f 570//570 578//578 579//579
+f 570//570 579//579 571//571
+f 571//571 579//579 580//580
+f 571//571 580//580 572//572
+f 572//572 580//580 581//581
+f 572//572 581//581 573//573
+f 573//573 581//581 582//582
+f 573//573 582//582 574//574
+f 574//574 582//582 583//583
+f 574//574 583//583 575//575
+f 575//575 583//583 584//584
+f 575//575 584//584 576//576
+f 328//328 336//336 585//585
+f 328//328 585//585 577//577
+f 577//577 585//585 586//586
+f 577//577 586//586 578//578
+f 578//578 586//586 587//587
+f 578//578 587//587 579//579
+f 579//579 587//587 588//588
+f 579//579 588//588 580//580
+f 580//580 588//588 589//589
+f 580//580 589//589 581//581
+f 581//581 589//589 590//590
+f 581//581 590//590 582//582
+f 582//582 590//590 591//591
+f 582//582 591//591 583//583
+f 583//583 591//591 592//592
+f 583//583 592//592 584//584
+f 336//336 344//344 593//593
+f 336//336 593//593 585//585
+f 585//585 593//593 594//594
+f 585//585 594//594 586//586
+f 586//586 594//594 595//595
+f 586//586 595//595 587//587
+f 587//587 595//595 596//596
+f 587//587 596//596 588//588
+f 588//588 596//596 597//597
+f 588//588 597//597 589//589
+f 589//589 597//597 598//598
+f 589//589 598//598 590//590
+f 590//590 598//598 599//599
+f 590//590 599//599 591//591
+f 591//591 599//599 600//600
+f 591//591 600//600 592//592
+f 344//344 352//352 601//601
+f 344//344 601//601 593//593
+f 593//593 601//601 602//602
+f 593//593 602//602 594//594
+f 594//594 602//602 603//603
+f 594//594 603//603 595//595
+f 595//595 603//603 604//604
+f 595//595 604//604 596//596
+f 596//596 604//604 605//605
+f 596//596 605//605 597//597
+f 597//597 605//605 606//606
+f 597//597 606//606 598//598
+f 598//598 606//606 607//607
+f 598//598 607//607 599//599
+f 599//599 607//607 608//608
+f 599//599 608//608 600//600
+f 352//352 360//360 609//609
+f 352//352 609//609 601//601
+f 601//601 609//609 610//610
+f 601//601 610//610 602//602
+f 602//602 610//610 611//611
+f 602//602 611//611 603//603
+f 603//603 611//611 612//612
+f 603//603 612//612 604//604
+f 604//604 612//612 613//613
+f 604//604 613//613 605//605
+f 605//605 613//613 614//614
+f 605//605 614//614 606//606
+f 606//606 614//614 615//615
+f 606//606 615//615 607//607
+f 607//607 615//615 616//616
+f 607//607 616//616 608//608
+f 360//360 368//368 617//617
+f 360//360 617//617 609//609
+f 609//609 617//617 618//618
+f 609//609 618//618 610//610
+f 610//610 618//618 619//619
+f 610//610 619//619 611//611
+f 611//611 619//619 620//620
+f 611//611 620//620 612//612
+f 612//612 620//620 621//621
+f 612//612 621//621 613//613
+f 613//613 621//621 622//622
+f 613//613 622//622 614//614
+f 614//614 622//622 623//623
+f 614//614 623//623 615//615
+f 615//615 623//623 624//624
+f 615//615 624//624 616//616
+f 368//368 376//376 625//625
+f 368//368 625//625 617//617
+f 617//617 625//625 626//626
+f 617//617 626//626 618//618
+f 618//618 626//626 627//627
+f 618//618 627//627 619//619
+f 619//619 627//627 628//628
+f 619//619 628//628 620//620
+f 620//620 628//628 629//629
+f 620//620 629//629 621//621
+f 621//621 629//629 630//630
+f 621//621 630//630 622//622
+f 622//622 630//630 631//631
+f 622//622 631//631 623//623
+f 623//623 631//631 632//632
+f 623//623 632//632 624//624
+f 376//376 384//384 633//633
+f 376//376 633//633 625//625
+f 625//625 633//633 634//634
+f 625//625 634//634 626//626
+f 626//626 634//634 635//635
+f 626//626 635//635 627//627
+f 627//627 635//635 636//636
+f 627//627 636//636 628//628
+f 628//628 636//636 637//637
+f 628//628 637//637 629//629
+f 629//629 637//637 638//638
+f 629//629 638//638 630//630
+f 630//630 638//638 639//639
+f 630//630 639//639 631//631
+f 631//631 639//639 640//640
+f 631//631 640//640 632//632
+f 384//384 392//392 641//641
+f 384//384 641//641 633//633
+f 633//633 641//641 642//642
+f 633//633 642//642 634//634
+f 634//634 642//642 643//643
+f 634//634 643//643 635//635
+f 635//635 643//643 644//644
+f 635//635 644//644 636//636
+f 636//636 644//644 645//645
+f 636//636 645//645 637//637
+f 637//637 645//645 646//646
+f 637//637 646//646 638//638
+f 638//638 646//646 647//647
+f 638//638 647//647 639//639
+f 639//639 647//647 648//648
+f 639//639 648//648 640//640
+f 392//392 400//400 649//649
+f 392//392 649//649 641//641
+f 641//641 649//649 650//650
+f 641//641 650//650 642//642
+f 642//642 650//650 651//651
+f 642//642 651//651 643//643
+f 643//643 651//651 652//652
+f 643//643 652//652 644//644
+f 644//644 652//652 653//653
+f 644//644 653//653 645//645
+f 645//645 653//653 654//654
+f 645//645 654//654 646//646
+f 646//646 654//654 655//655
+f 646//646 655//655 647//647
+f 647//647 655//655 656//656
+f 647//647 656//656 648//648
+f 400//400 408//408 657//657
+f 400//400 657//657 649//649
+f 649//649 657//657 658//658
+f 649//649 658//658 650//650
+f 650//650 658//658 659//659
+f 650//650 659//659 651//651
+f 651//651 659//659 660//660
+f 651//651 660//660 652//652
+f 652//652 660//660 661//661
+f 652//652 661//661 653//653
+f 653//653 661//661 662//662
+f 653//653 662//662 654//654
+f 654//654 662//662 663//663
+f 654//654 663//663 655//655
+f 655//655 663//663 664//664
+f 655//655 664//664 656//656
+f 408//408 416//416 665//665
+f 408//408 665//665 657//657
+f 657//657 665//665 666//666
+f 657//657 666//666 658//658
+f 658//658 666//666 667//667
+f 658//658 667//667 659//659
+f 659//659 667//667 668//668
+f 659//659 668//668 660//660
+f 660//660 668//668 669//669
+f 660//660 669//669 661//661
+f 661//661 669//669 670//670
+f 661//661 670//670 662//662
+f 662//662 670//670 671//671
+f 662//662 671//671 663//663
+f 663//663 671//671 672//672
+f 663//663 672//672 664//664
+f 416//416 424//424 673//673
+f 416//416 673//673 665//665
+f 665//665 673//673 674//674
+f 665//665 674//674 666//666
+f 666//666 674//674 675//675
+f 666//666 675//675 667//667
+f 667//667 675//675 676//676
+f 667//667 676//676 668//668
+f 668//668 676//676 677//677
+f 668//668 677//677 669//669
+f 669//669 677//677 678//678
+f 669//669 678//678 670//670
+f 670//670 678//678 679//679
+f 670//670 679//679 671//671
+f 671//671 679//679 680//680
+f 671//671 680//680 672//672
+f 424//424 432//432 681//681
+f 424//424 681//681 673//673
+f 673//673 681//681 682//682
+f 673//673 682//682 674//674
+f 674//674 682//682 683//683
+f 674//674 683//683 675//675
+f 675//675 683//683 684//684
+f 675//675 684//684 676//676
+f 676//676 684//684 685//685
+f 676//676 685//685 677//677
+f 677//677 685//685 686//686
+f 677//677 686//686 678//678
+f 678//678 686//686 687//687
+f 678//678 687//687 679//679
+f 679//679 687//687 688//688
+f 679//679 688//688 680//680
+f 432//432 440//440 689//689
+f 432//432 689//689 681//681
+f 681//681 689//689 690//690
+f 681//681 690//690 682//682
+f 682//682 690//690 691//691
+f 682//682 691//691 683//683
+f 683//683 691//691 692//692
+f 683//683 692//692 684//684
+f 684//684 692//692 693//693
+f 684//684 693//693 685//685
+f 685//685 693//693 694//694
+f 685//685 694//694 686//686
+f 686//686 694//694 695//695
+f 686//686 695//695 687//687
+f 687//687 695//695 696//696
+f 687//687 696//696 688//688
+f 440//440 448//448 697//697
+f 440//440 697//697 689//689
+f 689//689 697//697 698//698
+f 689//689 698//698 690//690
+f 690//690 698//698 699//699
+f 690//690 699//699 691//691
+f 691//691 699//699 700//700
+f 691//691 700//700 692//692
+f 692//692 700//700 701//701
+f 692//692 701//701 693//693
+f 693//693 701//701 702//702
+f 693//693 702//702 694//694
+f 694//694 702//702 703//703
+f 694//694 703//703 695//695
+f 695//695 703//703 704//704
+f 695//695 704//704 696//696
+f 448//448 456//456 705//705
+f 448//448 705//705 697//697
+f 697//697 705//705 706//706
+f 697//697 706//706 698//698
+f 698//698 706//706 707//707
+f 698//698 707//707 699//699
+f 699//699 707//707 708//708
+f 699//699 708//708 700//700
+f 700//700 708//708 709//709
+f 700//700 709//709 701//701
+f 701//701 709//709 710//710
+f 701//701 710//710 702//702
+f 702//702 710//710 711//711
+f 702//702 711//711 703//703
+f 703//703 711//711 712//712
+f 703//703 712//712 704//704
+f 456//456 464//464 713//713
+f 456//456 713//713 705//705
+f 705//705 713//713 714//714
+f 705//705 714//714 706//706
+f 706//706 714//714 715//715
+f 706//706 715//715 707//707
+f 707//707 715//715 716//716
+f 707//707 716//716 708//708
+f 708//708 716//716 717//717
+f 708//708 717//717 709//709
+f 709//709 717//717 718//718
+f 709//709 718//718 710//710
+f 710//710 718//718 719//719
+f 710//710 719//719 711//711
+f 711//711 719//719 720//720
+f 711//711 720//720 712//712
+f 464//464 472//472 721//721
+f 464//464 721//721 713//713
+f 713//713 721//721 722//722
+f 713//713 722//722 714//714
+f 714//714 722//722 723//723
+f 714//714 723//723 715//715
+f 715//715 723//723 724//724
+f 715//715 724//724 716//716
+f 716//716 724//724 725//725
+f 716//716 725//725 717//717
+f 717//717 725//725 726//726
+f 717//717 726//726 718//718
+f 718//718 726//726 727//727
+f 718//718 727//727 719//719
+f 719//719 727//727 728//728
+f 719//719 728//728 720//720
+f 472//472 480//480 729//729
+f 472//472 729//729 721//721
+f 721//721 729//729 730//730
+f 721//721 730//730 722//722
+f 722//722 730//730 731//731
+f 722//722 731//731 723//723
+f 723//723 731//731 732//732
+f 723//723 732//732 724//724
+f 724//724 732//732 733//733
+f 724//724 733//733 725//725
+f 725//725 733//733 734//734
+f 725//725 734//734 726//726
+f 726//726 734//734 735//735
+f 726//726 735//735 727//727
+f 727//727 735//735 736//736
+f 727//727 736//736 728//728
+f 480//480 488//488 737//737
+f 480//480 737//737 729//729
+f 729//729 737//737 738//738
+f 729//729 738//738 730//730
+f 730//730 738//738 739//739
+f 730//730 739//739 731//731
+f 731//731 739//739 740//740
+f 731//731 740//740 732//732
+f 732//732 740//740 741//741
+f 732//732 741//741 733//733
+f 733//733 741//741 742//742
+f 733//733 742//742 734//734
+f 734//734 742//742 743//743
+f 734//734 743//743 735//735
+f 735//735 743//743 744//744
+f 735//735 744//744 736//736
+f 488//488 496//496 745//745
+f 488//488 745//745 737//737
+f 737//737 745//745 746//746
+f 737//737 746//746 738//738
+f 738//738 746//746 747//747
+f 738//738 747//747 739//739
+f 739//739 747//747 748//748
+f 739//739 748//748 740//740
+f 740//740 748//748 749//749
+f 740//740 749//749 741//741
+f 741//741 749//749 750//750
+f 741//741 750//750 742//742
+f 742//742 750//750 751//751
+f 742//742 751//751 743//743
+f 743//743 751//751 752//752
+f 743//743 752//752 744//744
+f 496//496 504//504 753//753
+f 496//496 753//753 745//745
+f 745//745 753//753 754//754
+f 745//745 754//754 746//746
+f 746//746 754//754 755//755
+f 746//746 755//755 747//747
+f 747//747 755//755 756//756
+f 747//747 756//756 748//748
+f 748//748 756//756 757//757
+f 748//748 757//757 749//749
+f 749//749 757//757 758//758
+f 749//749 758//758 750//750
+f 750//750 758//758 759//759
+f 750//750 759//759 751//751
+f 751//751 759//759 760//760
+f 751//751 760//760 752//752
+f 504//504 512//512 761//761
+f 504//504 761//761 753//753
+f 753//753 761//761 762//762
+f 753//753 762//762 754//754
+f 754//754 762//762 763//763
+f 754//754 763//763 755//755
+f 755//755 763//763 764//764
+f 755//755 764//764 756//756
+f 756//756 764//764 765//765
+f 756//756 765//765 757//757
+f 757//757 765//765 766//766
+f 757//757 766//766 758//758
+f 758//758 766//766 767//767
+f 758//758 767//767 759//759
+f 759//759 767//767 768//768
+f 759//759 768//768 760//760
+f 512//512 520//520 769//769
+f 512//512 769//769 761//761
+f 761//761 769//769 770//770
+f 761//761 770//770 762//762
+f 762//762 770//770 771//771
+f 762//762 771//771 763//763
+f 763//763 771//771 772//772
+f 763//763 772//772 764//764
+f 764//764 772//772 773//773
+f 764//764 773//773 765//765
+f 765//765 773//773 774//774
+f 765//765 774//774 766//766
+f 766//766 774//774 775//775
+f 766//766 775//775 767//767
+f 767//767 775//775 776//776
+f 767//767 776//776 768//768
+f 520//520 528//528 777//777
+f 520//520 777//777 769//769
+f 769//769 777//777 778//778
+f 769//769 778//778 770//770
+f 770//770 778//778 779//779
+f 770//770 779//779 771//771
+f 771//771 779//779 780//780
+f 771//771 780//780 772//772
+f 772//772 780//780 781//781
+f 772//772 781//781 773//773
+f 773//773 781//781 782//782
+f 773//773 782//782 774//774
+f 774//774 782//782 783//783
+f 774//774 783//783 775//775
+f 775//775 783//783 784//784
+f 775//775 784//784 776//776
+f 528//528 536//536 785//785
+f 528//528 785//785 777//777
+f 777//777 785//785 786//786
+f 777//777 786//786 778//778
+f 778//778 786//786 787//787
+f 778//778 787//787 779//779
+f 779//779 787//787 788//788
+f 779//779 788//788 780//780
+f 780//780 788//788 789//789
+f 780//780 789//789 781//781
+f 781//781 789//789 790//790
+f 781//781 790//790 782//782
+f 782//782 790//790 791//791
+f 782//782 791//791 783//783
+f 783//783 791//791 792//792
+f 783//783 792//792 784//784
+f 536//536 544//544 793//793
+f 536//536 793//793 785//785
+f 785//785 793//793 794//794
+f 785//785 794//794 786//786
+f 786//786 794//794 795//795
+f 786//786 795//795 787//787
+f 787//787 795//795 796//796
+f 787//787 796//796 788//788
+f 788//788 796//796 797//797
+f 788//788 797//797 789//789
+f 789//789 797//797 798//798
+f 789//789 798//798 790//790
+f 790//790 798//798 799//799
+f 790//790 799//799 791//791
+f 791//791 799//799 800//800
+f 791//791 800//800 792//792
+f 544//544 304//304 546//546
+f 544//544 546//546 793//793
+f 793//793 546//546 548//548
+f 793//793 548//548 794//794
+f 794//794 548//548 550//550
+f 794//794 550//550 795//795
+f 795//795 550//550 552//552
+f 795//795 552//552 796//796
+f 796//796 552//552 554//554
+f 796//796 554//554 797//797
+f 797//797 554//554 556//556
+f 797//797 556//556 798//798
+f 798//798 556//556 558//558
+f 798//798 558//558 799//799
+f 799//799 558//558 560//560
+f 799//799 560//560 800//800
+f 560//560 559//559 801//801
+f 560//560 801//801 802//802
+f 802//802 801//801 803//803
+f 802//802 803//803 804//804
+f 804//804 803//803 805//805
+f 804//804 805//805 806//806
+f 806//806 805//805 807//807
+f 806//806 807//807 808//808
+f 808//808 807//807 809//809
+f 808//808 809//809 810//810
+f 810//810 809//809 811//811
+f 810//810 811//811 812//812
+f 812//812 811//811 813//813
+f 812//812 813//813 814//814
+f 814//814 813//813 815//815
+f 559//559 568//568 816//816
+f 559//559 816//816 801//801
+f 801//801 816//816 817//817
+f 801//801 817//817 803//803
+f 803//803 817//817 818//818
+f 803//803 818//818 805//805
+f 805//805 818//818 819//819
+f 805//805 819//819 807//807
+f 807//807 819//819 820//820
+f 807//807 820//820 809//809
+f 809//809 820//820 821//821
+f 809//809 821//821 811//811
+f 811//811 821//821 822//822
+f 811//811 822//822 813//813
+f 813//813 822//822 815//815
+f 568//568 576//576 823//823
+f 568//568 823//823 816//816
+f 816//816 823//823 824//824
+f 816//816 824//824 817//817
+f 817//817 824//824 825//825
+f 817//817 825//825 818//818
+f 818//818 825//825 826//826
+f 818//818 826//826 819//819
+f 819//819 826//826 827//827
+f 819//819 827//827 820//820
+f 820//820 827//827 828//828
+f 820//820 828//828 821//821
+f 821//821 828//828 829//829
+f 821//821 829//829 822//822
+f 822//822 829//829 815//815
+f 576//576 584//584 830//830
+f 576//576 830//830 823//823
+f 823//823 830//830 831//831
+f 823//823 831//831 824//824
+f 824//824 831//831 832//832
+f 824//824 832//832 825//825
+f 825//825 832//832 833//833
+f 825//825 833//833 826//826
+f 826//826 833//833 834//834
+f 826//826 834//834 827//827
+f 827//827 834//834 835//835
+f 827//827 835//835 828//828
+f 828//828 835//835 836//836
+f 828//828 836//836 829//829
+f 829//829 836//836 815//815
+f 584//584 592//592 837//837
+f 584//584 837//837 830//830
+f 830//830 837//837 838//838
+f 830//830 838//838 831//831
+f 831//831 838//838 839//839
+f 831//831 839//839 832//832
+f 832//832 839//839 840//840
+f 832//832 840//840 833//833
+f 833//833 840//840 841//841
+f 833//833 841//841 834//834
+f 834//834 841//841 842//842
+f 834//834 842//842 835//835
+f 835//835 842//842 843//843
+f 835//835 843//843 836//836
+f 836//836 843//843 815//815
+f 592//592 600//600 844//844
+f 592//592 844//844 837//837
+f 837//837 844//844 845//845
+f 837//837 845//845 838//838
+f 838//838 845//845 846//846
+f 838//838 846//846 839//839
+f 839//839 846//846 847//847
+f 839//839 847//847 840//840
+f 840//840 847//847 848//848
+f 840//840 848//848 841//841
+f 841//841 848//848 849//849
+f 841//841 849//849 842//842
+f 842//842 849//849 850//850
+f 842//842 850//850 843//843
+f 843//843 850//850 815//815
+f 600//600 608//608 851//851
+f 600//600 851//851 844//844
+f 844//844 851//851 852//852
+f 844//844 852//852 845//845
+f 845//845 852//852 853//853
+f 845//845 853//853 846//846
+f 846//846 853//853 854//854
+f 846//846 854//854 847//847
+f 847//847 854//854 855//855
+f 847//847 855//855 848//848
+f 848//848 855//855 856//856
+f 848//848 856//856 849//849
+f 849//849 856//856 857//857
+f 849//849 857//857 850//850
+f 850//850 857//857 815//815
+f 608//608 616//616 858//858
+f 608//608 858//858 851//851
+f 851//851 858//858 859//859
+f 851//851 859//859 852//852
+f 852//852 859//859 860//860
+f 852//852 860//860 853//853
+f 853//853 860//860 861//861
+f 853//853 861//861 854//854
+f 854//854 861//861 862//862
+f 854//854 862//862 855//855
+f 855//855 862//862 863//863
+f 855//855 863//863 856//856
+f 856//856 863//863 864//864
+f 856//856 864//864 857//857
+f 857//857 864//864 815//815
+f 616//616 624//624 865//865
+f 616//616 865//865 858//858
+f 858//858 865//865 866//866
+f 858//858 866//866 859//859
+f 859//859 866//866 867//867
+f 859//859 867//867 860//860
+f 860//860 867//867 868//868
+f 860//860 868//868 861//861
+f 861//861 868//868 869//869
+f 861//861 869//869 862//862
+f 862//862 869//869 870//870
+f 862//862 870//870 863//863
+f 863//863 870//870 871//871
+f 863//863 871//871 864//864
+f 864//864 871//871 815//815
+f 624//624 632//632 872//872
+f 624//624 872//872 865//865
+f 865//865 872//872 873//873
+f 865//865 873//873 866//866
+f 866//866 873//873 874//874
+f 866//866 874//874 867//867
+f 867//867 874//874 875//875
+f 867//867 875//875 868//868
+f 868//868 875//875 876//876
+f 868//868 876//876 869//869
+f 869//869 876//876 877//877
+f 869//869 877//877 870//870
+f 870//870 877//877 878//878
+f 870//870 878//878 871//871
+f 871//871 878//878 815//815
+f 632//632 640//640 879//879
+f 632//632 879//879 872//872
+f 872//872 879//879 880//880
+f 872//872 880//880 873//873
+f 873//873 880//880 881//881
+f 873//873 881//881 874//874
+f 874//874 881//881 882//882
+f 874//874 882//882 875//875
+f 875//875 882//882 883//883
+f 875//875 883//883 876//876
+f 876//876 883//883 884//884
+f 876//876 884//884 877//877
+f 877//877 884//884 885//885
+f 877//877 885//885 878//878
+f 878//878 885//885 815//815
+f 640//640 648//648 886//886
+f 640//640 886//886 879//879
+f 879//879 886//886 887//887
+f 879//879 887//887 880//880
+f 880//880 887//887 888//888
+f 880//880 888//888 881//881
+f 881//881 888//888 889//889
+f 881//881 889//889 882//882
+f 882//882 889//889 890//890
+f 882//882 890//890 883//883
+f 883//883 890//890 891//891
+f 883//883 891//891 884//884
+f 884//884 891//891 892//892
+f 884//884 892//892 885//885
+f 885//885 892//892 815//815
+f 648//648 656//656 893//893
+f 648//648 893//893 886//886
+f 886//886 893//893 894//894
+f 886//886 894//894 887//887
+f 887//887 894//894 895//895
+f 887//887 895//895 888//888
+f 888//888 895//895 896//896
+f 888//888 896//896 889//889
+f 889//889 896//896 897//897
+f 889//889 897//897 890//890
+f 890//890 897//897 898//898
+f 890//890 898//898 891//891
+f 891//891 898//898 899//899
+f 891//891 899//899 892//892
+f 892//892 899//899 815//815
+f 656//656 664//664 900//900
+f 656//656 900//900 893//893
+f 893//893 900//900 901//901
+f 893//893 901//901 894//894
+f 894//894 901//901 902//902
+f 894//894 902//902 895//895
+f 895//895 902//902 903//903
+f 895//895 903//903 896//896
+f 896//896 903//903 904//904
+f 896//896 904//904 897//897
+f 897//897 904//904 905//905
+f 897//897 905//905 898//898
+f 898//898 905//905 906//906
+f 898//898 906//906 899//899
+f 899//899 906//906 815//815
+f 664//664 672//672 907//907
+f 664//664 907//907 900//900
+f 900//900 907//907 908//908
+f 900//900 908//908 901//901
+f 901//901 908//908 909//909
+f 901//901 909//909 902//902
+f 902//902 909//909 910//910
+f 902//902 910//910 903//903
+f 903//903 910//910 911//911
+f 903//903 911//911 904//904
+f 904//904 911//911 912//912
+f 904//904 912//912 905//905
+f 905//905 912//912 913//913
+f 905//905 913//913 906//906
+f 906//906 913//913 815//815
+f 672//672 680//680 914//914
+f 672//672 914//914 907//907
+f 907//907 914//914 915//915
+f 907//907 915//915 908//908
+f 908//908 915//915 916//916
+f 908//908 916//916 909//909
+f 909//909 916//916 917//917
+f 909//909 917//917 910//910
+f 910//910 917//917 918//918
+f 910//910 918//918 911//911
+f 911//911 918//918 919//919
+f 911//911 919//919 912//912
+f 912//912 919//919 920//920
+f 912//912 920//920 913//913
+f 913//913 920//920 815//815
+f 680//680 688//688 921//921
+f 680//680 921//921 914//914
+f 914//914 921//921 922//922
+f 914//914 922//922 915//915
+f 915//915 922//922 923//923
+f 915//915 923//923 916//916
+f 916//916 923//923 924//924
+f 916//916 924//924 917//917
+f 917//917 924//924 925//925
+f 917//917 925//925 918//918
+f 918//918 925//925 926//926
+f 918//918 926//926 919//919
+f 919//919 926//926 927//927
+f 919//919 927//927 920//920
+f 920//920 927//927 815//815
+f 688//688 696//696 928//928
+f 688//688 928//928 921//921
+f 921//921 928//928 929//929
+f 921//921 929//929 922//922
+f 922//922 929//929 930//930
+f 922//922 930//930 923//923
+f 923//923 930//930 931//931
+f 923//923 931//931 924//924
+f 924//924 931//931 932//932
+f 924//924 932//932 925//925
+f 925//925 932//932 933//933
+f 925//925 933//933 926//926
+f 926//926 933//933 934//934
+f 926//926 934//934 927//927
+f 927//927 934//934 815//815
+f 696//696 704//704 935//935
+f 696//696 935//935 928//928
+f 928//928 935//935 936//936
+f 928//928 936//936 929//929
+f 929//929 936//936 937//937
+f 929//929 937//937 930//930
+f 930//930 937//937 938//938
+f 930//930 938//938 931//931
+f 931//931 938//938 939//939
+f 931//931 939//939 932//932
+f 932//932 939//939 940//940
+f 932//932 940//940 933//933
+f 933//933 940//940 941//941
+f 933//933 941//941 934//934
+f 934//934 941//941 815//815
+f 704//704 712//712 942//942
+f 704//704 942//942 935//935
+f 935//935 942//942 943//943
+f 935//935 943//943 936//936
+f 936//936 943//943 944//944
+f 936//936 944//944 937//937
+f 937//937 944//944 945//945
+f 937//937 945//945 938//938
+f 938//938 945//945 946//946
+f 938//938 946//946 939//939
+f 939//939 946//946 947//947
+f 939//939 947//947 940//940
+f 940//940 947//947 948//948
+f 940//940 948//948 941//941
+f 941//941 948//948 815//815
+f 712//712 720//720 949//949
+f 712//712 949//949 942//942
+f 942//942 949//949 950//950
+f 942//942 950//950 943//943
+f 943//943 950//950 951//951
+f 943//943 951//951 944//944
+f 944//944 951//951 952//952
+f 944//944 952//952 945//945
+f 945//945 952//952 953//953
+f 945//945 953//953 946//946
+f 946//946 953//953 954//954
+f 946//946 954//954 947//947
+f 947//947 954//954 955//955
+f 947//947 955//955 948//948
+f 948//948 955//955 815//815
+f 720//720 728//728 956//956
+f 720//720 956//956 949//949
+f 949//949 956//956 957//957
+f 949//949 957//957 950//950
+f 950//950 957//957 958//958
+f 950//950 958//958 951//951
+f 951//951 958//958 959//959
+f 951//951 959//959 952//952
+f 952//952 959//959 960//960
+f 952//952 960//960 953//953
+f 953//953 960//960 961//961
+f 953//953 961//961 954//954
+f 954//954 961//961 962//962
+f 954//954 962//962 955//955
+f 955//955 962//962 815//815
+f 728//728 736//736 963//963
+f 728//728 963//963 956//956
+f 956//956 963//963 964//964
+f 956//956 964//964 957//957
+f 957//957 964//964 965//965
+f 957//957 965//965 958//958
+f 958//958 965//965 966//966
+f 958//958 966//966 959//959
+f 959//959 966//966 967//967
+f 959//959 967//967 960//960
+f 960//960 967//967 968//968
+f 960//960 968//968 961//961
+f 961//961 968//968 969//969
+f 961//961 969//969 962//962
+f 962//962 969//969 815//815
+f 736//736 744//744 970//970
+f 736//736 970//970 963//963
+f 963//963 970//970 971//971
+f 963//963 971//971 964//964
+f 964//964 971//971 972//972
+f 964//964 972//972 965//965
+f 965//965 972//972 973//973
+f 965//965 973//973 966//966
+f 966//966 973//973 974//974
+f 966//966 974//974 967//967
+f 967//967 974//974 975//975
+f 967//967 975//975 968//968
+f 968//968 975//975 976//976
+f 968//968 976//976 969//969
+f 969//969 976//976 815//815
+f 744//744 752//752 977//977
+f 744//744 977//977 970//970
+f 970//970 977//977 978//978
+f 970//970 978//978 971//971
+f 971//971 978//978 979//979
+f 971//971 979//979 972//972
+f 972//972 979//979 980//980
+f 972//972 980//980 973//973
+f 973//973 980//980 981//981
+f 973//973 981//981 974//974
+f 974//974 981//981 982//982
+f 974//974 982//982 975//975
+f 975//975 982//982 983//983
+f 975//975 983//983 976//976
+f 976//976 983//983 815//815
+f 752//752 760//760 984//984
+f 752//752 984//984 977//977
+f 977//977 984//984 985//985
+f 977//977 985//985 978//978
+f 978//978 985//985 986//986
+f 978//978 986//986 979//979
+f 979//979 986//986 987//987
+f 979//979 987//987 980//980
+f 980//980 987//987 988//988
+f 980//980 988//988 981//981
+f 981//981 988//988 989//989
+f 981//981 989//989 982//982
+f 982//982 989//989 990//990
+f 982//982 990//990 983//983
+f 983//983 990//990 815//815
+f 760//760 768//768 991//991
+f 760//760 991//991 984//984
+f 984//984 991//991 992//992
+f 984//984 992//992 985//985
+f 985//985 992//992 993//993
+f 985//985 993//993 986//986
+f 986//986 993//993 994//994
+f 986//986 994//994 987//987
+f 987//987 994//994 995//995
+f 987//987 995//995 988//988
+f 988//988 995//995 996//996
+f 988//988 996//996 989//989
+f 989//989 996//996 997//997
+f 989//989 997//997 990//990
+f 990//990 997//997 815//815
+f 768//768 776//776 998//998
+f 768//768 998//998 991//991
+f 991//991 998//998 999//999
+f 991//991 999//999 992//992
+f 992//992 999//999 1000//1000
+f 992//992 1000//1000 993//993
+f 993//993 1000//1000 1001//1001
+f 993//993 1001//1001 994//994
+f 994//994 1001//1001 1002//1002
+f 994//994 1002//1002 995//995
+f 995//995 1002//1002 1003//1003
+f 995//995 1003//1003 996//996
+f 996//996 1003//1003 1004//1004
+f 996//996 1004//1004 997//997
+f 997//997 1004//1004 815//815
+f 776//776 784//784 1005//1005
+f 776//776 1005//1005 998//998
+f 998//998 1005//1005 1006//1006
+f 998//998 1006//1006 999//999
+f 999//999 1006//1006 1007//1007
+f 999//999 1007//1007 1000//1000
+f 1000//1000 1007//1007 1008//1008
+f 1000//1000 1008//1008 1001//1001
+f 1001//1001 1008//1008 1009//1009
+f 1001//1001 1009//1009 1002//1002
+f 1002//1002 1009//1009 1010//1010
+f 1002//1002 1010//1010 1003//1003
+f 1003//1003 1010//1010 1011//1011
+f 1003//1003 1011//1011 1004//1004
+f 1004//1004 1011//1011 815//815
+f 784//784 792//792 1012//1012
+f 784//784 1012//1012 1005//1005
+f 1005//1005 1012//1012 1013//1013
+f 1005//1005 1013//1013 1006//1006
+f 1006//1006 1013//1013 1014//1014
+f 1006//1006 1014//1014 1007//1007
+f 1007//1007 1014//1014 1015//1015
+f 1007//1007 1015//1015 1008//1008
+f 1008//1008 1015//1015 1016//1016
+f 1008//1008 1016//1016 1009//1009
+f 1009//1009 1016//1016 1017//1017
+f 1009//1009 1017//1017 1010//1010
+f 1010//1010 1017//1017 1018//1018
+f 1010//1010 1018//1018 1011//1011
+f 1011//1011 1018//1018 815//815
+f 792//792 800//800 1019//1019
+f 792//792 1019//1019 1012//1012
+f 1012//1012 1019//1019 1020//1020
+f 1012//1012 1020//1020 1013//1013
+f 1013//1013 1020//1020 1021//1021
+f 1013//1013 1021//1021 1014//1014
+f 1014//1014 1021//1021 1022//1022
+f 1014//1014 1022//1022 1015//1015
+f 1015//1015 1022//1022 1023//1023
+f 1015//1015 1023//1023 1016//1016
+f 1016//1016 1023//1023 1024//1024
+f 1016//1016 1024//1024 1017//1017
+f 1017//1017 1024//1024 1025//1025
+f 1017//1017 1025//1025 1018//1018
+f 1018//1018 1025//1025 815//815
+f 800//800 560//560 802//802
+f 800//800 802//802 1019//1019
+f 1019//1019 802//802 804//804
+f 1019//1019 804//804 1020//1020
+f 1020//1020 804//804 806//806
+f 1020//1020 806//806 1021//1021
+f 1021//1021 806//806 808//808
+f 1021//1021 808//808 1022//1022
+f 1022//1022 808//808 810//810
+f 1022//1022 810//810 1023//1023
+f 1023//1023 810//810 812//812
+f 1023//1023 812//812 1024//1024
+f 1024//1024 812//812 814//814
+f 1024//1024 814//814 1025//1025
+f 1025//1025 814//814 815//815
+f 1026//1026 1027//1027 1028//1028
+f 1026//1026 1028//1028 1029//1029
+f 1029//1029 1028//1028 1030//1030
+f 1029//1029 1030//1030 1031//1031
+f 1031//1031 1030//1030 1032//1032
+f 1031//1031 1032//1032 1033//1033
+f 1033//1033 1032//1032 1034//1034
+f 1033//1033 1034//1034 1035//1035
+f 1035//1035 1034//1034 1036//1036
+f 1035//1035 1036//1036 1037//1037
+f 1037//1037 1036//1036 1038//1038
+f 1037//1037 1038//1038 1039//1039
+f 1039//1039 1038//1038 1040//1040
+f 1039//1039 1040//1040 1041//1041
+f 1041//1041 1040//1040 1042//1042
+f 1041//1041 1042//1042 1043//1043
+f 1027//1027 1044//1044 1045//1045
+f 1027//1027 1045//1045 1028//1028
+f 1028//1028 1045//1045 1046//1046
+f 1028//1028 1046//1046 1030//1030
+f 1030//1030 1046//1046 1047//1047
+f 1030//1030 1047//1047 1032//1032
+f 1032//1032 1047//1047 1048//1048
+f 1032//1032 1048//1048 1034//1034
+f 1034//1034 1048//1048 1049//1049
+f 1034//1034 1049//1049 1036//1036
+f 1036//1036 1049//1049 1050//1050
+f 1036//1036 1050//1050 1038//1038
+f 1038//1038 1050//1050 1051//1051
+f 1038//1038 1051//1051 1040//1040
+f 1040//1040 1051//1051 1052//1052
+f 1040//1040 1052//1052 1042//1042
+f 1044//1044 1053//1053 1054//1054
+f 1044//1044 1054//1054 1045//1045
+f 1045//1045 1054//1054 1055//1055
+f 1045//1045 1055//1055 1046//1046
+f 1046//1046 1055//1055 1056//1056
+f 1046//1046 1056//1056 1047//1047
+f 1047//1047 1056//1056 1057//1057
+f 1047//1047 1057//1057 1048//1048
+f 1048//1048 1057//1057 1058//1058
+f 1048//1048 1058//1058 1049//1049
+f 1049//1049 1058//1058 1059//1059
+f 1049//1049 1059//1059 1050//1050
+f 1050//1050 1059//1059 1060//1060
+f 1050//1050 1060//1060 1051//1051
+f 1051//1051 1060//1060 1061//1061
+f 1051//1051 1061//1061 1052//1052
+f 1053//1053 1062//1062 1063//1063
+f 1053//1053 1063//1063 1054//1054
+f 1054//1054 1063//1063 1064//1064
+f 1054//1054 1064//1064 1055//1055
+f 1055//1055 1064//1064 1065//1065
+f 1055//1055 1065//1065 1056//1056
+f 1056//1056 1065//1065 1066//1066
+f 1056//1056 1066//1066 1057//1057
+f 1057//1057 1066//1066 1067//1067
+f 1057//1057 1067//1067 1058//1058
+f 1058//1058 1067//1067 1068//1068
+f 1058//1058 1068//1068 1059//1059
+f 1059//1059 1068//1068 1069//1069
+f 1059//1059 1069//1069 1060//1060
+f 1060//1060 1069//1069 1070//1070
+f 1060//1060 1070//1070 1061//1061
+f 1062//1062 1071//1071 1072//1072
+f 1062//1062 1072//1072 1063//1063
+f 1063//1063 1072//1072 1073//1073
+f 1063//1063 1073//1073 1064//1064
+f 1064//1064 1073//1073 1074//1074
+f 1064//1064 1074//1074 1065//1065
+f 1065//1065 1074//1074 1075//1075
+f 1065//1065 1075//1075 1066//1066
+f 1066//1066 1075//1075 1076//1076
+f 1066//1066 1076//1076 1067//1067
+f 1067//1067 1076//1076 1077//1077
+f 1067//1067 1077//1077 1068//1068
+f 1068//1068 1077//1077 1078//1078
+f 1068//1068 1078//1078 1069//1069
+f 1069//1069 1078//1078 1079//1079
+f 1069//1069 1079//1079 1070//1070
+f 1071//1071 1080//1080 1081//1081
+f 1071//1071 1081//1081 1072//1072
+f 1072//1072 1081//1081 1082//1082
+f 1072//1072 1082//1082 1073//1073
+f 1073//1073 1082//1082 1083//1083
+f 1073//1073 1083//1083 1074//1074
+f 1074//1074 1083//1083 1084//1084
+f 1074//1074 1084//1084 1075//1075
+f 1075//1075 1084//1084 1085//1085
+f 1075//1075 1085//1085 1076//1076
+f 1076//1076 1085//1085 1086//1086
+f 1076//1076 1086//1086 1077//1077
+f 1077//1077 1086//1086 1087//1087
+f 1077//1077 1087//1087 1078//1078
+f 1078//1078 1087//1087 1088//1088
+f 1078//1078 1088//1088 1079//1079
+f 1080//1080 1089//1089 1090//1090
+f 1080//1080 1090//1090 1081//1081
+f 1081//1081 1090//1090 1091//1091
+f 1081//1081 1091//1091 1082//1082
+f 1082//1082 1091//1091 1092//1092
+f 1082//1082 1092//1092 1083//1083
+f 1083//1083 1092//1092 1093//1093
+f 1083//1083 1093//1093 1084//1084
+f 1084//1084 1093//1093 1094//1094
+f 1084//1084 1094//1094 1085//1085
+f 1085//1085 1094//1094 1095//1095
+f 1085//1085 1095//1095 1086//1086
+f 1086//1086 1095//1095 1096//1096
+f 1086//1086 1096//1096 1087//1087
+f 1087//1087 1096//1096 1097//1097
+f 1087//1087 1097//1097 1088//1088
+f 1089//1089 1098//1098 1099//1099
+f 1089//1089 1099//1099 1090//1090
+f 1090//1090 1099//1099 1100//1100
+f 1090//1090 1100//1100 1091//1091
+f 1091//1091 1100//1100 1101//1101
+f 1091//1091 1101//1101 1092//1092
+f 1092//1092 1101//1101 1102//1102
+f 1092//1092 1102//1102 1093//1093
+f 1093//1093 1102//1102 1103//1103
+f 1093//1093 1103//1103 1094//1094
+f 1094//1094 1103//1103 1104//1104
+f 1094//1094 1104//1104 1095//1095
+f 1095//1095 1104//1104 1105//1105
+f 1095//1095 1105//1105 1096//1096
+f 1096//1096 1105//1105 1106//1106
+f 1096//1096 1106//1106 1097//1097
+f 1098//1098 1107//1107 1108//1108
+f 1098//1098 1108//1108 1099//1099
+f 1099//1099 1108//1108 1109//1109
+f 1099//1099 1109//1109 1100//1100
+f 1100//1100 1109//1109 1110//1110
+f 1100//1100 1110//1110 1101//1101
+f 1101//1101 1110//1110 1111//1111
+f 1101//1101 1111//1111 1102//1102
+f 1102//1102 1111//1111 1112//1112
+f 1102//1102 1112//1112 1103//1103
+f 1103//1103 1112//1112 1113//1113
+f 1103//1103 1113//1113 1104//1104
+f 1104//1104 1113//1113 1114//1114
+f 1104//1104 1114//1114 1105//1105
+f 1105//1105 1114//1114 1115//1115
+f 1105//1105 1115//1115 1106//1106
+f 1107//1107 1116//1116 1117//1117
+f 1107//1107 1117//1117 1108//1108
+f 1108//1108 1117//1117 1118//1118
+f 1108//1108 1118//1118 1109//1109
+f 1109//1109 1118//1118 1119//1119
+f 1109//1109 1119//1119 1110//1110
+f 1110//1110 1119//1119 1120//1120
+f 1110//1110 1120//1120 1111//1111
+f 1111//1111 1120//1120 1121//1121
+f 1111//1111 1121//1121 1112//1112
+f 1112//1112 1121//1121 1122//1122
+f 1112//1112 1122//1122 1113//1113
+f 1113//1113 1122//1122 1123//1123
+f 1113//1113 1123//1123 1114//1114
+f 1114//1114 1123//1123 1124//1124
+f 1114//1114 1124//1124 1115//1115
+f 1116//1116 1125//1125 1126//1126
+f 1116//1116 1126//1126 1117//1117
+f 1117//1117 1126//1126 1127//1127
+f 1117//1117 1127//1127 1118//1118
+f 1118//1118 1127//1127 1128//1128
+f 1118//1118 1128//1128 1119//1119
+f 1119//1119 1128//1128 1129//1129
+f 1119//1119 1129//1129 1120//1120
+f 1120//1120 1129//1129 1130//1130
+f 1120//1120 1130//1130 1121//1121
+f 1121//1121 1130//1130 1131//1131
+f 1121//1121 1131//1131 1122//1122
+f 1122//1122 1131//1131 1132//1132
+f 1122//1122 1132//1132 1123//1123
+f 1123//1123 1132//1132 1133//1133
+f 1123//1123 1133//1133 1124//1124
+f 1125//1125 1134//1134 1135//1135
+f 1125//1125 1135//1135 1126//1126
+f 1126//1126 1135//1135 1136//1136
+f 1126//1126 1136//1136 1127//1127
+f 1127//1127 1136//1136 1137//1137
+f 1127//1127 1137//1137 1128//1128
+f 1128//1128 1137//1137 1138//1138
+f 1128//1128 1138//1138 1129//1129
+f 1129//1129 1138//1138 1139//1139
+f 1129//1129 1139//1139 1130//1130
+f 1130//1130 1139//1139 1140//1140
+f 1130//1130 1140//1140 1131//1131
+f 1131//1131 1140//1140 1141//1141
+f 1131//1131 1141//1141 1132//1132
+f 1132//1132 1141//1141 1142//1142
+f 1132//1132 1142//1142 1133//1133
+f 1134//1134 1143//1143 1144//1144
+f 1134//1134 1144//1144 1135//1135
+f 1135//1135 1144//1144 1145//1145
+f 1135//1135 1145//1145 1136//1136
+f 1136//1136 1145//1145 1146//1146
+f 1136//1136 1146//1146 1137//1137
+f 1137//1137 1146//1146 1147//1147
+f 1137//1137 1147//1147 1138//1138
+f 1138//1138 1147//1147 1148//1148
+f 1138//1138 1148//1148 1139//1139
+f 1139//1139 1148//1148 1149//1149
+f 1139//1139 1149//1149 1140//1140
+f 1140//1140 1149//1149 1150//1150
+f 1140//1140 1150//1150 1141//1141
+f 1141//1141 1150//1150 1151//1151
+f 1141//1141 1151//1151 1142//1142
+f 1143//1143 1152//1152 1153//1153
+f 1143//1143 1153//1153 1144//1144
+f 1144//1144 1153//1153 1154//1154
+f 1144//1144 1154//1154 1145//1145
+f 1145//1145 1154//1154 1155//1155
+f 1145//1145 1155//1155 1146//1146
+f 1146//1146 1155//1155 1156//1156
+f 1146//1146 1156//1156 1147//1147
+f 1147//1147 1156//1156 1157//1157
+f 1147//1147 1157//1157 1148//1148
+f 1148//1148 1157//1157 1158//1158
+f 1148//1148 1158//1158 1149//1149
+f 1149//1149 1158//1158 1159//1159
+f 1149//1149 1159//1159 1150//1150
+f 1150//1150 1159//1159 1160//1160
+f 1150//1150 1160//1160 1151//1151
+f 1152//1152 1161//1161 1162//1162
+f 1152//1152 1162//1162 1153//1153
+f 1153//1153 1162//1162 1163//1163
+f 1153//1153 1163//1163 1154//1154
+f 1154//1154 1163//1163 1164//1164
+f 1154//1154 1164//1164 1155//1155
+f 1155//1155 1164//1164 1165//1165
+f 1155//1155 1165//1165 1156//1156
+f 1156//1156 1165//1165 1166//1166
+f 1156//1156 1166//1166 1157//1157
+f 1157//1157 1166//1166 1167//1167
+f 1157//1157 1167//1167 1158//1158
+f 1158//1158 1167//1167 1168//1168
+f 1158//1158 1168//1168 1159//1159
+f 1159//1159 1168//1168 1169//1169
+f 1159//1159 1169//1169 1160//1160
+f 1161//1161 1026//1026 1029//1029
+f 1161//1161 1029//1029 1162//1162
+f 1162//1162 1029//1029 1031//1031
+f 1162//1162 1031//1031 1163//1163
+f 1163//1163 1031//1031 1033//1033
+f 1163//1163 1033//1033 1164//1164
+f 1164//1164 1033//1033 1035//1035
+f 1164//1164 1035//1035 1165//1165
+f 1165//1165 1035//1035 1037//1037
+f 1165//1165 1037//1037 1166//1166
+f 1166//1166 1037//1037 1039//1039
+f 1166//1166 1039//1039 1167//1167
+f 1167//1167 1039//1039 1041//1041
+f 1167//1167 1041//1041 1168//1168
+f 1168//1168 1041//1041 1043//1043
+f 1168//1168 1043//1043 1169//1169
+f 1043//1043 1042//1042 1170//1170
+f 1043//1043 1170//1170 1171//1171
+f 1171//1171 1170//1170 1172//1172
+f 1171//1171 1172//1172 1173//1173
+f 1173//1173 1172//1172 1174//1174
+f 1173//1173 1174//1174 1175//1175
+f 1175//1175 1174//1174 1176//1176
+f 1175//1175 1176//1176 1177//1177
+f 1177//1177 1176//1176 1178//1178
+f 1177//1177 1178//1178 1179//1179
+f 1179//1179 1178//1178 1180//1180
+f 1179//1179 1180//1180 1181//1181
+f 1181//1181 1180//1180 1182//1182
+f 1181//1181 1182//1182 1183//1183
+f 1183//1183 1182//1182 1184//1184
+f 1183//1183 1184//1184 424//424
+f 1042//1042 1052//1052 1185//1185
+f 1042//1042 1185//1185 1170//1170
+f 1170//1170 1185//1185 1186//1186
+f 1170//1170 1186//1186 1172//1172
+f 1172//1172 1186//1186 1187//1187
+f 1172//1172 1187//1187 1174//1174
+f 1174//1174 1187//1187 1188//1188
+f 1174//1174 1188//1188 1176//1176
+f 1176//1176 1188//1188 1189//1189
+f 1176//1176 1189//1189 1178//1178
+f 1178//1178 1189//1189 1190//1190
+f 1178//1178 1190//1190 1180//1180
+f 1180//1180 1190//1190 1191//1191
+f 1180//1180 1191//1191 1182//1182
+f 1182//1182 1191//1191 1192//1192
+f 1182//1182 1192//1192 1184//1184
+f 1052//1052 1061//1061 1193//1193
+f 1052//1052 1193//1193 1185//1185
+f 1185//1185 1193//1193 1194//1194
+f 1185//1185 1194//1194 1186//1186
+f 1186//1186 1194//1194 1195//1195
+f 1186//1186 1195//1195 1187//1187
+f 1187//1187 1195//1195 1196//1196
+f 1187//1187 1196//1196 1188//1188
+f 1188//1188 1196//1196 1197//1197
+f 1188//1188 1197//1197 1189//1189
+f 1189//1189 1197//1197 1198//1198
+f 1189//1189 1198//1198 1190//1190
+f 1190//1190 1198//1198 1199//1199
+f 1190//1190 1199//1199 1191//1191
+f 1191//1191 1199//1199 1200//1200
+f 1191//1191 1200//1200 1192//1192
+f 1061//1061 1070//1070 1201//1201
+f 1061//1061 1201//1201 1193//1193
+f 1193//1193 1201//1201 1202//1202
+f 1193//1193 1202//1202 1194//1194
+f 1194//1194 1202//1202 1203//1203
+f 1194//1194 1203//1203 1195//1195
+f 1195//1195 1203//1203 1204//1204
+f 1195//1195 1204//1204 1196//1196
+f 1196//1196 1204//1204 1205//1205
+f 1196//1196 1205//1205 1197//1197
+f 1197//1197 1205//1205 1206//1206
+f 1197//1197 1206//1206 1198//1198
+f 1198//1198 1206//1206 1207//1207
+f 1198//1198 1207//1207 1199//1199
+f 1199//1199 1207//1207 1208//1208
+f 1199//1199 1208//1208 1200//1200
+f 1070//1070 1079//1079 1209//1209
+f 1070//1070 1209//1209 1201//1201
+f 1201//1201 1209//1209 1210//1210
+f 1201//1201 1210//1210 1202//1202
+f 1202//1202 1210//1210 1211//1211
+f 1202//1202 1211//1211 1203//1203
+f 1203//1203 1211//1211 1212//1212
+f 1203//1203 1212//1212 1204//1204
+f 1204//1204 1212//1212 1213//1213
+f 1204//1204 1213//1213 1205//1205
+f 1205//1205 1213//1213 1214//1214
+f 1205//1205 1214//1214 1206//1206
+f 1206//1206 1214//1214 1215//1215
+f 1206//1206 1215//1215 1207//1207
+f 1207//1207 1215//1215 1216//1216
+f 1207//1207 1216//1216 1208//1208
+f 1079//1079 1088//1088 1217//1217
+f 1079//1079 1217//1217 1209//1209
+f 1209//1209 1217//1217 1218//1218
+f 1209//1209 1218//1218 1210//1210
+f 1210//1210 1218//1218 1219//1219
+f 1210//1210 1219//1219 1211//1211
+f 1211//1211 1219//1219 1220//1220
+f 1211//1211 1220//1220 1212//1212
+f 1212//1212 1220//1220 1221//1221
+f 1212//1212 1221//1221 1213//1213
+f 1213//1213 1221//1221 1222//1222
+f 1213//1213 1222//1222 1214//1214
+f 1214//1214 1222//1222 1223//1223
+f 1214//1214 1223//1223 1215//1215
+f 1215//1215 1223//1223 1224//1224
+f 1215//1215 1224//1224 1216//1216
+f 1088//1088 1097//1097 1225//1225
+f 1088//1088 1225//1225 1217//1217
+f 1217//1217 1225//1225 1226//1226
+f 1217//1217 1226//1226 1218//1218
+f 1218//1218 1226//1226 1227//1227
+f 1218//1218 1227//1227 1219//1219
+f 1219//1219 1227//1227 1228//1228
+f 1219//1219 1228//1228 1220//1220
+f 1220//1220 1228//1228 1229//1229
+f 1220//1220 1229//1229 1221//1221
+f 1221//1221 1229//1229 1230//1230
+f 1221//1221 1230//1230 1222//1222
+f 1222//1222 1230//1230 1231//1231
+f 1222//1222 1231//1231 1223//1223
+f 1223//1223 1231//1231 1232//1232
+f 1223//1223 1232//1232 1224//1224
+f 1097//1097 1106//1106 1233//1233
+f 1097//1097 1233//1233 1225//1225
+f 1225//1225 1233//1233 1234//1234
+f 1225//1225 1234//1234 1226//1226
+f 1226//1226 1234//1234 1235//1235
+f 1226//1226 1235//1235 1227//1227
+f 1227//1227 1235//1235 1236//1236
+f 1227//1227 1236//1236 1228//1228
+f 1228//1228 1236//1236 1237//1237
+f 1228//1228 1237//1237 1229//1229
+f 1229//1229 1237//1237 1238//1238
+f 1229//1229 1238//1238 1230//1230
+f 1230//1230 1238//1238 1239//1239
+f 1230//1230 1239//1239 1231//1231
+f 1231//1231 1239//1239 1240//1240
+f 1231//1231 1240//1240 1232//1232
+f 1106//1106 1115//1115 1241//1241
+f 1106//1106 1241//1241 1233//1233
+f 1233//1233 1241//1241 1242//1242
+f 1233//1233 1242//1242 1234//1234
+f 1234//1234 1242//1242 1243//1243
+f 1234//1234 1243//1243 1235//1235
+f 1235//1235 1243//1243 1244//1244
+f 1235//1235 1244//1244 1236//1236
+f 1236//1236 1244//1244 1245//1245
+f 1236//1236 1245//1245 1237//1237
+f 1237//1237 1245//1245 1246//1246
+f 1237//1237 1246//1246 1238//1238
+f 1238//1238 1246//1246 1247//1247
+f 1238//1238 1247//1247 1239//1239
+f 1239//1239 1247//1247 1248//1248
+f 1239//1239 1248//1248 1240//1240
+f 1115//1115 1124//1124 1249//1249
+f 1115//1115 1249//1249 1241//1241
+f 1241//1241 1249//1249 1250//1250
+f 1241//1241 1250//1250 1242//1242
+f 1242//1242 1250//1250 1251//1251
+f 1242//1242 1251//1251 1243//1243
+f 1243//1243 1251//1251 1252//1252
+f 1243//1243 1252//1252 1244//1244
+f 1244//1244 1252//1252 1253//1253
+f 1244//1244 1253//1253 1245//1245
+f 1245//1245 1253//1253 1254//1254
+f 1245//1245 1254//1254 1246//1246
+f 1246//1246 1254//1254 1255//1255
+f 1246//1246 1255//1255 1247//1247
+f 1247//1247 1255//1255 1256//1256
+f 1247//1247 1256//1256 1248//1248
+f 1124//1124 1133//1133 1257//1257
+f 1124//1124 1257//1257 1249//1249
+f 1249//1249 1257//1257 1258//1258
+f 1249//1249 1258//1258 1250//1250
+f 1250//1250 1258//1258 1259//1259
+f 1250//1250 1259//1259 1251//1251
+f 1251//1251 1259//1259 1260//1260
+f 1251//1251 1260//1260 1252//1252
+f 1252//1252 1260//1260 1261//1261
+f 1252//1252 1261//1261 1253//1253
+f 1253//1253 1261//1261 1262//1262
+f 1253//1253 1262//1262 1254//1254
+f 1254//1254 1262//1262 1263//1263
+f 1254//1254 1263//1263 1255//1255
+f 1255//1255 1263//1263 1264//1264
+f 1255//1255 1264//1264 1256//1256
+f 1133//1133 1142//1142 1265//1265
+f 1133//1133 1265//1265 1257//1257
+f 1257//1257 1265//1265 1266//1266
+f 1257//1257 1266//1266 1258//1258
+f 1258//1258 1266//1266 1267//1267
+f 1258//1258 1267//1267 1259//1259
+f 1259//1259 1267//1267 1268//1268
+f 1259//1259 1268//1268 1260//1260
+f 1260//1260 1268//1268 1269//1269
+f 1260//1260 1269//1269 1261//1261
+f 1261//1261 1269//1269 1270//1270
+f 1261//1261 1270//1270 1262//1262
+f 1262//1262 1270//1270 1271//1271
+f 1262//1262 1271//1271 1263//1263
+f 1263//1263 1271//1271 1272//1272
+f 1263//1263 1272//1272 1264//1264
+f 1142//1142 1151//1151 1273//1273
+f 1142//1142 1273//1273 1265//1265
+f 1265//1265 1273//1273 1274//1274
+f 1265//1265 1274//1274 1266//1266
+f 1266//1266 1274//1274 1275//1275
+f 1266//1266 1275//1275 1267//1267
+f 1267//1267 1275//1275 1276//1276
+f 1267//1267 1276//1276 1268//1268
+f 1268//1268 1276//1276 1277//1277
+f 1268//1268 1277//1277 1269//1269
+f 1269//1269 1277//1277 1278//1278
+f 1269//1269 1278//1278 1270//1270
+f 1270//1270 1278//1278 1279//1279
+f 1270//1270 1279//1279 1271//1271
+f 1271//1271 1279//1279 1280//1280
+f 1271//1271 1280//1280 1272//1272
+f 1151//1151 1160//1160 1281//1281
+f 1151//1151 1281//1281 1273//1273
+f 1273//1273 1281//1281 1282//1282
+f 1273//1273 1282//1282 1274//1274
+f 1274//1274 1282//1282 1283//1283
+f 1274//1274 1283//1283 1275//1275
+f 1275//1275 1283//1283 1284//1284
+f 1275//1275 1284//1284 1276//1276
+f 1276//1276 1284//1284 1285//1285
+f 1276//1276 1285//1285 1277//1277
+f 1277//1277 1285//1285 1286//1286
+f 1277//1277 1286//1286 1278//1278
+f 1278//1278 1286//1286 1287//1287
+f 1278//1278 1287//1287 1279//1279
+f 1279//1279 1287//1287 1288//1288
+f 1279//1279 1288//1288 1280//1280
+f 1160//1160 1169//1169 1289//1289
+f 1160//1160 1289//1289 1281//1281
+f 1281//1281 1289//1289 1290//1290
+f 1281//1281 1290//1290 1282//1282
+f 1282//1282 1290//1290 1291//1291
+f 1282//1282 1291//1291 1283//1283
+f 1283//1283 1291//1291 1292//1292
+f 1283//1283 1292//1292 1284//1284
+f 1284//1284 1292//1292 1293//1293
+f 1284//1284 1293//1293 1285//1285
+f 1285//1285 1293//1293 1294//1294
+f 1285//1285 1294//1294 1286//1286
+f 1286//1286 1294//1294 1295//1295
+f 1286//1286 1295//1295 1287//1287
+f 1287//1287 1295//1295 1296//1296
+f 1287//1287 1296//1296 1288//1288
+f 1169//1169 1043//1043 1171//1171
+f 1169//1169 1171//1171 1289//1289
+f 1289//1289 1171//1171 1173//1173
+f 1289//1289 1173//1173 1290//1290
+f 1290//1290 1173//1173 1175//1175
+f 1290//1290 1175//1175 1291//1291
+f 1291//1291 1175//1175 1177//1177
+f 1291//1291 1177//1177 1292//1292
+f 1292//1292 1177//1177 1179//1179
+f 1292//1292 1179//1179 1293//1293
+f 1293//1293 1179//1179 1181//1181
+f 1293//1293 1181//1181 1294//1294
+f 1294//1294 1181//1181 1183//1183
+f 1294//1294 1183//1183 1295//1295
+f 1295//1295 1183//1183 424//424
+f 1295//1295 424//424 1296//1296
+f 1297//1297 1298//1298 1299//1299
+f 1297//1297 1299//1299 1300//1300
+f 1300//1300 1299//1299 1301//1301
+f 1300//1300 1301//1301 1302//1302
+f 1302//1302 1301//1301 1303//1303
+f 1302//1302 1303//1303 1304//1304
+f 1304//1304 1303//1303 1305//1305
+f 1304//1304 1305//1305 1306//1306
+f 1306//1306 1305//1305 1307//1307
+f 1306//1306 1307//1307 1308//1308
+f 1308//1308 1307//1307 1309//1309
+f 1308//1308 1309//1309 1310//1310
+f 1310//1310 1309//1309 1311//1311
+f 1310//1310 1311//1311 1312//1312
+f 1312//1312 1311//1311 1313//1313
+f 1312//1312 1313//1313 1314//1314
+f 1298//1298 1315//1315 1316//1316
+f 1298//1298 1316//1316 1299//1299
+f 1299//1299 1316//1316 1317//1317
+f 1299//1299 1317//1317 1301//1301
+f 1301//1301 1317//1317 1318//1318
+f 1301//1301 1318//1318 1303//1303
+f 1303//1303 1318//1318 1319//1319
+f 1303//1303 1319//1319 1305//1305
+f 1305//1305 1319//1319 1320//1320
+f 1305//1305 1320//1320 1307//1307
+f 1307//1307 1320//1320 1321//1321
+f 1307//1307 1321//1321 1309//1309
+f 1309//1309 1321//1321 1322//1322
+f 1309//1309 1322//1322 1311//1311
+f 1311//1311 1322//1322 1323//1323
+f 1311//1311 1323//1323 1313//1313
+f 1315//1315 1324//1324 1325//1325
+f 1315//1315 1325//1325 1316//1316
+f 1316//1316 1325//1325 1326//1326
+f 1316//1316 1326//1326 1317//1317
+f 1317//1317 1326//1326 1327//1327
+f 1317//1317 1327//1327 1318//1318
+f 1318//1318 1327//1327 1328//1328
+f 1318//1318 1328//1328 1319//1319
+f 1319//1319 1328//1328 1329//1329
+f 1319//1319 1329//1329 1320//1320
+f 1320//1320 1329//1329 1330//1330
+f 1320//1320 1330//1330 1321//1321
+f 1321//1321 1330//1330 1331//1331
+f 1321//1321 1331//1331 1322//1322
+f 1322//1322 1331//1331 1332//1332
+f 1322//1322 1332//1332 1323//1323
+f 1324//1324 1333//1333 1334//1334
+f 1324//1324 1334//1334 1325//1325
+f 1325//1325 1334//1334 1335//1335
+f 1325//1325 1335//1335 1326//1326
+f 1326//1326 1335//1335 1336//1336
+f 1326//1326 1336//1336 1327//1327
+f 1327//1327 1336//1336 1337//1337
+f 1327//1327 1337//1337 1328//1328
+f 1328//1328 1337//1337 1338//1338
+f 1328//1328 1338//1338 1329//1329
+f 1329//1329 1338//1338 1339//1339
+f 1329//1329 1339//1339 1330//1330
+f 1330//1330 1339//1339 1340//1340
+f 1330//1330 1340//1340 1331//1331
+f 1331//1331 1340//1340 1341//1341
+f 1331//1331 1341//1341 1332//1332
+f 1333//1333 1342//1342 1343//1343
+f 1333//1333 1343//1343 1334//1334
+f 1334//1334 1343//1343 1344//1344
+f 1334//1334 1344//1344 1335//1335
+f 1335//1335 1344//1344 1345//1345
+f 1335//1335 1345//1345 1336//1336
+f 1336//1336 1345//1345 1346//1346
+f 1336//1336 1346//1346 1337//1337
+f 1337//1337 1346//1346 1347//1347
+f 1337//1337 1347//1347 1338//1338
+f 1338//1338 1347//1347 1348//1348
+f 1338//1338 1348//1348 1339//1339
+f 1339//1339 1348//1348 1349//1349
+f 1339//1339 1349//1349 1340//1340
+f 1340//1340 1349//1349 1350//1350
+f 1340//1340 1350//1350 1341//1341
+f 1342//1342 1351//1351 1352//1352
+f 1342//1342 1352//1352 1343//1343
+f 1343//1343 1352//1352 1353//1353
+f 1343//1343 1353//1353 1344//1344
+f 1344//1344 1353//1353 1354//1354
+f 1344//1344 1354//1354 1345//1345
+f 1345//1345 1354//1354 1355//1355
+f 1345//1345 1355//1355 1346//1346
+f 1346//1346 1355//1355 1356//1356
+f 1346//1346 1356//1356 1347//1347
+f 1347//1347 1356//1356 1357//1357
+f 1347//1347 1357//1357 1348//1348
+f 1348//1348 1357//1357 1358//1358
+f 1348//1348 1358//1358 1349//1349
+f 1349//1349 1358//1358 1359//1359
+f 1349//1349 1359//1359 1350//1350
+f 1351//1351 1360//1360 1361//1361
+f 1351//1351 1361//1361 1352//1352
+f 1352//1352 1361//1361 1362//1362
+f 1352//1352 1362//1362 1353//1353
+f 1353//1353 1362//1362 1363//1363
+f 1353//1353 1363//1363 1354//1354
+f 1354//1354 1363//1363 1364//1364
+f 1354//1354 1364//1364 1355//1355
+f 1355//1355 1364//1364 1365//1365
+f 1355//1355 1365//1365 1356//1356
+f 1356//1356 1365//1365 1366//1366
+f 1356//1356 1366//1366 1357//1357
+f 1357//1357 1366//1366 1367//1367
+f 1357//1357 1367//1367 1358//1358
+f 1358//1358 1367//1367 1368//1368
+f 1358//1358 1368//1368 1359//1359
+f 1360//1360 1369//1369 1370//1370
+f 1360//1360 1370//1370 1361//1361
+f 1361//1361 1370//1370 1371//1371
+f 1361//1361 1371//1371 1362//1362
+f 1362//1362 1371//1371 1372//1372
+f 1362//1362 1372//1372 1363//1363
+f 1363//1363 1372//1372 1373//1373
+f 1363//1363 1373//1373 1364//1364
+f 1364//1364 1373//1373 1374//1374
+f 1364//1364 1374//1374 1365//1365
+f 1365//1365 1374//1374 1375//1375
+f 1365//1365 1375//1375 1366//1366
+f 1366//1366 1375//1375 1376//1376
+f 1366//1366 1376//1376 1367//1367
+f 1367//1367 1376//1376 1377//1377
+f 1367//1367 1377//1377 1368//1368
+f 1369//1369 1378//1378 1379//1379
+f 1369//1369 1379//1379 1370//1370
+f 1370//1370 1379//1379 1380//1380
+f 1370//1370 1380//1380 1371//1371
+f 1371//1371 1380//1380 1381//1381
+f 1371//1371 1381//1381 1372//1372
+f 1372//1372 1381//1381 1382//1382
+f 1372//1372 1382//1382 1373//1373
+f 1373//1373 1382//1382 1383//1383
+f 1373//1373 1383//1383 1374//1374
+f 1374//1374 1383//1383 1384//1384
+f 1374//1374 1384//1384 1375//1375
+f 1375//1375 1384//1384 1385//1385
+f 1375//1375 1385//1385 1376//1376
+f 1376//1376 1385//1385 1386//1386
+f 1376//1376 1386//1386 1377//1377
+f 1378//1378 1387//1387 1388//1388
+f 1378//1378 1388//1388 1379//1379
+f 1379//1379 1388//1388 1389//1389
+f 1379//1379 1389//1389 1380//1380
+f 1380//1380 1389//1389 1390//1390
+f 1380//1380 1390//1390 1381//1381
+f 1381//1381 1390//1390 1391//1391
+f 1381//1381 1391//1391 1382//1382
+f 1382//1382 1391//1391 1392//1392
+f 1382//1382 1392//1392 1383//1383
+f 1383//1383 1392//1392 1393//1393
+f 1383//1383 1393//1393 1384//1384
+f 1384//1384 1393//1393 1394//1394
+f 1384//1384 1394//1394 1385//1385
+f 1385//1385 1394//1394 1395//1395
+f 1385//1385 1395//1395 1386//1386
+f 1387//1387 1396//1396 1397//1397
+f 1387//1387 1397//1397 1388//1388
+f 1388//1388 1397//1397 1398//1398
+f 1388//1388 1398//1398 1389//1389
+f 1389//1389 1398//1398 1399//1399
+f 1389//1389 1399//1399 1390//1390
+f 1390//1390 1399//1399 1400//1400
+f 1390//1390 1400//1400 1391//1391
+f 1391//1391 1400//1400 1401//1401
+f 1391//1391 1401//1401 1392//1392
+f 1392//1392 1401//1401 1402//1402
+f 1392//1392 1402//1402 1393//1393
+f 1393//1393 1402//1402 1403//1403
+f 1393//1393 1403//1403 1394//1394
+f 1394//1394 1403//1403 1404//1404
+f 1394//1394 1404//1404 1395//1395
+f 1396//1396 1405//1405 1406//1406
+f 1396//1396 1406//1406 1397//1397
+f 1397//1397 1406//1406 1407//1407
+f 1397//1397 1407//1407 1398//1398
+f 1398//1398 1407//1407 1408//1408
+f 1398//1398 1408//1408 1399//1399
+f 1399//1399 1408//1408 1409//1409
+f 1399//1399 1409//1409 1400//1400
+f 1400//1400 1409//1409 1410//1410
+f 1400//1400 1410//1410 1401//1401
+f 1401//1401 1410//1410 1411//1411
+f 1401//1401 1411//1411 1402//1402
+f 1402//1402 1411//1411 1412//1412
+f 1402//1402 1412//1412 1403//1403
+f 1403//1403 1412//1412 1413//1413
+f 1403//1403 1413//1413 1404//1404
+f 1405//1405 1414//1414 1415//1415
+f 1405//1405 1415//1415 1406//1406
+f 1406//1406 1415//1415 1416//1416
+f 1406//1406 1416//1416 1407//1407
+f 1407//1407 1416//1416 1417//1417
+f 1407//1407 1417//1417 1408//1408
+f 1408//1408 1417//1417 1418//1418
+f 1408//1408 1418//1418 1409//1409
+f 1409//1409 1418//1418 1419//1419
+f 1409//1409 1419//1419 1410//1410
+f 1410//1410 1419//1419 1420//1420
+f 1410//1410 1420//1420 1411//1411
+f 1411//1411 1420//1420 1421//1421
+f 1411//1411 1421//1421 1412//1412
+f 1412//1412 1421//1421 1422//1422
+f 1412//1412 1422//1422 1413//1413
+f 1414//1414 1423//1423 1424//1424
+f 1414//1414 1424//1424 1415//1415
+f 1415//1415 1424//1424 1425//1425
+f 1415//1415 1425//1425 1416//1416
+f 1416//1416 1425//1425 1426//1426
+f 1416//1416 1426//1426 1417//1417
+f 1417//1417 1426//1426 1427//1427
+f 1417//1417 1427//1427 1418//1418
+f 1418//1418 1427//1427 1428//1428
+f 1418//1418 1428//1428 1419//1419
+f 1419//1419 1428//1428 1429//1429
+f 1419//1419 1429//1429 1420//1420
+f 1420//1420 1429//1429 1430//1430
+f 1420//1420 1430//1430 1421//1421
+f 1421//1421 1430//1430 1431//1431
+f 1421//1421 1431//1431 1422//1422
+f 1423//1423 1432//1432 1433//1433
+f 1423//1423 1433//1433 1424//1424
+f 1424//1424 1433//1433 1434//1434
+f 1424//1424 1434//1434 1425//1425
+f 1425//1425 1434//1434 1435//1435
+f 1425//1425 1435//1435 1426//1426
+f 1426//1426 1435//1435 1436//1436
+f 1426//1426 1436//1436 1427//1427
+f 1427//1427 1436//1436 1437//1437
+f 1427//1427 1437//1437 1428//1428
+f 1428//1428 1437//1437 1438//1438
+f 1428//1428 1438//1438 1429//1429
+f 1429//1429 1438//1438 1439//1439
+f 1429//1429 1439//1439 1430//1430
+f 1430//1430 1439//1439 1440//1440
+f 1430//1430 1440//1440 1431//1431
+f 1432//1432 1297//1297 1300//1300
+f 1432//1432 1300//1300 1433//1433
+f 1433//1433 1300//1300 1302//1302
+f 1433//1433 1302//1302 1434//1434
+f 1434//1434 1302//1302 1304//1304
+f 1434//1434 1304//1304 1435//1435
+f 1435//1435 1304//1304 1306//1306
+f 1435//1435 1306//1306 1436//1436
+f 1436//1436 1306//1306 1308//1308
+f 1436//1436 1308//1308 1437//1437
+f 1437//1437 1308//1308 1310//1310
+f 1437//1437 1310//1310 1438//1438
+f 1438//1438 1310//1310 1312//1312
+f 1438//1438 1312//1312 1439//1439
+f 1439//1439 1312//1312 1314//1314
+f 1439//1439 1314//1314 1440//1440
+f 1314//1314 1313//1313 1441//1441
+f 1314//1314 1441//1441 1442//1442
+f 1442//1442 1441//1441 1443//1443
+f 1442//1442 1443//1443 1444//1444
+f 1444//1444 1443//1443 1445//1445
+f 1444//1444 1445//1445 1446//1446
+f 1446//1446 1445//1445 1447//1447
+f 1446//1446 1447//1447 1448//1448
+f 1448//1448 1447//1447 1449//1449
+f 1448//1448 1449//1449 1450//1450
+f 1450//1450 1449//1449 1451//1451
+f 1450//1450 1451//1451 1452//1452
+f 1452//1452 1451//1451 1453//1453
+f 1452//1452 1453//1453 1454//1454
+f 1454//1454 1453//1453 1455//1455
+f 1454//1454 1455//1455 1456//1456
+f 1313//1313 1323//1323 1457//1457
+f 1313//1313 1457//1457 1441//1441
+f 1441//1441 1457//1457 1458//1458
+f 1441//1441 1458//1458 1443//1443
+f 1443//1443 1458//1458 1459//1459
+f 1443//1443 1459//1459 1445//1445
+f 1445//1445 1459//1459 1460//1460
+f 1445//1445 1460//1460 1447//1447
+f 1447//1447 1460//1460 1461//1461
+f 1447//1447 1461//1461 1449//1449
+f 1449//1449 1461//1461 1462//1462
+f 1449//1449 1462//1462 1451//1451
+f 1451//1451 1462//1462 1463//1463
+f 1451//1451 1463//1463 1453//1453
+f 1453//1453 1463//1463 1464//1464
+f 1453//1453 1464//1464 1455//1455
+f 1323//1323 1332//1332 1465//1465
+f 1323//1323 1465//1465 1457//1457
+f 1457//1457 1465//1465 1466//1466
+f 1457//1457 1466//1466 1458//1458
+f 1458//1458 1466//1466 1467//1467
+f 1458//1458 1467//1467 1459//1459
+f 1459//1459 1467//1467 1468//1468
+f 1459//1459 1468//1468 1460//1460
+f 1460//1460 1468//1468 1469//1469
+f 1460//1460 1469//1469 1461//1461
+f 1461//1461 1469//1469 1470//1470
+f 1461//1461 1470//1470 1462//1462
+f 1462//1462 1470//1470 1471//1471
+f 1462//1462 1471//1471 1463//1463
+f 1463//1463 1471//1471 1472//1472
+f 1463//1463 1472//1472 1464//1464
+f 1332//1332 1341//1341 1473//1473
+f 1332//1332 1473//1473 1465//1465
+f 1465//1465 1473//1473 1474//1474
+f 1465//1465 1474//1474 1466//1466
+f 1466//1466 1474//1474 1475//1475
+f 1466//1466 1475//1475 1467//1467
+f 1467//1467 1475//1475 1476//1476
+f 1467//1467 1476//1476 1468//1468
+f 1468//1468 1476//1476 1477//1477
+f 1468//1468 1477//1477 1469//1469
+f 1469//1469 1477//1477 1478//1478
+f 1469//1469 1478//1478 1470//1470
+f 1470//1470 1478//1478 1479//1479
+f 1470//1470 1479//1479 1471//1471
+f 1471//1471 1479//1479 1480//1480
+f 1471//1471 1480//1480 1472//1472
+f 1341//1341 1350//1350 1481//1481
+f 1341//1341 1481//1481 1473//1473
+f 1473//1473 1481//1481 1482//1482
+f 1473//1473 1482//1482 1474//1474
+f 1474//1474 1482//1482 1483//1483
+f 1474//1474 1483//1483 1475//1475
+f 1475//1475 1483//1483 1484//1484
+f 1475//1475 1484//1484 1476//1476
+f 1476//1476 1484//1484 1485//1485
+f 1476//1476 1485//1485 1477//1477
+f 1477//1477 1485//1485 1486//1486
+f 1477//1477 1486//1486 1478//1478
+f 1478//1478 1486//1486 1487//1487
+f 1478//1478 1487//1487 1479//1479
+f 1479//1479 1487//1487 1488//1488
+f 1479//1479 1488//1488 1480//1480
+f 1350//1350 1359//1359 1489//1489
+f 1350//1350 1489//1489 1481//1481
+f 1481//1481 1489//1489 1490//1490
+f 1481//1481 1490//1490 1482//1482
+f 1482//1482 1490//1490 1491//1491
+f 1482//1482 1491//1491 1483//1483
+f 1483//1483 1491//1491 1492//1492
+f 1483//1483 1492//1492 1484//1484
+f 1484//1484 1492//1492 1493//1493
+f 1484//1484 1493//1493 1485//1485
+f 1485//1485 1493//1493 1494//1494
+f 1485//1485 1494//1494 1486//1486
+f 1486//1486 1494//1494 1495//1495
+f 1486//1486 1495//1495 1487//1487
+f 1487//1487 1495//1495 1496//1496
+f 1487//1487 1496//1496 1488//1488
+f 1359//1359 1368//1368 1497//1497
+f 1359//1359 1497//1497 1489//1489
+f 1489//1489 1497//1497 1498//1498
+f 1489//1489 1498//1498 1490//1490
+f 1490//1490 1498//1498 1499//1499
+f 1490//1490 1499//1499 1491//1491
+f 1491//1491 1499//1499 1500//1500
+f 1491//1491 1500//1500 1492//1492
+f 1492//1492 1500//1500 1501//1501
+f 1492//1492 1501//1501 1493//1493
+f 1493//1493 1501//1501 1502//1502
+f 1493//1493 1502//1502 1494//1494
+f 1494//1494 1502//1502 1503//1503
+f 1494//1494 1503//1503 1495//1495
+f 1495//1495 1503//1503 1504//1504
+f 1495//1495 1504//1504 1496//1496
+f 1368//1368 1377//1377 1505//1505
+f 1368//1368 1505//1505 1497//1497
+f 1497//1497 1505//1505 1506//1506
+f 1497//1497 1506//1506 1498//1498
+f 1498//1498 1506//1506 1507//1507
+f 1498//1498 1507//1507 1499//1499
+f 1499//1499 1507//1507 1508//1508
+f 1499//1499 1508//1508 1500//1500
+f 1500//1500 1508//1508 1509//1509
+f 1500//1500 1509//1509 1501//1501
+f 1501//1501 1509//1509 1510//1510
+f 1501//1501 1510//1510 1502//1502
+f 1502//1502 1510//1510 1511//1511
+f 1502//1502 1511//1511 1503//1503
+f 1503//1503 1511//1511 1512//1512
+f 1503//1503 1512//1512 1504//1504
+f 1377//1377 1386//1386 1513//1513
+f 1377//1377 1513//1513 1505//1505
+f 1505//1505 1513//1513 1514//1514
+f 1505//1505 1514//1514 1506//1506
+f 1506//1506 1514//1514 1515//1515
+f 1506//1506 1515//1515 1507//1507
+f 1507//1507 1515//1515 1516//1516
+f 1507//1507 1516//1516 1508//1508
+f 1508//1508 1516//1516 1517//1517
+f 1508//1508 1517//1517 1509//1509
+f 1509//1509 1517//1517 1518//1518
+f 1509//1509 1518//1518 1510//1510
+f 1510//1510 1518//1518 1519//1519
+f 1510//1510 1519//1519 1511//1511
+f 1511//1511 1519//1519 1520//1520
+f 1511//1511 1520//1520 1512//1512
+f 1386//1386 1395//1395 1521//1521
+f 1386//1386 1521//1521 1513//1513
+f 1513//1513 1521//1521 1522//1522
+f 1513//1513 1522//1522 1514//1514
+f 1514//1514 1522//1522 1523//1523
+f 1514//1514 1523//1523 1515//1515
+f 1515//1515 1523//1523 1524//1524
+f 1515//1515 1524//1524 1516//1516
+f 1516//1516 1524//1524 1525//1525
+f 1516//1516 1525//1525 1517//1517
+f 1517//1517 1525//1525 1526//1526
+f 1517//1517 1526//1526 1518//1518
+f 1518//1518 1526//1526 1527//1527
+f 1518//1518 1527//1527 1519//1519
+f 1519//1519 1527//1527 1528//1528
+f 1519//1519 1528//1528 1520//1520
+f 1395//1395 1404//1404 1529//1529
+f 1395//1395 1529//1529 1521//1521
+f 1521//1521 1529//1529 1530//1530
+f 1521//1521 1530//1530 1522//1522
+f 1522//1522 1530//1530 1531//1531
+f 1522//1522 1531//1531 1523//1523
+f 1523//1523 1531//1531 1532//1532
+f 1523//1523 1532//1532 1524//1524
+f 1524//1524 1532//1532 1533//1533
+f 1524//1524 1533//1533 1525//1525
+f 1525//1525 1533//1533 1534//1534
+f 1525//1525 1534//1534 1526//1526
+f 1526//1526 1534//1534 1535//1535
+f 1526//1526 1535//1535 1527//1527
+f 1527//1527 1535//1535 1536//1536
+f 1527//1527 1536//1536 1528//1528
+f 1404//1404 1413//1413 1537//1537
+f 1404//1404 1537//1537 1529//1529
+f 1529//1529 1537//1537 1538//1538
+f 1529//1529 1538//1538 1530//1530
+f 1530//1530 1538//1538 1539//1539
+f 1530//1530 1539//1539 1531//1531
+f 1531//1531 1539//1539 1540//1540
+f 1531//1531 1540//1540 1532//1532
+f 1532//1532 1540//1540 1541//1541
+f 1532//1532 1541//1541 1533//1533
+f 1533//1533 1541//1541 1542//1542
+f 1533//1533 1542//1542 1534//1534
+f 1534//1534 1542//1542 1543//1543
+f 1534//1534 1543//1543 1535//1535
+f 1535//1535 1543//1543 1544//1544
+f 1535//1535 1544//1544 1536//1536
+f 1413//1413 1422//1422 1545//1545
+f 1413//1413 1545//1545 1537//1537
+f 1537//1537 1545//1545 1546//1546
+f 1537//1537 1546//1546 1538//1538
+f 1538//1538 1546//1546 1547//1547
+f 1538//1538 1547//1547 1539//1539
+f 1539//1539 1547//1547 1548//1548
+f 1539//1539 1548//1548 1540//1540
+f 1540//1540 1548//1548 1549//1549
+f 1540//1540 1549//1549 1541//1541
+f 1541//1541 1549//1549 1550//1550
+f 1541//1541 1550//1550 1542//1542
+f 1542//1542 1550//1550 1551//1551
+f 1542//1542 1551//1551 1543//1543
+f 1543//1543 1551//1551 1552//1552
+f 1543//1543 1552//1552 1544//1544
+f 1422//1422 1431//1431 1553//1553
+f 1422//1422 1553//1553 1545//1545
+f 1545//1545 1553//1553 1554//1554
+f 1545//1545 1554//1554 1546//1546
+f 1546//1546 1554//1554 1555//1555
+f 1546//1546 1555//1555 1547//1547
+f 1547//1547 1555//1555 1556//1556
+f 1547//1547 1556//1556 1548//1548
+f 1548//1548 1556//1556 1557//1557
+f 1548//1548 1557//1557 1549//1549
+f 1549//1549 1557//1557 1558//1558
+f 1549//1549 1558//1558 1550//1550
+f 1550//1550 1558//1558 1559//1559
+f 1550//1550 1559//1559 1551//1551
+f 1551//1551 1559//1559 1560//1560
+f 1551//1551 1560//1560 1552//1552
+f 1431//1431 1440//1440 1561//1561
+f 1431//1431 1561//1561 1553//1553
+f 1553//1553 1561//1561 1562//1562
+f 1553//1553 1562//1562 1554//1554
+f 1554//1554 1562//1562 1563//1563
+f 1554//1554 1563//1563 1555//1555
+f 1555//1555 1563//1563 1564//1564
+f 1555//1555 1564//1564 1556//1556
+f 1556//1556 1564//1564 1565//1565
+f 1556//1556 1565//1565 1557//1557
+f 1557//1557 1565//1565 1566//1566
+f 1557//1557 1566//1566 1558//1558
+f 1558//1558 1566//1566 1567//1567
+f 1558//1558 1567//1567 1559//1559
+f 1559//1559 1567//1567 1568//1568
+f 1559//1559 1568//1568 1560//1560
+f 1440//1440 1314//1314 1442//1442
+f 1440//1440 1442//1442 1561//1561
+f 1561//1561 1442//1442 1444//1444
+f 1561//1561 1444//1444 1562//1562
+f 1562//1562 1444//1444 1446//1446
+f 1562//1562 1446//1446 1563//1563
+f 1563//1563 1446//1446 1448//1448
+f 1563//1563 1448//1448 1564//1564
+f 1564//1564 1448//1448 1450//1450
+f 1564//1564 1450//1450 1565//1565
+f 1565//1565 1450//1450 1452//1452
+f 1565//1565 1452//1452 1566//1566
+f 1566//1566 1452//1452 1454//1454
+f 1566//1566 1454//1454 1567//1567
+f 1567//1567 1454//1454 1456//1456
+f 1567//1567 1456//1456 1568//1568
+f 1569//1569 1570//1570 1571//1571
+f 1570//1570 1569//1569 1572//1572
+f 1570//1570 1572//1572 1573//1573
+f 1573//1573 1572//1572 1574//1574
+f 1573//1573 1574//1574 1575//1575
+f 1575//1575 1574//1574 1576//1576
+f 1575//1575 1576//1576 1577//1577
+f 1577//1577 1576//1576 1578//1578
+f 1577//1577 1578//1578 1579//1579
+f 1579//1579 1578//1578 1580//1580
+f 1579//1579 1580//1580 1581//1581
+f 1581//1581 1580//1580 1582//1582
+f 1581//1581 1582//1582 1583//1583
+f 1583//1583 1582//1582 1584//1584
+f 1583//1583 1584//1584 1585//1585
+f 1586//1586 1569//1569 1571//1571
+f 1569//1569 1586//1586 1587//1587
+f 1569//1569 1587//1587 1572//1572
+f 1572//1572 1587//1587 1588//1588
+f 1572//1572 1588//1588 1574//1574
+f 1574//1574 1588//1588 1589//1589
+f 1574//1574 1589//1589 1576//1576
+f 1576//1576 1589//1589 1590//1590
+f 1576//1576 1590//1590 1578//1578
+f 1578//1578 1590//1590 1591//1591
+f 1578//1578 1591//1591 1580//1580
+f 1580//1580 1591//1591 1592//1592
+f 1580//1580 1592//1592 1582//1582
+f 1582//1582 1592//1592 1593//1593
+f 1582//1582 1593//1593 1584//1584
+f 1594//1594 1586//1586 1571//1571
+f 1586//1586 1594//1594 1595//1595
+f 1586//1586 1595//1595 1587//1587
+f 1587//1587 1595//1595 1596//1596
+f 1587//1587 1596//1596 1588//1588
+f 1588//1588 1596//1596 1597//1597
+f 1588//1588 1597//1597 1589//1589
+f 1589//1589 1597//1597 1598//1598
+f 1589//1589 1598//1598 1590//1590
+f 1590//1590 1598//1598 1599//1599
+f 1590//1590 1599//1599 1591//1591
+f 1591//1591 1599//1599 1600//1600
+f 1591//1591 1600//1600 1592//1592
+f 1592//1592 1600//1600 1601//1601
+f 1592//1592 1601//1601 1593//1593
+f 1602//1602 1594//1594 1571//1571
+f 1594//1594 1602//1602 1603//1603
+f 1594//1594 1603//1603 1595//1595
+f 1595//1595 1603//1603 1604//1604
+f 1595//1595 1604//1604 1596//1596
+f 1596//1596 1604//1604 1605//1605
+f 1596//1596 1605//1605 1597//1597
+f 1597//1597 1605//1605 1606//1606
+f 1597//1597 1606//1606 1598//1598
+f 1598//1598 1606//1606 1607//1607
+f 1598//1598 1607//1607 1599//1599
+f 1599//1599 1607//1607 1608//1608
+f 1599//1599 1608//1608 1600//1600
+f 1600//1600 1608//1608 1609//1609
+f 1600//1600 1609//1609 1601//1601
+f 1610//1610 1602//1602 1571//1571
+f 1602//1602 1610//1610 1611//1611
+f 1602//1602 1611//1611 1603//1603
+f 1603//1603 1611//1611 1612//1612
+f 1603//1603 1612//1612 1604//1604
+f 1604//1604 1612//1612 1613//1613
+f 1604//1604 1613//1613 1605//1605
+f 1605//1605 1613//1613 1614//1614
+f 1605//1605 1614//1614 1606//1606
+f 1606//1606 1614//1614 1615//1615
+f 1606//1606 1615//1615 1607//1607
+f 1607//1607 1615//1615 1616//1616
+f 1607//1607 1616//1616 1608//1608
+f 1608//1608 1616//1616 1617//1617
+f 1608//1608 1617//1617 1609//1609
+f 1618//1618 1610//1610 1571//1571
+f 1610//1610 1618//1618 1619//1619
+f 1610//1610 1619//1619 1611//1611
+f 1611//1611 1619//1619 1620//1620
+f 1611//1611 1620//1620 1612//1612
+f 1612//1612 1620//1620 1621//1621
+f 1612//1612 1621//1621 1613//1613
+f 1613//1613 1621//1621 1622//1622
+f 1613//1613 1622//1622 1614//1614
+f 1614//1614 1622//1622 1623//1623
+f 1614//1614 1623//1623 1615//1615
+f 1615//1615 1623//1623 1624//1624
+f 1615//1615 1624//1624 1616//1616
+f 1616//1616 1624//1624 1625//1625
+f 1616//1616 1625//1625 1617//1617
+f 1626//1626 1618//1618 1571//1571
+f 1618//1618 1626//1626 1627//1627
+f 1618//1618 1627//1627 1619//1619
+f 1619//1619 1627//1627 1628//1628
+f 1619//1619 1628//1628 1620//1620
+f 1620//1620 1628//1628 1629//1629
+f 1620//1620 1629//1629 1621//1621
+f 1621//1621 1629//1629 1630//1630
+f 1621//1621 1630//1630 1622//1622
+f 1622//1622 1630//1630 1631//1631
+f 1622//1622 1631//1631 1623//1623
+f 1623//1623 1631//1631 1632//1632
+f 1623//1623 1632//1632 1624//1624
+f 1624//1624 1632//1632 1633//1633
+f 1624//1624 1633//1633 1625//1625
+f 1634//1634 1626//1626 1571//1571
+f 1626//1626 1634//1634 1635//1635
+f 1626//1626 1635//1635 1627//1627
+f 1627//1627 1635//1635 1636//1636
+f 1627//1627 1636//1636 1628//1628
+f 1628//1628 1636//1636 1637//1637
+f 1628//1628 1637//1637 1629//1629
+f 1629//1629 1637//1637 1638//1638
+f 1629//1629 1638//1638 1630//1630
+f 1630//1630 1638//1638 1639//1639
+f 1630//1630 1639//1639 1631//1631
+f 1631//1631 1639//1639 1640//1640
+f 1631//1631 1640//1640 1632//1632
+f 1632//1632 1640//1640 1641//1641
+f 1632//1632 1641//1641 1633//1633
+f 1642//1642 1634//1634 1571//1571
+f 1634//1634 1642//1642 1643//1643
+f 1634//1634 1643//1643 1635//1635
+f 1635//1635 1643//1643 1644//1644
+f 1635//1635 1644//1644 1636//1636
+f 1636//1636 1644//1644 1645//1645
+f 1636//1636 1645//1645 1637//1637
+f 1637//1637 1645//1645 1646//1646
+f 1637//1637 1646//1646 1638//1638
+f 1638//1638 1646//1646 1647//1647
+f 1638//1638 1647//1647 1639//1639
+f 1639//1639 1647//1647 1648//1648
+f 1639//1639 1648//1648 1640//1640
+f 1640//1640 1648//1648 1649//1649
+f 1640//1640 1649//1649 1641//1641
+f 1650//1650 1642//1642 1571//1571
+f 1642//1642 1650//1650 1651//1651
+f 1642//1642 1651//1651 1643//1643
+f 1643//1643 1651//1651 1652//1652
+f 1643//1643 1652//1652 1644//1644
+f 1644//1644 1652//1652 1653//1653
+f 1644//1644 1653//1653 1645//1645
+f 1645//1645 1653//1653 1654//1654
+f 1645//1645 1654//1654 1646//1646
+f 1646//1646 1654//1654 1655//1655
+f 1646//1646 1655//1655 1647//1647
+f 1647//1647 1655//1655 1656//1656
+f 1647//1647 1656//1656 1648//1648
+f 1648//1648 1656//1656 1657//1657
+f 1648//1648 1657//1657 1649//1649
+f 1658//1658 1650//1650 1571//1571
+f 1650//1650 1658//1658 1659//1659
+f 1650//1650 1659//1659 1651//1651
+f 1651//1651 1659//1659 1660//1660
+f 1651//1651 1660//1660 1652//1652
+f 1652//1652 1660//1660 1661//1661
+f 1652//1652 1661//1661 1653//1653
+f 1653//1653 1661//1661 1662//1662
+f 1653//1653 1662//1662 1654//1654
+f 1654//1654 1662//1662 1663//1663
+f 1654//1654 1663//1663 1655//1655
+f 1655//1655 1663//1663 1664//1664
+f 1655//1655 1664//1664 1656//1656
+f 1656//1656 1664//1664 1665//1665
+f 1656//1656 1665//1665 1657//1657
+f 1666//1666 1658//1658 1571//1571
+f 1658//1658 1666//1666 1667//1667
+f 1658//1658 1667//1667 1659//1659
+f 1659//1659 1667//1667 1668//1668
+f 1659//1659 1668//1668 1660//1660
+f 1660//1660 1668//1668 1669//1669
+f 1660//1660 1669//1669 1661//1661
+f 1661//1661 1669//1669 1670//1670
+f 1661//1661 1670//1670 1662//1662
+f 1662//1662 1670//1670 1671//1671
+f 1662//1662 1671//1671 1663//1663
+f 1663//1663 1671//1671 1672//1672
+f 1663//1663 1672//1672 1664//1664
+f 1664//1664 1672//1672 1673//1673
+f 1664//1664 1673//1673 1665//1665
+f 1674//1674 1666//1666 1571//1571
+f 1666//1666 1674//1674 1675//1675
+f 1666//1666 1675//1675 1667//1667
+f 1667//1667 1675//1675 1676//1676
+f 1667//1667 1676//1676 1668//1668
+f 1668//1668 1676//1676 1677//1677
+f 1668//1668 1677//1677 1669//1669
+f 1669//1669 1677//1677 1678//1678
+f 1669//1669 1678//1678 1670//1670
+f 1670//1670 1678//1678 1679//1679
+f 1670//1670 1679//1679 1671//1671
+f 1671//1671 1679//1679 1680//1680
+f 1671//1671 1680//1680 1672//1672
+f 1672//1672 1680//1680 1681//1681
+f 1672//1672 1681//1681 1673//1673
+f 1682//1682 1674//1674 1571//1571
+f 1674//1674 1682//1682 1683//1683
+f 1674//1674 1683//1683 1675//1675
+f 1675//1675 1683//1683 1684//1684
+f 1675//1675 1684//1684 1676//1676
+f 1676//1676 1684//1684 1685//1685
+f 1676//1676 1685//1685 1677//1677
+f 1677//1677 1685//1685 1686//1686
+f 1677//1677 1686//1686 1678//1678
+f 1678//1678 1686//1686 1687//1687
+f 1678//1678 1687//1687 1679//1679
+f 1679//1679 1687//1687 1688//1688
+f 1679//1679 1688//1688 1680//1680
+f 1680//1680 1688//1688 1689//1689
+f 1680//1680 1689//1689 1681//1681
+f 1690//1690 1682//1682 1571//1571
+f 1682//1682 1690//1690 1691//1691
+f 1682//1682 1691//1691 1683//1683
+f 1683//1683 1691//1691 1692//1692
+f 1683//1683 1692//1692 1684//1684
+f 1684//1684 1692//1692 1693//1693
+f 1684//1684 1693//1693 1685//1685
+f 1685//1685 1693//1693 1694//1694
+f 1685//1685 1694//1694 1686//1686
+f 1686//1686 1694//1694 1695//1695
+f 1686//1686 1695//1695 1687//1687
+f 1687//1687 1695//1695 1696//1696
+f 1687//1687 1696//1696 1688//1688
+f 1688//1688 1696//1696 1697//1697
+f 1688//1688 1697//1697 1689//1689
+f 1698//1698 1690//1690 1571//1571
+f 1690//1690 1698//1698 1699//1699
+f 1690//1690 1699//1699 1691//1691
+f 1691//1691 1699//1699 1700//1700
+f 1691//1691 1700//1700 1692//1692
+f 1692//1692 1700//1700 1701//1701
+f 1692//1692 1701//1701 1693//1693
+f 1693//1693 1701//1701 1702//1702
+f 1693//1693 1702//1702 1694//1694
+f 1694//1694 1702//1702 1703//1703
+f 1694//1694 1703//1703 1695//1695
+f 1695//1695 1703//1703 1704//1704
+f 1695//1695 1704//1704 1696//1696
+f 1696//1696 1704//1704 1705//1705
+f 1696//1696 1705//1705 1697//1697
+f 1706//1706 1698//1698 1571//1571
+f 1698//1698 1706//1706 1707//1707
+f 1698//1698 1707//1707 1699//1699
+f 1699//1699 1707//1707 1708//1708
+f 1699//1699 1708//1708 1700//1700
+f 1700//1700 1708//1708 1709//1709
+f 1700//1700 1709//1709 1701//1701
+f 1701//1701 1709//1709 1710//1710
+f 1701//1701 1710//1710 1702//1702
+f 1702//1702 1710//1710 1711//1711
+f 1702//1702 1711//1711 1703//1703
+f 1703//1703 1711//1711 1712//1712
+f 1703//1703 1712//1712 1704//1704
+f 1704//1704 1712//1712 1713//1713
+f 1704//1704 1713//1713 1705//1705
+f 1714//1714 1706//1706 1571//1571
+f 1706//1706 1714//1714 1715//1715
+f 1706//1706 1715//1715 1707//1707
+f 1707//1707 1715//1715 1716//1716
+f 1707//1707 1716//1716 1708//1708
+f 1708//1708 1716//1716 1717//1717
+f 1708//1708 1717//1717 1709//1709
+f 1709//1709 1717//1717 1718//1718
+f 1709//1709 1718//1718 1710//1710
+f 1710//1710 1718//1718 1719//1719
+f 1710//1710 1719//1719 1711//1711
+f 1711//1711 1719//1719 1720//1720
+f 1711//1711 1720//1720 1712//1712
+f 1712//1712 1720//1720 1721//1721
+f 1712//1712 1721//1721 1713//1713
+f 1722//1722 1714//1714 1571//1571
+f 1714//1714 1722//1722 1723//1723
+f 1714//1714 1723//1723 1715//1715
+f 1715//1715 1723//1723 1724//1724
+f 1715//1715 1724//1724 1716//1716
+f 1716//1716 1724//1724 1725//1725
+f 1716//1716 1725//1725 1717//1717
+f 1717//1717 1725//1725 1726//1726
+f 1717//1717 1726//1726 1718//1718
+f 1718//1718 1726//1726 1727//1727
+f 1718//1718 1727//1727 1719//1719
+f 1719//1719 1727//1727 1728//1728
+f 1719//1719 1728//1728 1720//1720
+f 1720//1720 1728//1728 1729//1729
+f 1720//1720 1729//1729 1721//1721
+f 1730//1730 1722//1722 1571//1571
+f 1722//1722 1730//1730 1731//1731
+f 1722//1722 1731//1731 1723//1723
+f 1723//1723 1731//1731 1732//1732
+f 1723//1723 1732//1732 1724//1724
+f 1724//1724 1732//1732 1733//1733
+f 1724//1724 1733//1733 1725//1725
+f 1725//1725 1733//1733 1734//1734
+f 1725//1725 1734//1734 1726//1726
+f 1726//1726 1734//1734 1735//1735
+f 1726//1726 1735//1735 1727//1727
+f 1727//1727 1735//1735 1736//1736
+f 1727//1727 1736//1736 1728//1728
+f 1728//1728 1736//1736 1737//1737
+f 1728//1728 1737//1737 1729//1729
+f 1738//1738 1730//1730 1571//1571
+f 1730//1730 1738//1738 1739//1739
+f 1730//1730 1739//1739 1731//1731
+f 1731//1731 1739//1739 1740//1740
+f 1731//1731 1740//1740 1732//1732
+f 1732//1732 1740//1740 1741//1741
+f 1732//1732 1741//1741 1733//1733
+f 1733//1733 1741//1741 1742//1742
+f 1733//1733 1742//1742 1734//1734
+f 1734//1734 1742//1742 1743//1743
+f 1734//1734 1743//1743 1735//1735
+f 1735//1735 1743//1743 1744//1744
+f 1735//1735 1744//1744 1736//1736
+f 1736//1736 1744//1744 1745//1745
+f 1736//1736 1745//1745 1737//1737
+f 1746//1746 1738//1738 1571//1571
+f 1738//1738 1746//1746 1747//1747
+f 1738//1738 1747//1747 1739//1739
+f 1739//1739 1747//1747 1748//1748
+f 1739//1739 1748//1748 1740//1740
+f 1740//1740 1748//1748 1749//1749
+f 1740//1740 1749//1749 1741//1741
+f 1741//1741 1749//1749 1750//1750
+f 1741//1741 1750//1750 1742//1742
+f 1742//1742 1750//1750 1751//1751
+f 1742//1742 1751//1751 1743//1743
+f 1743//1743 1751//1751 1752//1752
+f 1743//1743 1752//1752 1744//1744
+f 1744//1744 1752//1752 1753//1753
+f 1744//1744 1753//1753 1745//1745
+f 1754//1754 1746//1746 1571//1571
+f 1746//1746 1754//1754 1755//1755
+f 1746//1746 1755//1755 1747//1747
+f 1747//1747 1755//1755 1756//1756
+f 1747//1747 1756//1756 1748//1748
+f 1748//1748 1756//1756 1757//1757
+f 1748//1748 1757//1757 1749//1749
+f 1749//1749 1757//1757 1758//1758
+f 1749//1749 1758//1758 1750//1750
+f 1750//1750 1758//1758 1759//1759
+f 1750//1750 1759//1759 1751//1751
+f 1751//1751 1759//1759 1760//1760
+f 1751//1751 1760//1760 1752//1752
+f 1752//1752 1760//1760 1761//1761
+f 1752//1752 1761//1761 1753//1753
+f 1762//1762 1754//1754 1571//1571
+f 1754//1754 1762//1762 1763//1763
+f 1754//1754 1763//1763 1755//1755
+f 1755//1755 1763//1763 1764//1764
+f 1755//1755 1764//1764 1756//1756
+f 1756//1756 1764//1764 1765//1765
+f 1756//1756 1765//1765 1757//1757
+f 1757//1757 1765//1765 1766//1766
+f 1757//1757 1766//1766 1758//1758
+f 1758//1758 1766//1766 1767//1767
+f 1758//1758 1767//1767 1759//1759
+f 1759//1759 1767//1767 1768//1768
+f 1759//1759 1768//1768 1760//1760
+f 1760//1760 1768//1768 1769//1769
+f 1760//1760 1769//1769 1761//1761
+f 1770//1770 1762//1762 1571//1571
+f 1762//1762 1770//1770 1771//1771
+f 1762//1762 1771//1771 1763//1763
+f 1763//1763 1771//1771 1772//1772
+f 1763//1763 1772//1772 1764//1764
+f 1764//1764 1772//1772 1773//1773
+f 1764//1764 1773//1773 1765//1765
+f 1765//1765 1773//1773 1774//1774
+f 1765//1765 1774//1774 1766//1766
+f 1766//1766 1774//1774 1775//1775
+f 1766//1766 1775//1775 1767//1767
+f 1767//1767 1775//1775 1776//1776
+f 1767//1767 1776//1776 1768//1768
+f 1768//1768 1776//1776 1777//1777
+f 1768//1768 1777//1777 1769//1769
+f 1778//1778 1770//1770 1571//1571
+f 1770//1770 1778//1778 1779//1779
+f 1770//1770 1779//1779 1771//1771
+f 1771//1771 1779//1779 1780//1780
+f 1771//1771 1780//1780 1772//1772
+f 1772//1772 1780//1780 1781//1781
+f 1772//1772 1781//1781 1773//1773
+f 1773//1773 1781//1781 1782//1782
+f 1773//1773 1782//1782 1774//1774
+f 1774//1774 1782//1782 1783//1783
+f 1774//1774 1783//1783 1775//1775
+f 1775//1775 1783//1783 1784//1784
+f 1775//1775 1784//1784 1776//1776
+f 1776//1776 1784//1784 1785//1785
+f 1776//1776 1785//1785 1777//1777
+f 1786//1786 1778//1778 1571//1571
+f 1778//1778 1786//1786 1787//1787
+f 1778//1778 1787//1787 1779//1779
+f 1779//1779 1787//1787 1788//1788
+f 1779//1779 1788//1788 1780//1780
+f 1780//1780 1788//1788 1789//1789
+f 1780//1780 1789//1789 1781//1781
+f 1781//1781 1789//1789 1790//1790
+f 1781//1781 1790//1790 1782//1782
+f 1782//1782 1790//1790 1791//1791
+f 1782//1782 1791//1791 1783//1783
+f 1783//1783 1791//1791 1792//1792
+f 1783//1783 1792//1792 1784//1784
+f 1784//1784 1792//1792 1793//1793
+f 1784//1784 1793//1793 1785//1785
+f 1794//1794 1786//1786 1571//1571
+f 1786//1786 1794//1794 1795//1795
+f 1786//1786 1795//1795 1787//1787
+f 1787//1787 1795//1795 1796//1796
+f 1787//1787 1796//1796 1788//1788
+f 1788//1788 1796//1796 1797//1797
+f 1788//1788 1797//1797 1789//1789
+f 1789//1789 1797//1797 1798//1798
+f 1789//1789 1798//1798 1790//1790
+f 1790//1790 1798//1798 1799//1799
+f 1790//1790 1799//1799 1791//1791
+f 1791//1791 1799//1799 1800//1800
+f 1791//1791 1800//1800 1792//1792
+f 1792//1792 1800//1800 1801//1801
+f 1792//1792 1801//1801 1793//1793
+f 1802//1802 1794//1794 1571//1571
+f 1794//1794 1802//1802 1803//1803
+f 1794//1794 1803//1803 1795//1795
+f 1795//1795 1803//1803 1804//1804
+f 1795//1795 1804//1804 1796//1796
+f 1796//1796 1804//1804 1805//1805
+f 1796//1796 1805//1805 1797//1797
+f 1797//1797 1805//1805 1806//1806
+f 1797//1797 1806//1806 1798//1798
+f 1798//1798 1806//1806 1807//1807
+f 1798//1798 1807//1807 1799//1799
+f 1799//1799 1807//1807 1808//1808
+f 1799//1799 1808//1808 1800//1800
+f 1800//1800 1808//1808 1809//1809
+f 1800//1800 1809//1809 1801//1801
+f 1810//1810 1802//1802 1571//1571
+f 1802//1802 1810//1810 1811//1811
+f 1802//1802 1811//1811 1803//1803
+f 1803//1803 1811//1811 1812//1812
+f 1803//1803 1812//1812 1804//1804
+f 1804//1804 1812//1812 1813//1813
+f 1804//1804 1813//1813 1805//1805
+f 1805//1805 1813//1813 1814//1814
+f 1805//1805 1814//1814 1806//1806
+f 1806//1806 1814//1814 1815//1815
+f 1806//1806 1815//1815 1807//1807
+f 1807//1807 1815//1815 1816//1816
+f 1807//1807 1816//1816 1808//1808
+f 1808//1808 1816//1816 1817//1817
+f 1808//1808 1817//1817 1809//1809
+f 1818//1818 1810//1810 1571//1571
+f 1810//1810 1818//1818 1819//1819
+f 1810//1810 1819//1819 1811//1811
+f 1811//1811 1819//1819 1820//1820
+f 1811//1811 1820//1820 1812//1812
+f 1812//1812 1820//1820 1821//1821
+f 1812//1812 1821//1821 1813//1813
+f 1813//1813 1821//1821 1822//1822
+f 1813//1813 1822//1822 1814//1814
+f 1814//1814 1822//1822 1823//1823
+f 1814//1814 1823//1823 1815//1815
+f 1815//1815 1823//1823 1824//1824
+f 1815//1815 1824//1824 1816//1816
+f 1816//1816 1824//1824 1825//1825
+f 1816//1816 1825//1825 1817//1817
+f 1570//1570 1818//1818 1571//1571
+f 1818//1818 1570//1570 1573//1573
+f 1818//1818 1573//1573 1819//1819
+f 1819//1819 1573//1573 1575//1575
+f 1819//1819 1575//1575 1820//1820
+f 1820//1820 1575//1575 1577//1577
+f 1820//1820 1577//1577 1821//1821
+f 1821//1821 1577//1577 1579//1579
+f 1821//1821 1579//1579 1822//1822
+f 1822//1822 1579//1579 1581//1581
+f 1822//1822 1581//1581 1823//1823
+f 1823//1823 1581//1581 1583//1583
+f 1823//1823 1583//1583 1824//1824
+f 1824//1824 1583//1583 1585//1585
+f 1824//1824 1585//1585 1825//1825
+f 1585//1585 1584//1584 1826//1826
+f 1585//1585 1826//1826 1827//1827
+f 1827//1827 1826//1826 1828//1828
+f 1827//1827 1828//1828 1829//1829
+f 1829//1829 1828//1828 1830//1830
+f 1829//1829 1830//1830 1831//1831
+f 1831//1831 1830//1830 1832//1832
+f 1831//1831 1832//1832 1833//1833
+f 1833//1833 1832//1832 1834//1834
+f 1833//1833 1834//1834 1835//1835
+f 1835//1835 1834//1834 1836//1836
+f 1835//1835 1836//1836 1837//1837
+f 1837//1837 1836//1836 1838//1838
+f 1837//1837 1838//1838 1839//1839
+f 1839//1839 1838//1838 1840//1840
+f 1839//1839 1840//1840 1841//1841
+f 1584//1584 1593//1593 1842//1842
+f 1584//1584 1842//1842 1826//1826
+f 1826//1826 1842//1842 1843//1843
+f 1826//1826 1843//1843 1828//1828
+f 1828//1828 1843//1843 1844//1844
+f 1828//1828 1844//1844 1830//1830
+f 1830//1830 1844//1844 1845//1845
+f 1830//1830 1845//1845 1832//1832
+f 1832//1832 1845//1845 1846//1846
+f 1832//1832 1846//1846 1834//1834
+f 1834//1834 1846//1846 1847//1847
+f 1834//1834 1847//1847 1836//1836
+f 1836//1836 1847//1847 1848//1848
+f 1836//1836 1848//1848 1838//1838
+f 1838//1838 1848//1848 1849//1849
+f 1838//1838 1849//1849 1840//1840
+f 1593//1593 1601//1601 1850//1850
+f 1593//1593 1850//1850 1842//1842
+f 1842//1842 1850//1850 1851//1851
+f 1842//1842 1851//1851 1843//1843
+f 1843//1843 1851//1851 1852//1852
+f 1843//1843 1852//1852 1844//1844
+f 1844//1844 1852//1852 1853//1853
+f 1844//1844 1853//1853 1845//1845
+f 1845//1845 1853//1853 1854//1854
+f 1845//1845 1854//1854 1846//1846
+f 1846//1846 1854//1854 1855//1855
+f 1846//1846 1855//1855 1847//1847
+f 1847//1847 1855//1855 1856//1856
+f 1847//1847 1856//1856 1848//1848
+f 1848//1848 1856//1856 1857//1857
+f 1848//1848 1857//1857 1849//1849
+f 1601//1601 1609//1609 1858//1858
+f 1601//1601 1858//1858 1850//1850
+f 1850//1850 1858//1858 1859//1859
+f 1850//1850 1859//1859 1851//1851
+f 1851//1851 1859//1859 1860//1860
+f 1851//1851 1860//1860 1852//1852
+f 1852//1852 1860//1860 1861//1861
+f 1852//1852 1861//1861 1853//1853
+f 1853//1853 1861//1861 1862//1862
+f 1853//1853 1862//1862 1854//1854
+f 1854//1854 1862//1862 1863//1863
+f 1854//1854 1863//1863 1855//1855
+f 1855//1855 1863//1863 1864//1864
+f 1855//1855 1864//1864 1856//1856
+f 1856//1856 1864//1864 1865//1865
+f 1856//1856 1865//1865 1857//1857
+f 1609//1609 1617//1617 1866//1866
+f 1609//1609 1866//1866 1858//1858
+f 1858//1858 1866//1866 1867//1867
+f 1858//1858 1867//1867 1859//1859
+f 1859//1859 1867//1867 1868//1868
+f 1859//1859 1868//1868 1860//1860
+f 1860//1860 1868//1868 1869//1869
+f 1860//1860 1869//1869 1861//1861
+f 1861//1861 1869//1869 1870//1870
+f 1861//1861 1870//1870 1862//1862
+f 1862//1862 1870//1870 1871//1871
+f 1862//1862 1871//1871 1863//1863
+f 1863//1863 1871//1871 1872//1872
+f 1863//1863 1872//1872 1864//1864
+f 1864//1864 1872//1872 1873//1873
+f 1864//1864 1873//1873 1865//1865
+f 1617//1617 1625//1625 1874//1874
+f 1617//1617 1874//1874 1866//1866
+f 1866//1866 1874//1874 1875//1875
+f 1866//1866 1875//1875 1867//1867
+f 1867//1867 1875//1875 1876//1876
+f 1867//1867 1876//1876 1868//1868
+f 1868//1868 1876//1876 1877//1877
+f 1868//1868 1877//1877 1869//1869
+f 1869//1869 1877//1877 1878//1878
+f 1869//1869 1878//1878 1870//1870
+f 1870//1870 1878//1878 1879//1879
+f 1870//1870 1879//1879 1871//1871
+f 1871//1871 1879//1879 1880//1880
+f 1871//1871 1880//1880 1872//1872
+f 1872//1872 1880//1880 1881//1881
+f 1872//1872 1881//1881 1873//1873
+f 1625//1625 1633//1633 1882//1882
+f 1625//1625 1882//1882 1874//1874
+f 1874//1874 1882//1882 1883//1883
+f 1874//1874 1883//1883 1875//1875
+f 1875//1875 1883//1883 1884//1884
+f 1875//1875 1884//1884 1876//1876
+f 1876//1876 1884//1884 1885//1885
+f 1876//1876 1885//1885 1877//1877
+f 1877//1877 1885//1885 1886//1886
+f 1877//1877 1886//1886 1878//1878
+f 1878//1878 1886//1886 1887//1887
+f 1878//1878 1887//1887 1879//1879
+f 1879//1879 1887//1887 1888//1888
+f 1879//1879 1888//1888 1880//1880
+f 1880//1880 1888//1888 1889//1889
+f 1880//1880 1889//1889 1881//1881
+f 1633//1633 1641//1641 1890//1890
+f 1633//1633 1890//1890 1882//1882
+f 1882//1882 1890//1890 1891//1891
+f 1882//1882 1891//1891 1883//1883
+f 1883//1883 1891//1891 1892//1892
+f 1883//1883 1892//1892 1884//1884
+f 1884//1884 1892//1892 1893//1893
+f 1884//1884 1893//1893 1885//1885
+f 1885//1885 1893//1893 1894//1894
+f 1885//1885 1894//1894 1886//1886
+f 1886//1886 1894//1894 1895//1895
+f 1886//1886 1895//1895 1887//1887
+f 1887//1887 1895//1895 1896//1896
+f 1887//1887 1896//1896 1888//1888
+f 1888//1888 1896//1896 1897//1897
+f 1888//1888 1897//1897 1889//1889
+f 1641//1641 1649//1649 1898//1898
+f 1641//1641 1898//1898 1890//1890
+f 1890//1890 1898//1898 1899//1899
+f 1890//1890 1899//1899 1891//1891
+f 1891//1891 1899//1899 1900//1900
+f 1891//1891 1900//1900 1892//1892
+f 1892//1892 1900//1900 1901//1901
+f 1892//1892 1901//1901 1893//1893
+f 1893//1893 1901//1901 1902//1902
+f 1893//1893 1902//1902 1894//1894
+f 1894//1894 1902//1902 1903//1903
+f 1894//1894 1903//1903 1895//1895
+f 1895//1895 1903//1903 1904//1904
+f 1895//1895 1904//1904 1896//1896
+f 1896//1896 1904//1904 1905//1905
+f 1896//1896 1905//1905 1897//1897
+f 1649//1649 1657//1657 1906//1906
+f 1649//1649 1906//1906 1898//1898
+f 1898//1898 1906//1906 1907//1907
+f 1898//1898 1907//1907 1899//1899
+f 1899//1899 1907//1907 1908//1908
+f 1899//1899 1908//1908 1900//1900
+f 1900//1900 1908//1908 1909//1909
+f 1900//1900 1909//1909 1901//1901
+f 1901//1901 1909//1909 1910//1910
+f 1901//1901 1910//1910 1902//1902
+f 1902//1902 1910//1910 1911//1911
+f 1902//1902 1911//1911 1903//1903
+f 1903//1903 1911//1911 1912//1912
+f 1903//1903 1912//1912 1904//1904
+f 1904//1904 1912//1912 1913//1913
+f 1904//1904 1913//1913 1905//1905
+f 1657//1657 1665//1665 1914//1914
+f 1657//1657 1914//1914 1906//1906
+f 1906//1906 1914//1914 1915//1915
+f 1906//1906 1915//1915 1907//1907
+f 1907//1907 1915//1915 1916//1916
+f 1907//1907 1916//1916 1908//1908
+f 1908//1908 1916//1916 1917//1917
+f 1908//1908 1917//1917 1909//1909
+f 1909//1909 1917//1917 1918//1918
+f 1909//1909 1918//1918 1910//1910
+f 1910//1910 1918//1918 1919//1919
+f 1910//1910 1919//1919 1911//1911
+f 1911//1911 1919//1919 1920//1920
+f 1911//1911 1920//1920 1912//1912
+f 1912//1912 1920//1920 1921//1921
+f 1912//1912 1921//1921 1913//1913
+f 1665//1665 1673//1673 1922//1922
+f 1665//1665 1922//1922 1914//1914
+f 1914//1914 1922//1922 1923//1923
+f 1914//1914 1923//1923 1915//1915
+f 1915//1915 1923//1923 1924//1924
+f 1915//1915 1924//1924 1916//1916
+f 1916//1916 1924//1924 1925//1925
+f 1916//1916 1925//1925 1917//1917
+f 1917//1917 1925//1925 1926//1926
+f 1917//1917 1926//1926 1918//1918
+f 1918//1918 1926//1926 1927//1927
+f 1918//1918 1927//1927 1919//1919
+f 1919//1919 1927//1927 1928//1928
+f 1919//1919 1928//1928 1920//1920
+f 1920//1920 1928//1928 1929//1929
+f 1920//1920 1929//1929 1921//1921
+f 1673//1673 1681//1681 1930//1930
+f 1673//1673 1930//1930 1922//1922
+f 1922//1922 1930//1930 1931//1931
+f 1922//1922 1931//1931 1923//1923
+f 1923//1923 1931//1931 1932//1932
+f 1923//1923 1932//1932 1924//1924
+f 1924//1924 1932//1932 1933//1933
+f 1924//1924 1933//1933 1925//1925
+f 1925//1925 1933//1933 1934//1934
+f 1925//1925 1934//1934 1926//1926
+f 1926//1926 1934//1934 1935//1935
+f 1926//1926 1935//1935 1927//1927
+f 1927//1927 1935//1935 1936//1936
+f 1927//1927 1936//1936 1928//1928
+f 1928//1928 1936//1936 1937//1937
+f 1928//1928 1937//1937 1929//1929
+f 1681//1681 1689//1689 1938//1938
+f 1681//1681 1938//1938 1930//1930
+f 1930//1930 1938//1938 1939//1939
+f 1930//1930 1939//1939 1931//1931
+f 1931//1931 1939//1939 1940//1940
+f 1931//1931 1940//1940 1932//1932
+f 1932//1932 1940//1940 1941//1941
+f 1932//1932 1941//1941 1933//1933
+f 1933//1933 1941//1941 1942//1942
+f 1933//1933 1942//1942 1934//1934
+f 1934//1934 1942//1942 1943//1943
+f 1934//1934 1943//1943 1935//1935
+f 1935//1935 1943//1943 1944//1944
+f 1935//1935 1944//1944 1936//1936
+f 1936//1936 1944//1944 1945//1945
+f 1936//1936 1945//1945 1937//1937
+f 1689//1689 1697//1697 1946//1946
+f 1689//1689 1946//1946 1938//1938
+f 1938//1938 1946//1946 1947//1947
+f 1938//1938 1947//1947 1939//1939
+f 1939//1939 1947//1947 1948//1948
+f 1939//1939 1948//1948 1940//1940
+f 1940//1940 1948//1948 1949//1949
+f 1940//1940 1949//1949 1941//1941
+f 1941//1941 1949//1949 1950//1950
+f 1941//1941 1950//1950 1942//1942
+f 1942//1942 1950//1950 1951//1951
+f 1942//1942 1951//1951 1943//1943
+f 1943//1943 1951//1951 1952//1952
+f 1943//1943 1952//1952 1944//1944
+f 1944//1944 1952//1952 1953//1953
+f 1944//1944 1953//1953 1945//1945
+f 1697//1697 1705//1705 1954//1954
+f 1697//1697 1954//1954 1946//1946
+f 1946//1946 1954//1954 1955//1955
+f 1946//1946 1955//1955 1947//1947
+f 1947//1947 1955//1955 1956//1956
+f 1947//1947 1956//1956 1948//1948
+f 1948//1948 1956//1956 1957//1957
+f 1948//1948 1957//1957 1949//1949
+f 1949//1949 1957//1957 1958//1958
+f 1949//1949 1958//1958 1950//1950
+f 1950//1950 1958//1958 1959//1959
+f 1950//1950 1959//1959 1951//1951
+f 1951//1951 1959//1959 1960//1960
+f 1951//1951 1960//1960 1952//1952
+f 1952//1952 1960//1960 1961//1961
+f 1952//1952 1961//1961 1953//1953
+f 1705//1705 1713//1713 1962//1962
+f 1705//1705 1962//1962 1954//1954
+f 1954//1954 1962//1962 1963//1963
+f 1954//1954 1963//1963 1955//1955
+f 1955//1955 1963//1963 1964//1964
+f 1955//1955 1964//1964 1956//1956
+f 1956//1956 1964//1964 1965//1965
+f 1956//1956 1965//1965 1957//1957
+f 1957//1957 1965//1965 1966//1966
+f 1957//1957 1966//1966 1958//1958
+f 1958//1958 1966//1966 1967//1967
+f 1958//1958 1967//1967 1959//1959
+f 1959//1959 1967//1967 1968//1968
+f 1959//1959 1968//1968 1960//1960
+f 1960//1960 1968//1968 1969//1969
+f 1960//1960 1969//1969 1961//1961
+f 1713//1713 1721//1721 1970//1970
+f 1713//1713 1970//1970 1962//1962
+f 1962//1962 1970//1970 1971//1971
+f 1962//1962 1971//1971 1963//1963
+f 1963//1963 1971//1971 1972//1972
+f 1963//1963 1972//1972 1964//1964
+f 1964//1964 1972//1972 1973//1973
+f 1964//1964 1973//1973 1965//1965
+f 1965//1965 1973//1973 1974//1974
+f 1965//1965 1974//1974 1966//1966
+f 1966//1966 1974//1974 1975//1975
+f 1966//1966 1975//1975 1967//1967
+f 1967//1967 1975//1975 1976//1976
+f 1967//1967 1976//1976 1968//1968
+f 1968//1968 1976//1976 1977//1977
+f 1968//1968 1977//1977 1969//1969
+f 1721//1721 1729//1729 1978//1978
+f 1721//1721 1978//1978 1970//1970
+f 1970//1970 1978//1978 1979//1979
+f 1970//1970 1979//1979 1971//1971
+f 1971//1971 1979//1979 1980//1980
+f 1971//1971 1980//1980 1972//1972
+f 1972//1972 1980//1980 1981//1981
+f 1972//1972 1981//1981 1973//1973
+f 1973//1973 1981//1981 1982//1982
+f 1973//1973 1982//1982 1974//1974
+f 1974//1974 1982//1982 1983//1983
+f 1974//1974 1983//1983 1975//1975
+f 1975//1975 1983//1983 1984//1984
+f 1975//1975 1984//1984 1976//1976
+f 1976//1976 1984//1984 1985//1985
+f 1976//1976 1985//1985 1977//1977
+f 1729//1729 1737//1737 1986//1986
+f 1729//1729 1986//1986 1978//1978
+f 1978//1978 1986//1986 1987//1987
+f 1978//1978 1987//1987 1979//1979
+f 1979//1979 1987//1987 1988//1988
+f 1979//1979 1988//1988 1980//1980
+f 1980//1980 1988//1988 1989//1989
+f 1980//1980 1989//1989 1981//1981
+f 1981//1981 1989//1989 1990//1990
+f 1981//1981 1990//1990 1982//1982
+f 1982//1982 1990//1990 1991//1991
+f 1982//1982 1991//1991 1983//1983
+f 1983//1983 1991//1991 1992//1992
+f 1983//1983 1992//1992 1984//1984
+f 1984//1984 1992//1992 1993//1993
+f 1984//1984 1993//1993 1985//1985
+f 1737//1737 1745//1745 1994//1994
+f 1737//1737 1994//1994 1986//1986
+f 1986//1986 1994//1994 1995//1995
+f 1986//1986 1995//1995 1987//1987
+f 1987//1987 1995//1995 1996//1996
+f 1987//1987 1996//1996 1988//1988
+f 1988//1988 1996//1996 1997//1997
+f 1988//1988 1997//1997 1989//1989
+f 1989//1989 1997//1997 1998//1998
+f 1989//1989 1998//1998 1990//1990
+f 1990//1990 1998//1998 1999//1999
+f 1990//1990 1999//1999 1991//1991
+f 1991//1991 1999//1999 2000//2000
+f 1991//1991 2000//2000 1992//1992
+f 1992//1992 2000//2000 2001//2001
+f 1992//1992 2001//2001 1993//1993
+f 1745//1745 1753//1753 2002//2002
+f 1745//1745 2002//2002 1994//1994
+f 1994//1994 2002//2002 2003//2003
+f 1994//1994 2003//2003 1995//1995
+f 1995//1995 2003//2003 2004//2004
+f 1995//1995 2004//2004 1996//1996
+f 1996//1996 2004//2004 2005//2005
+f 1996//1996 2005//2005 1997//1997
+f 1997//1997 2005//2005 2006//2006
+f 1997//1997 2006//2006 1998//1998
+f 1998//1998 2006//2006 2007//2007
+f 1998//1998 2007//2007 1999//1999
+f 1999//1999 2007//2007 2008//2008
+f 1999//1999 2008//2008 2000//2000
+f 2000//2000 2008//2008 2009//2009
+f 2000//2000 2009//2009 2001//2001
+f 1753//1753 1761//1761 2010//2010
+f 1753//1753 2010//2010 2002//2002
+f 2002//2002 2010//2010 2011//2011
+f 2002//2002 2011//2011 2003//2003
+f 2003//2003 2011//2011 2012//2012
+f 2003//2003 2012//2012 2004//2004
+f 2004//2004 2012//2012 2013//2013
+f 2004//2004 2013//2013 2005//2005
+f 2005//2005 2013//2013 2014//2014
+f 2005//2005 2014//2014 2006//2006
+f 2006//2006 2014//2014 2015//2015
+f 2006//2006 2015//2015 2007//2007
+f 2007//2007 2015//2015 2016//2016
+f 2007//2007 2016//2016 2008//2008
+f 2008//2008 2016//2016 2017//2017
+f 2008//2008 2017//2017 2009//2009
+f 1761//1761 1769//1769 2018//2018
+f 1761//1761 2018//2018 2010//2010
+f 2010//2010 2018//2018 2019//2019
+f 2010//2010 2019//2019 2011//2011
+f 2011//2011 2019//2019 2020//2020
+f 2011//2011 2020//2020 2012//2012
+f 2012//2012 2020//2020 2021//2021
+f 2012//2012 2021//2021 2013//2013
+f 2013//2013 2021//2021 2022//2022
+f 2013//2013 2022//2022 2014//2014
+f 2014//2014 2022//2022 2023//2023
+f 2014//2014 2023//2023 2015//2015
+f 2015//2015 2023//2023 2024//2024
+f 2015//2015 2024//2024 2016//2016
+f 2016//2016 2024//2024 2025//2025
+f 2016//2016 2025//2025 2017//2017
+f 1769//1769 1777//1777 2026//2026
+f 1769//1769 2026//2026 2018//2018
+f 2018//2018 2026//2026 2027//2027
+f 2018//2018 2027//2027 2019//2019
+f 2019//2019 2027//2027 2028//2028
+f 2019//2019 2028//2028 2020//2020
+f 2020//2020 2028//2028 2029//2029
+f 2020//2020 2029//2029 2021//2021
+f 2021//2021 2029//2029 2030//2030
+f 2021//2021 2030//2030 2022//2022
+f 2022//2022 2030//2030 2031//2031
+f 2022//2022 2031//2031 2023//2023
+f 2023//2023 2031//2031 2032//2032
+f 2023//2023 2032//2032 2024//2024
+f 2024//2024 2032//2032 2033//2033
+f 2024//2024 2033//2033 2025//2025
+f 1777//1777 1785//1785 2034//2034
+f 1777//1777 2034//2034 2026//2026
+f 2026//2026 2034//2034 2035//2035
+f 2026//2026 2035//2035 2027//2027
+f 2027//2027 2035//2035 2036//2036
+f 2027//2027 2036//2036 2028//2028
+f 2028//2028 2036//2036 2037//2037
+f 2028//2028 2037//2037 2029//2029
+f 2029//2029 2037//2037 2038//2038
+f 2029//2029 2038//2038 2030//2030
+f 2030//2030 2038//2038 2039//2039
+f 2030//2030 2039//2039 2031//2031
+f 2031//2031 2039//2039 2040//2040
+f 2031//2031 2040//2040 2032//2032
+f 2032//2032 2040//2040 2041//2041
+f 2032//2032 2041//2041 2033//2033
+f 1785//1785 1793//1793 2042//2042
+f 1785//1785 2042//2042 2034//2034
+f 2034//2034 2042//2042 2043//2043
+f 2034//2034 2043//2043 2035//2035
+f 2035//2035 2043//2043 2044//2044
+f 2035//2035 2044//2044 2036//2036
+f 2036//2036 2044//2044 2045//2045
+f 2036//2036 2045//2045 2037//2037
+f 2037//2037 2045//2045 2046//2046
+f 2037//2037 2046//2046 2038//2038
+f 2038//2038 2046//2046 2047//2047
+f 2038//2038 2047//2047 2039//2039
+f 2039//2039 2047//2047 2048//2048
+f 2039//2039 2048//2048 2040//2040
+f 2040//2040 2048//2048 2049//2049
+f 2040//2040 2049//2049 2041//2041
+f 1793//1793 1801//1801 2050//2050
+f 1793//1793 2050//2050 2042//2042
+f 2042//2042 2050//2050 2051//2051
+f 2042//2042 2051//2051 2043//2043
+f 2043//2043 2051//2051 2052//2052
+f 2043//2043 2052//2052 2044//2044
+f 2044//2044 2052//2052 2053//2053
+f 2044//2044 2053//2053 2045//2045
+f 2045//2045 2053//2053 2054//2054
+f 2045//2045 2054//2054 2046//2046
+f 2046//2046 2054//2054 2055//2055
+f 2046//2046 2055//2055 2047//2047
+f 2047//2047 2055//2055 2056//2056
+f 2047//2047 2056//2056 2048//2048
+f 2048//2048 2056//2056 2057//2057
+f 2048//2048 2057//2057 2049//2049
+f 1801//1801 1809//1809 2058//2058
+f 1801//1801 2058//2058 2050//2050
+f 2050//2050 2058//2058 2059//2059
+f 2050//2050 2059//2059 2051//2051
+f 2051//2051 2059//2059 2060//2060
+f 2051//2051 2060//2060 2052//2052
+f 2052//2052 2060//2060 2061//2061
+f 2052//2052 2061//2061 2053//2053
+f 2053//2053 2061//2061 2062//2062
+f 2053//2053 2062//2062 2054//2054
+f 2054//2054 2062//2062 2063//2063
+f 2054//2054 2063//2063 2055//2055
+f 2055//2055 2063//2063 2064//2064
+f 2055//2055 2064//2064 2056//2056
+f 2056//2056 2064//2064 2065//2065
+f 2056//2056 2065//2065 2057//2057
+f 1809//1809 1817//1817 2066//2066
+f 1809//1809 2066//2066 2058//2058
+f 2058//2058 2066//2066 2067//2067
+f 2058//2058 2067//2067 2059//2059
+f 2059//2059 2067//2067 2068//2068
+f 2059//2059 2068//2068 2060//2060
+f 2060//2060 2068//2068 2069//2069
+f 2060//2060 2069//2069 2061//2061
+f 2061//2061 2069//2069 2070//2070
+f 2061//2061 2070//2070 2062//2062
+f 2062//2062 2070//2070 2071//2071
+f 2062//2062 2071//2071 2063//2063
+f 2063//2063 2071//2071 2072//2072
+f 2063//2063 2072//2072 2064//2064
+f 2064//2064 2072//2072 2073//2073
+f 2064//2064 2073//2073 2065//2065
+f 1817//1817 1825//1825 2074//2074
+f 1817//1817 2074//2074 2066//2066
+f 2066//2066 2074//2074 2075//2075
+f 2066//2066 2075//2075 2067//2067
+f 2067//2067 2075//2075 2076//2076
+f 2067//2067 2076//2076 2068//2068
+f 2068//2068 2076//2076 2077//2077
+f 2068//2068 2077//2077 2069//2069
+f 2069//2069 2077//2077 2078//2078
+f 2069//2069 2078//2078 2070//2070
+f 2070//2070 2078//2078 2079//2079
+f 2070//2070 2079//2079 2071//2071
+f 2071//2071 2079//2079 2080//2080
+f 2071//2071 2080//2080 2072//2072
+f 2072//2072 2080//2080 2081//2081
+f 2072//2072 2081//2081 2073//2073
+f 1825//1825 1585//1585 1827//1827
+f 1825//1825 1827//1827 2074//2074
+f 2074//2074 1827//1827 1829//1829
+f 2074//2074 1829//1829 2075//2075
+f 2075//2075 1829//1829 1831//1831
+f 2075//2075 1831//1831 2076//2076
+f 2076//2076 1831//1831 1833//1833
+f 2076//2076 1833//1833 2077//2077
+f 2077//2077 1833//1833 1835//1835
+f 2077//2077 1835//1835 2078//2078
+f 2078//2078 1835//1835 1837//1837
+f 2078//2078 1837//1837 2079//2079
+f 2079//2079 1837//1837 1839//1839
+f 2079//2079 1839//1839 2080//2080
+f 2080//2080 1839//1839 1841//1841
+f 2080//2080 1841//1841 2081//2081
+# 4032 faces, 0 coords texture
+
+# End of File \ No newline at end of file
diff --git a/dev/MinGfx/data/test.png b/dev/MinGfx/data/test.png
new file mode 100644
index 0000000..4e888f2
--- /dev/null
+++ b/dev/MinGfx/data/test.png
Binary files differ
diff --git a/dev/MinGfx/doc/Doxyfile.in b/dev/MinGfx/doc/Doxyfile.in
new file mode 100644
index 0000000..41de5d5
--- /dev/null
+++ b/dev/MinGfx/doc/Doxyfile.in
@@ -0,0 +1,312 @@
+# Doxyfile 1.8.10
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = "MinGfx Toolkit"
+PROJECT_NUMBER = @MinGfx_Toolkit_VERSION_MAJOR@.@MinGfx_Toolkit_VERSION_MINOR@
+PROJECT_BRIEF = "A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs."
+PROJECT_LOGO =
+OUTPUT_DIRECTORY = @CMAKE_CURRENT_BINARY_DIR@
+CREATE_SUBDIRS = NO
+ALLOW_UNICODE_NAMES = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH = @PROJECT_SOURCE_DIR@ \
+ @PROJECT_BINARY_DIR@
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = YES
+QT_AUTOBRIEF = YES
+MULTILINE_CPP_IS_BRIEF = YES
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 4
+ALIASES =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = YES
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+GROUP_NESTED_COMPOUNDS = NO
+SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = NO
+EXTRACT_PACKAGE = NO
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = YES
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = NO
+HIDE_SCOPE_NAMES = NO
+HIDE_COMPOUND_REFERENCE= NO
+SHOW_INCLUDE_FILES = YES
+SHOW_GROUPED_MEMB_INC = NO
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_FILES = YES
+SHOW_NAMESPACES = NO
+FILE_VERSION_FILTER =
+LAYOUT_FILE = @CMAKE_CURRENT_SOURCE_DIR@/doc/DoxygenLayout.xml
+CITE_BIB_FILES =
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = @CMAKE_CURRENT_SOURCE_DIR@/doc @CMAKE_CURRENT_SOURCE_DIR@/src
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS = *.h *.md
+RECURSIVE = YES
+EXCLUDE = @CMAKE_CURRENT_SOURCE_DIR@/src/external @CMAKE_CURRENT_SOURCE_DIR@/src/shaders
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE = mainpage.md
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = YES
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION = NO
+REFERENCES_LINK_SOURCE = YES
+SOURCE_TOOLTIPS = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = YES
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER = @CMAKE_CURRENT_SOURCE_DIR@/doc/header.html
+HTML_FOOTER = @CMAKE_CURRENT_SOURCE_DIR@/doc/footer.html
+HTML_STYLESHEET =
+HTML_EXTRA_STYLESHEET = @CMAKE_CURRENT_SOURCE_DIR@/doc/customdoxygen.css
+HTML_EXTRA_FILES =
+HTML_COLORSTYLE_HUE = 0
+HTML_COLORSTYLE_SAT = 0
+HTML_COLORSTYLE_GAMMA = 100
+HTML_TIMESTAMP = NO
+HTML_DYNAMIC_SECTIONS = YES
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
+DISABLE_INDEX = NO
+GENERATE_TREEVIEW = NO
+ENUM_VALUES_PER_LINE = 4
+TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+USE_MATHJAX = YES
+MATHJAX_FORMAT = HTML-CSS
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+MATHJAX_EXTENSIONS =
+MATHJAX_CODEFILE =
+SEARCHENGINE = YES
+SERVER_BASED_SEARCH = NO
+EXTERNAL_SEARCH = NO
+SEARCHENGINE_URL =
+SEARCHDATA_FILE = searchdata.xml
+EXTERNAL_SEARCH_ID =
+EXTRA_SEARCH_MAPPINGS =
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = letter
+EXTRA_PACKAGES =
+LATEX_HEADER =
+LATEX_FOOTER =
+LATEX_EXTRA_STYLESHEET =
+LATEX_EXTRA_FILES =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+LATEX_BIB_STYLE = plain
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+RTF_SOURCE_CODE = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_SUBDIR =
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK = NO
+DOCBOOK_OUTPUT = docbook
+DOCBOOK_PROGRAMLISTING = NO
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+DIA_PATH =
+HIDE_UNDOC_RELATIONS = NO
+HAVE_DOT = NO
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = Helvetica
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = YES
+CALLER_GRAPH = YES
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = png
+INTERACTIVE_SVG = NO
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DIAFILE_DIRS =
+PLANTUML_JAR_PATH =
+PLANTUML_INCLUDE_PATH =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
diff --git a/dev/MinGfx/doc/DoxygenLayout.xml b/dev/MinGfx/doc/DoxygenLayout.xml
new file mode 100644
index 0000000..07e6378
--- /dev/null
+++ b/dev/MinGfx/doc/DoxygenLayout.xml
@@ -0,0 +1,194 @@
+<doxygenlayout version="1.0">
+ <!-- Generated by doxygen 1.8.9.1 -->
+ <!-- Navigation index tabs for HTML output -->
+ <navindex>
+ <tab type="mainpage" visible="yes" title=""/>
+ <tab type="pages" visible="yes" title="" intro=""/>
+ <tab type="modules" visible="yes" title="" intro=""/>
+ <tab type="namespaces" visible="yes" title="">
+ <tab type="namespacelist" visible="yes" title="" intro=""/>
+ <tab type="namespacemembers" visible="yes" title="" intro=""/>
+ </tab>
+ <tab type="classes" visible="yes" title="">
+ <tab type="classlist" visible="yes" title="" intro=""/>
+ <tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
+ <tab type="hierarchy" visible="yes" title="" intro=""/>
+ <tab type="classmembers" visible="yes" title="" intro=""/>
+ </tab>
+ <tab type="files" visible="yes" title="">
+ <tab type="filelist" visible="yes" title="" intro=""/>
+ <tab type="globals" visible="yes" title="" intro=""/>
+ </tab>
+ <tab type="examples" visible="yes" title="" intro=""/>
+ </navindex>
+
+ <!-- Layout definition for a class page -->
+ <class>
+ <detaileddescription title=""/>
+ <briefdescription visible="no"/>
+ <includes visible="$SHOW_INCLUDE_FILES"/>
+ <inheritancegraph visible="$CLASS_GRAPH"/>
+ <collaborationgraph visible="$COLLABORATION_GRAPH"/>
+ <memberdecl>
+ <nestedclasses visible="yes" title=""/>
+ <publictypes title=""/>
+ <services title=""/>
+ <interfaces title=""/>
+ <publicslots title=""/>
+ <signals title=""/>
+ <publicmethods title=""/>
+ <publicstaticmethods title=""/>
+ <publicattributes title=""/>
+ <publicstaticattributes title=""/>
+ <protectedtypes title=""/>
+ <protectedslots title=""/>
+ <protectedmethods title=""/>
+ <protectedstaticmethods title=""/>
+ <protectedattributes title=""/>
+ <protectedstaticattributes title=""/>
+ <packagetypes title=""/>
+ <packagemethods title=""/>
+ <packagestaticmethods title=""/>
+ <packageattributes title=""/>
+ <packagestaticattributes title=""/>
+ <properties title=""/>
+ <events title=""/>
+ <privatetypes title=""/>
+ <privateslots title=""/>
+ <privatemethods title=""/>
+ <privatestaticmethods title=""/>
+ <privateattributes title=""/>
+ <privatestaticattributes title=""/>
+ <friends title=""/>
+ <related title="" subtitle=""/>
+ <membergroups visible="yes"/>
+ </memberdecl>
+ <memberdef>
+ <inlineclasses title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <services title=""/>
+ <interfaces title=""/>
+ <constructors title=""/>
+ <functions title=""/>
+ <related title=""/>
+ <variables title=""/>
+ <properties title=""/>
+ <events title=""/>
+ </memberdef>
+ <allmemberslink visible="yes"/>
+ <usedfiles visible="$SHOW_USED_FILES"/>
+ <authorsection visible="yes"/>
+ </class>
+
+ <!-- Layout definition for a namespace page -->
+ <namespace>
+ <briefdescription visible="no"/>
+ <detaileddescription title=""/>
+ <memberdecl>
+ <nestednamespaces visible="yes" title=""/>
+ <constantgroups visible="yes" title=""/>
+ <classes visible="yes" title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ <membergroups visible="yes"/>
+ </memberdecl>
+ <memberdef>
+ <inlineclasses title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ </memberdef>
+ <authorsection visible="yes"/>
+ </namespace>
+
+ <!-- Layout definition for a file page -->
+ <file>
+ <briefdescription visible="no"/>
+ <detaileddescription title=""/>
+ <includes visible="$SHOW_INCLUDE_FILES"/>
+ <includegraph visible="$INCLUDE_GRAPH"/>
+ <includedbygraph visible="$INCLUDED_BY_GRAPH"/>
+ <sourcelink visible="yes"/>
+ <memberdecl>
+ <classes visible="yes" title=""/>
+ <namespaces visible="yes" title=""/>
+ <constantgroups visible="yes" title=""/>
+ <defines title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ <membergroups visible="yes"/>
+ </memberdecl>
+ <memberdef>
+ <inlineclasses title=""/>
+ <defines title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ </memberdef>
+ <authorsection/>
+ </file>
+
+ <!-- Layout definition for a group page -->
+ <group>
+ <briefdescription visible="no"/>
+ <detaileddescription title=""/>
+ <groupgraph visible="$GROUP_GRAPHS"/>
+ <memberdecl>
+ <nestedgroups visible="yes" title=""/>
+ <dirs visible="yes" title=""/>
+ <files visible="yes" title=""/>
+ <namespaces visible="yes" title=""/>
+ <classes visible="yes" title=""/>
+ <defines title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <enumvalues title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ <signals title=""/>
+ <publicslots title=""/>
+ <protectedslots title=""/>
+ <privateslots title=""/>
+ <events title=""/>
+ <properties title=""/>
+ <friends title=""/>
+ <membergroups visible="yes"/>
+ </memberdecl>
+ <memberdef>
+ <pagedocs/>
+ <inlineclasses title=""/>
+ <defines title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <enumvalues title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ <signals title=""/>
+ <publicslots title=""/>
+ <protectedslots title=""/>
+ <privateslots title=""/>
+ <events title=""/>
+ <properties title=""/>
+ <friends title=""/>
+ </memberdef>
+ <authorsection visible="yes"/>
+ </group>
+
+ <!-- Layout definition for a directory page -->
+ <directory>
+ <briefdescription visible="no"/>
+ <detaileddescription title=""/>
+ <directorygraph visible="yes"/>
+ <memberdecl>
+ <dirs visible="yes"/>
+ <files visible="yes"/>
+ </memberdecl>
+ </directory>
+</doxygenlayout>
diff --git a/dev/MinGfx/doc/api.md b/dev/MinGfx/doc/api.md
new file mode 100644
index 0000000..58c78eb
--- /dev/null
+++ b/dev/MinGfx/doc/api.md
@@ -0,0 +1,64 @@
+API - MinGfx Programming Reference Organized by Topic {#api}
+==========
+
+# API by Topic
+
+| Application Class |
+|-------------------|
+| [GraphicsApp](@ref mingfx::GraphicsApp) |
+
+
+| 3D Models |
+|-----------|
+| [QuickShapes](@ref mingfx::QuickShapes) |
+| [Mesh](@ref mingfx::Mesh) |
+
+
+| Color and Textures |
+|--------------------|
+| [Color](@ref mingfx::Color) |
+| [Texture2D](@ref mingfx::Texture2D) |
+
+
+| Graphics Math |
+|---------------|
+| [Matrix4](@ref mingfx::Matrix4) |
+| [Point2](@ref mingfx::Point2) |
+| [Point3](@ref mingfx::Point3) |
+| [Vector2](@ref mingfx::Vector2) |
+| [Vector3](@ref mingfx::Vector3) |
+| [Ray](@ref mingfx::Ray) |
+| [Quaternion](@ref mingfx::Quaternion) |
+| [GfxMath](@ref mingfx::GfxMath) |
+
+
+| Shader Programs |
+|-----------------|
+| [DefaultShader](@ref mingfx::DefaultShader) |
+| - [DefaultShader::LightProperties](@ref mingfx::DefaultShader::LightProperties) |
+| - [DefaultShader::MaterialProperties](@ref mingfx::DefaultShader::MaterialProperties) |
+| [ShaderProgram](@ref mingfx::ShaderProgram) |
+
+
+| User Interface |
+|----------------|
+| [CraftCam](@ref mingfx::CraftCam) |
+| [UniCam](@ref mingfx::UniCam) |
+
+
+| File I/O and System Routines |
+|------------------------------|
+| [Platform](@ref mingfx::Platform) |
+
+
+
+
+# Coding Style
+
+The library follows the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html), in part as an example for students, since this style is also used in several courses. There are several things that programmers who are not familiar with the Google style might find unusual. These are the most common style rules to note:
+- C++ source filenames are all lowercase with underscores, and a .cc extension is used instead of .cpp.
+- Variable names are all lowercase with underscores.
+- Class member variables are named the same as regular variables but with a trailing _, as in my\_member\_var\_.
+- Functions start with capital letters unless they are small getter or setter methods.
+- There are many other rules, a solid discussion of pros/cons, and an automated style checker [here](https://google.github.io/styleguide/cppguide.html).
+
diff --git a/dev/MinGfx/doc/customdoxygen.css b/dev/MinGfx/doc/customdoxygen.css
new file mode 100644
index 0000000..e1c976b
--- /dev/null
+++ b/dev/MinGfx/doc/customdoxygen.css
@@ -0,0 +1,524 @@
+body, table, div, p, dl {
+ font: 400 14px/22px "Helvetica", "Arial", sans-serif;
+ text-decoration: none;
+ font-weight: normal;
+}
+
+tr {
+ background-image: none;
+ background-color: #FFFFFF;
+}
+
+h1.groupheader {
+ font-size: 100%;
+ text-decoration: none;
+ font-weight: normal;
+}
+
+#titlearea
+{
+ padding: 10px;
+ margin: 0px;
+ width: 100%;
+ border-top: 5px solid black;
+ border-bottom: 5px solid black;
+}
+
+
+div.header
+{
+ background-image: none;
+ background-color: #FFFFFF;
+ margin: 0px;
+ border-bottom: none;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+
+
+.title {
+ font: 400 14px/28px "Helvetica", "Arial", sans-serif;
+ font-size: 150%;
+ font-weight: normal;
+ margin: 10px 2px;
+ background-image: none;
+ background-color: white;
+ text-transform:uppercase;
+}
+
+
+h2.groupheader {
+ border-bottom: 1px solid black;
+ color: black;
+ font-size: 110%;
+ font-weight: normal;
+ text-transform:uppercase;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1 {
+ font-size: 150%;
+ background-color: rgb(26, 93, 117);
+ color: white;
+ padding: 4px;
+ margin-top: 60px;
+ margin-bottom: 0px;
+}
+
+h2 {
+ font-size: 125%;
+ text-transform:uppercase;
+ margin-top: 50px;
+}
+
+h3 {
+ font-size: 110%;
+ margin-top: 40px;
+}
+
+h4 {
+ font-size: 100%;
+}
+
+h5 {
+ font-size: 100%;
+}
+
+h6 {
+ font-size: 100%;
+}
+
+
+
+h1, h2, h3, h4, h5, h6 {
+ font-weight: normal;
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: none;
+}
+
+dt {
+ padding-top: 20px;
+ font-weight: normal;
+ text-decoration: underline;
+}
+
+
+
+
+.tabs, .tabs2, .tabs3 {
+ text-transform:uppercase;
+ font-weight:normal;
+ color:rgb(190,190,190);
+ background-image: none;
+ background-color: black;
+ width: 100%;
+ z-index: 101;
+ font-size: 14px;
+ font-family: "Helvetica", "Arial", sans-serif;
+ text-shadow: none;
+}
+
+.tabs2 {
+ color: white;
+ border-top:1px solid rgb(150,150,150);
+ font-size: 10px;
+ text-shadow: none;
+}
+.tabs3 {
+ color: white;
+ font-size: 9px;
+ text-shadow: none;
+}
+
+.tablist {
+ margin: 0;
+ padding: 0;
+ display: table;
+ background-color: black;
+ font-weight: normal;
+ text-shadow: none;
+}
+
+.tablist li {
+ float: left;
+ display: table-cell;
+ background-image: none;
+ line-height: 30px;
+ list-style: none;
+ font-weight: normal;
+ text-shadow: none;
+}
+
+.tablist a {
+ display: block;
+ padding: 0 30px;
+ font-weight: normal;
+ background-image: none;
+ color:rgb(150,150,150);
+ text-decoration: none;
+ outline: none;
+ text-shadow: none;
+}
+
+.tabs3 .tablist a {
+ padding: 0 10px;
+ text-shadow: none;
+}
+
+.tablist a:hover {
+ background-image: none;
+ background-repeat:repeat-x;
+ color:white;
+ text-decoration: none;
+ font-weight: normal;
+ text-shadow: none;
+ text-decoration: underline;
+}
+
+.tablist li.current a {
+ background-image: none;
+ color: rgb(42, 153, 193);
+ text-shadow: none;
+}
+
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:white;
+ font-size: 12px;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: white;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:white;
+}
+
+
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 100%;
+ border-top:1px solid rgb(150,150,150);
+ background-color: black;
+}
+
+.navpath ul {
+ font-size: 11px;
+ background-image: none;
+ height: 20px;
+ line-height: 20px;
+ color: rgb(150,150,150);
+ border: none;
+ overflow: hidden;
+ margin: 0px;
+ padding: 0px;
+}
+
+.navpath li {
+ padding-left:30px;
+}
+
+.navpath li.navelem a {
+ height: 20px;
+ display: block;
+ text-decoration: none;
+ outline: none;
+ color: rgb(150,150,150);
+ font-family: "Helvetica", "Arial", sans-serif;
+ text-shadow: none;
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover {
+ background-image: none;
+ background-repeat:repeat-x;
+ color: white;
+ text-decoration: none;
+ font-weight: normal;
+ text-shadow: none;
+ text-decoration: underline;
+}
+
+a.el {
+ font-weight: normal;
+ color: rgb(42, 153, 193);
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid black;
+}
+
+hr.footer {
+ border-top: 0px;
+}
+
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: white;
+ border: none;
+ margin: 0px;
+ padding: 0 0 0 0;
+}
+
+.memItemLeft, .memItemRight {
+ padding-top: 8px;
+}
+
+
+
+.memSeparator {
+ border-bottom: 1px solid #EEEEEE;
+ line-height: 1px;
+ padding: 8px 0 0 0;
+}
+
+
+
+
+pre.fragment {
+ border: none;
+ border-left: 3px solid rgb(42, 153, 193);
+ background-color: white;
+ padding: 4px 6px;
+ margin: 4px 2px 4px 30px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 100%;
+}
+
+div.fragment {
+ border: none;
+ border-left: 3px solid rgb(42, 153, 193);
+ background-color: white;
+ padding: 4px 6px;
+ margin: 4px 2px 4px 30px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 100%;
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 100%;
+ min-height: 13px;
+ line-height: 1.0;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+span.comment {
+ color: #800000;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #068000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: white;
+ border: none;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.memname {
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #EEEEEE;
+ border-left: 1px solid #EEEEEE;
+ border-right: 1px solid #EEEEEE;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: normal;
+ text-shadow: none;
+ background-image: none;
+ background-repeat:repeat-x;
+ background-color: white;
+ /* opera specific markup */
+ box-shadow: none;
+ /* firefox specific markup */
+ -moz-box-shadow: none;
+ /* webkit specific markup */
+ -webkit-box-shadow: none;
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #EEEEEE;
+ border-left: 1px solid #EEEEEE;
+ border-right: 1px solid #EEEEEE;
+ padding: 6px 10px 2px 10px;
+ background-color: white;
+ border-top-width: 0;
+ background-image: none;
+ background-repeat:repeat-x;
+ /* opera specific markup */
+ box-shadow: none;
+ /* firefox specific markup */
+ -moz-box-shadow: none;
+ /* webkit specific markup */
+ -webkit-box-shadow: none;
+}
+
+.paramname {
+ color: #148caf;
+ white-space: nowrap;
+}
+
+
+a {
+ color: rgb(42, 153, 193);
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: rgb(42, 153, 193);
+}
+
+
+span.lineno {
+ width: 0px;
+ padding-right: 4px;
+ text-align: right;
+ border-right: 0px;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+
+#MSearchBox {
+ margin-top: 2px;
+}
+
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ width: 33%;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 0px solid #373737;
+ padding: 3px 7px 2px;
+ font-size: 110%;
+}
+
+table.doxtable th {
+ background-color: white;
+ color: black;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ font-weight: normal;
+ text-transform: uppercase;
+ text-align: left;
+}
+
+p code {
+ background-color: #E8E8E8;
+}
diff --git a/dev/MinGfx/doc/footer.html b/dev/MinGfx/doc/footer.html
new file mode 100644
index 0000000..3e7e4f4
--- /dev/null
+++ b/dev/MinGfx/doc/footer.html
@@ -0,0 +1,21 @@
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<!--BEGIN GENERATE_TREEVIEW-->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ $navpath
+ <li class="footer">$generatedby
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
+ </ul>
+</div>
+<!--END GENERATE_TREEVIEW-->
+<!--BEGIN !GENERATE_TREEVIEW-->
+<hr class="footer"/><address class="footer"><small>
+$generatedby &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
+</a> $doxygenversion
+</small></address>
+<!--END !GENERATE_TREEVIEW-->
+</body>
+</html>
diff --git a/dev/MinGfx/doc/header.html b/dev/MinGfx/doc/header.html
new file mode 100644
index 0000000..7160b77
--- /dev/null
+++ b/dev/MinGfx/doc/header.html
@@ -0,0 +1,55 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen $doxygenversion"/>
+<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
+<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
+<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="$relpath^jquery.js"></script>
+<script type="text/javascript" src="$relpath^dynsections.js"></script>
+$treeview
+$search
+$mathjax
+<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
+$extrastylesheet
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+
+<!--BEGIN TITLEAREA-->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <!--BEGIN PROJECT_LOGO-->
+ <td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
+ <!--END PROJECT_LOGO-->
+ <!--BEGIN PROJECT_NAME-->
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">$projectname
+ <!--BEGIN PROJECT_NUMBER-->&#160;<span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
+ </div>
+ <!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
+ </td>
+ <!--END PROJECT_NAME-->
+ <!--BEGIN !PROJECT_NAME-->
+ <!--BEGIN PROJECT_BRIEF-->
+ <td style="padding-left: 0.5em;">
+ <div id="projectbrief">$projectbrief</div>
+ </td>
+ <!--END PROJECT_BRIEF-->
+ <!--END !PROJECT_NAME-->
+ <!--BEGIN DISABLE_INDEX-->
+ <!--BEGIN SEARCHENGINE-->
+ <td>$searchbox</td>
+ <!--END SEARCHENGINE-->
+ <!--END DISABLE_INDEX-->
+ </tr>
+ </tbody>
+</table>
+</div>
+<!--END TITLEAREA-->
+<!-- end header part -->
diff --git a/dev/MinGfx/doc/index.html b/dev/MinGfx/doc/index.html
new file mode 100644
index 0000000..7252082
--- /dev/null
+++ b/dev/MinGfx/doc/index.html
@@ -0,0 +1,2 @@
+<!-- redirect to load the index.html file generated by doxygen at html/index.html -->
+<meta http-equiv="REFRESH" content="0;URL=html/index.html">
diff --git a/dev/MinGfx/doc/installation.md b/dev/MinGfx/doc/installation.md
new file mode 100644
index 0000000..e1c67a5
--- /dev/null
+++ b/dev/MinGfx/doc/installation.md
@@ -0,0 +1,200 @@
+Installation Guide {#installation}
+==========
+
+# Prereqs {#install-prereqs}
+
+MinGfx is built using the cross-platform CMake tool. Before building MinGfx, you will need to install CMake version 3.9 or higher (https://cmake.org/). On Mac, you will need to have Xcode installed as well as the [optional Xcode command line tools](https://www.embarcadero.com/starthere/xe5/mobdevsetup/ios/en/installing_the_commandline_tools.html).
+
+If you haven't already, you'll want to clone the MinGfx source code using git, so make sure you have git installed as well.
+
+
+# Background for CMake Beginners {#cmake-background}
+
+If you are new to CMake, this is the minimum background you should have before building MinGfx.
+
+CMake is a cross-platform tool for generating native Unix Makefiles and project workspaces (e.g., Xcode projects, Visual Studio solutions) for building projects. Projects use CMakeLists.txt files to describe how they should be built. These files provide input for the cmake application, which uses them to generate project files for a variety of development environments. CMake can generate Makefiles for building MinGfx on linux systems or project files for building MinGfx with popular IDEs (e.g., XCode, Visual Studio, Eclipse, CodeBLocks).
+
+There are three versions of the cmake application that are provided with the install from Kitware. You can use any of these with MinGfx:
+1. *cmake* is the command line version where all build options must be specified on the command line.
+2. *ccmake* is a visual interface that runs in a terminal. This is nice because all of the available build options are listed for you to see at once, and you can simply press the SPACEBAR to turn them on/off or type in specific values. The downside for ccmake is that it does not have a separate log window, so status messages flash by so fast that you cannot read them, and input from spin-off cmake processes (like those used in the MinGfx configure step) are not captured correctly. It's possible to still use ccmake with MinGfx, but we do not recommend it.
+3. *cmake-gui* is an OS-specific windowed version. Like ccmake, the GUI provides a useful list all of the available build options. Unlike ccmake, it also includes a nice scrollable log of all of the status messages. So, this is the preferred version for new users and for the first time you build a project.
+
+With CMake, it's best to do an out-of-source build. That means that when you start CMake you must tell it two paths: 1. the path to the MinGfx source tree, AND 2. the path to the place where you would like all the built files to be created. When running cmake-gui, these can be set interactively with a file selection dialog, but all three versions respond to command line options, and this is generally the easiest way to start up cmake. So, we suggest starting *cmake-gui* from the command line. First cd to the directory you wish to use for the built files, then pass a single required command line argument for the path to the MinGfx source tree. Usually, you will see this written as a series of 3 steps -- the common idiom for cmake builds:
+~~~
+// from within the root of the project's source directory
+mkdir build
+cd build
+cmake-gui ..
+~~~
+
+If you are using *cmake* you can pass a variety of other options to CMake on the command line with flags such as -D AUTOBUILD_NANOGUI=ON, to tell MinGfx to autobuild the nanogui library that it depends upon. With *cmake*, you can end up with a long string of arguments in order to setup the build you want. With *cmake-gui*, you set all of these build options within the user interface instead, and this is how we will proceed in the instructions that follow.
+
+
+# Setup a New Graphics Build Tree {#build-tree}
+
+Here's a complete annotated list of steps to setup a new build tree for creating graphics programs. In truth, you don't need to create this entire build tree strucutre just to work with MinGfx, but this is good practice, and a good guide for students.
+
+
+## 1. Create a Linux-Style Directory Tree
+
+Libraries will get installed to a lib/ directory. Include files will go in include/, executables in bin/, and we'll put the source we are developing inside dev/.
+
+~~~
+mkdir -p /Users/keefe/courses/csci4611/sw
+cd /Users/courses/csci4611/sw
+mkdir lib
+mkdir include
+mkdir bin
+mkdir dev
+~~~
+
+IMPORTANT: On Windows, you will need to add the `bin` directory you just created to your PATH environment variable. If you have not done this before, you will find many instructions online. Here is one good description of [how to add a directory to the PATH environment variable on Windows](https://www.java.com/en/download/help/path.xml).
+
+
+
+## 2. Download the MinGfx Project
+To download use:
+~~~
+cd dev
+git clone http://github.com/ivlab/MinGfx
+~~~
+
+
+## 3. Create an Initial CMake Build Configuration
+
+~~~
+cd MinGfx
+mkdir build
+cd build
+cmake-gui ..
+~~~
+
+Press the 'Configure' button. Then, select the Generator you would like to use from the list provided (e.g., Xcode, Visual Studio, Unix Makefiles). Click Done.
+
+Wait for CMake to do an initial configuration. This will populate an initial list of CMake and MinGfx build options. Each time you run configure, *cmake-gui* will display any new configuration options highlighted in *red*. So, do not be alarmed when the whole options window turns red during this first configure operation -- that is normal behavior since at this point, all of the options are new.
+
+Do you see an error in the CMake output window? If so, don't worry about this yet, we'll come back to it in a minute.
+
+
+## 4. Set the CMAKE_INSTALL_PREFIX Variable to the Root of Your Directory Tree
+
+Now, using cmake-gui, scroll through the table of variables until you find the one named CMAKE_INSTALL_PREFIX. Click on it and edit its value to point to the root of the directory tree you created in Step 1. The root for the example tree used in Step 1 would be /Users/keefe/courses/csci4611/sw. In other words, the root is the last directory before you get to lib, include, bin, and dev.
+
+Once you make this change, you can press the Configure button again. It doesn't hurt to press Configure multiple times. You need to do it at least once after every change you make. Notice how the variables highlighted in red go away when you do this because they are no longer new options -- cmake knows that you have already had a chance to see them once.
+
+
+## 5. If Needed, Set AUTOBUILD_NANOGUI to ON and Build Dependencies
+
+Now, take a look at the output window at the bottom of cmake-gui. If you see the following error there, then we'll address that next. If not, then nanogui must already be installed on your system, and you can skip to step 6.
+~~~
+Searching for NanoGUI library...
+Could NOT find NANOGUI (missing: NANOGUI_LIBRARIES)
+CMake Error at cmake/UseNanoGUI.cmake:96 (message):
+The NanoGUI library was not found on the system. You can: (1) install
+NanoGUI yourself, (2) point cmake to an already-installed version of
+NanoGUI by adding the installation prefix of NanoGUI to the
+CMAKE_PREFIX_PATH environment variable, or (3) set AUTOBUILD_NANOGUI to ON
+and run cmake configure again. AUTOBUILD_NANOGUI will: 1. download
+NanoGUI, 2. build NanoGUI, and 3. install NanoGUI to the
+CMAKE_INSTALL_PREFIX (currently set to
+/Users/keefe/courses/tmp/MinGfx/build/install). If you want to use the
+AUTOBUILD feature, adjust CMAKE_INSTALL_PREFIX as desired now, set
+AUTOBUILD_NANOGUI to ON, and then run cmake configure again.
+Call Stack (most recent call first):
+src/CMakeLists.txt:80 (UseNanoGUI)
+CMakeLists.txt:186 (include)
+~~~
+This error tells us that cmake could not find the nanogui library pre-installed on our system. Luckily, MinGfx includes support for downloading, building, and installing nanogui for you using the AUTOBUILD_NANOGUI feature.
+
+Scroll through the list of CMake variables again until you find AUTOBUILD_NANOGUI and click on the checkbox next to it to turn it on. Now, click Configure again. This time the configure step will take a while, perhaps 5 minutes, to run because it will be downloading, building, and installing nanogui and all of its dependencies.
+
+This step should finish without an error. If you do see an error and you are working with this as part of a UMN course, you may need to stop now and ask for help from a TA or on the class forum -- perhaps there is something we haven't planned for in the particular setup of your computer.
+
+
+## 6. Generate the Build System / Project Files
+
+Finally, you are ready to press the Generate button. This is the step that will actually generate the Unix Makefiles, Visual Studio Solution File, or Xcode Project File needed to build MinGfx.
+
+
+## 7. Build MinGfx with the Specified Options
+
+Click Open Project if you generated project files for an IDE, or if you generated Unix Makefiles return to your shell and the build directory. Now, build the project as you normally would in these enviornments.
+
+For Xcode: `click the Triangle button to build the ALL_BUILD target`
+
+For Visual Studio: In the Solution Explorer Window `right click on ALL_BUILD` and select `Build`
+
+For Unix Makefiles: run `make all`.
+
+
+## 8. Install the Library to your Directory Tree
+
+For Xcode: `click on ALL_BUILD to reveal a dropdown list and select install` then `click the Triangle button`
+
+For Visual Studio: In the Solution Explorer Window `right click on INSTALL` and select `Build`.
+
+For Unix Makefiles: run `make install`.
+
+To see if it worked take a look in the lib, include, and bin directories within the root of the tree you setup in Step 1. You should see the test programs inside bin/ and folders for MinVR-1.0 inside lib/ and include/.
+
+
+## 9. Run a Test Program
+
+For Xcode: `click on ALL_BUILD to reveal a dropdown list and select mingfx-test-gui-plus-opengl` then `click the Triangle button`
+
+For Visual Studio: In the Solution Explorer Window `right click on mingfx-test-gui-plus-opengl` then selece `Set as StartUp Project`. Now, `click the green triangle button to run the program`. IMPORTANT NOTE: When the program runs it will need to find some .dlls that were installed to your `bin` directory in Step 8. So, the bin directory *must be in your windows PATH*. If you skipped this part of Step 1, go back and add `bin` to your PATH environment variable now. Then, you may need to restart Visual Studio for it to recognize the new setting.
+
+For Unix Makefiles: from within the build directory run: `tests/mingfx-gui-plus-opengl`
+
+
+
+
+# Create Your Own Graphics Program {#example}
+
+*Prereq:* Before getting started, make sure you have installed MinGfx, going all the way through the 9th step above.
+
+The project in the MinGfx/example folder is an example of a stand-alone project that uses a separate cmake build system. This means we can copy it and move it out of the MinGfx source tree to serve as a starting point for your own project. Let's do that now.
+
+~~~
+cd /Users/courses/csci4611/sw/dev (or wherever you put your dev directory)
+cp -r MinGfx/example/ mingfx-example
+~~~
+
+Now, before we build the example, we need to make sure it knows where to find MinGfx.
+~~~
+cd mingfx-example
+open up the CMakeLists.txt file in your favorite text editor
+~~~
+
+Near the top of the file, find the following lines
+~~~
+# !!!!!!!!!!!!! EDIT THE FOLLOWING LINE AS NEEDED !!!!!!!!!!!!!
+list(APPEND CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../build/install ../../..)
+~~~
+and add a path to the end of the list to point to the ROOT of your directory tree, for example:
+~~~
+# !!!!!!!!!!!!! EDIT THE FOLLOWING LINE AS NEEDED !!!!!!!!!!!!!
+list(APPEND CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../build/install ../../.. /Users/keefe/courses/cs4611/sw)
+~~~
+
+Now, we're ready to build this example using the same cmake idiom as before:
+~~~
+mkdir build
+cd build
+cmake-gui ..
+~~~
+Then, click *Configure*. If you want to install this example program, you may now edit the CMAKE_INSTALL_PREFIX as before and rerun *Configure*. It should not be necessary to change any of the other cmake variables for this example program.
+
+Next, click *Generate* to produce project files for your IDE or makefiles.
+
+Next, build the example program within your IDE or by running `make`.
+
+Finally, you can run your first example graphics program with the command:
+~~~
+./mingfx-example
+~~~
+
+You can change the name of the executable, add more header and source files to the project and make other changes to the build process by editing the CMakeLists.txt file, but remember that after each change, you must run CMake's *Configure* and *Generate* steps again.
+
+To reiterate the point above, if you are using an IDE, it is important to remember to add new files to your project by editing the CMakeLists.txt file NOT by using File->Add To Project.. or whatever option is provided inside your IDE. Since we using CMake to generate the IDE's project files, and we may want to switch to a different IDE or to Makefiles in the future, the CMakeLists.txt file needs to be treated as the master record of all of the build settings.
+
diff --git a/dev/MinGfx/doc/mainpage.md b/dev/MinGfx/doc/mainpage.md
new file mode 100644
index 0000000..db77de5
--- /dev/null
+++ b/dev/MinGfx/doc/mainpage.md
@@ -0,0 +1,27 @@
+MinGfx Toolkit Documentation {#mainpage}
+==========
+
+## Getting Started
+1. [libMinGfx Installation Guide](@ref installation)
+2. [Create Your Own Graphics Program by Copying an Example](@ref example)
+3. [Bookmark the API - The MinGfx Programming Reference Organized by Topic](@ref api)
+
+## Programming Guide
+* [MinGfx Programming Reference](@ref api)
+* Adding NanoGUI Elements (buttons, sliders, other GUI widgets)
+ - [NanoGUI Documentation](https://nanogui.readthedocs.io/en/latest/)
+ - [NanoGUI GitHub Repo](https://github.com/wjakob/nanogui)
+* Drawing Using NanoVG (for 2D vector graphics)
+ - [NanoVG Documentation](https://github.com/memononen/NanoVG)
+ - [nanovg.h -- the best place to see all the possible commands](https://github.com/memononen/nanovg/blob/master/src/nanovg.h)
+* Drawing Using OpenGL (for 3D graphics)
+ - [learnopengl.com](https://learnopengl.com/Introduction)
+ - [Google for OpenGL 3.3 Guide](https://www.google.com/search?q=opengl+3.3+guide)
+
+
+## Overview
+
+The MinGfx Toolkit is a minimal library for writing cross-platform (Windows, OSX, linux) graphics programs with modern OpenGL 3.3+ support. Application programmers should subclass from MinGfx::GraphicsApp, which provides callbacks for several styles of rendering and user interfaces. On-screen graphical user interfaces can be created with built-in support for NanoGUI. 2D vector graphics rendering is supported by linking with NanoVG. 3D graphics rendering is supported via MinGfx::Mesh, MinGfx::Shader, MinGfx::Texture2D, and related classes. Additionally, application programmers can do whatever custom 2D or 3D rendering is needed with direct calls to OpenGL.
+
+The library is maintained by Prof. Daniel Keefe (dfk@umn.edu) and is used for instructional purposes in UMN computer science courses (CSci-4611, CSci-3081W, ...) as well as some research projects. See LICENSE.txt for additional details.
+
diff --git a/dev/MinGfx/docs/html/aabb_8h.html b/dev/MinGfx/docs/html/aabb_8h.html
new file mode 100644
index 0000000..1310e5d
--- /dev/null
+++ b/dev/MinGfx/docs/html/aabb_8h.html
@@ -0,0 +1,117 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/aabb.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">aabb.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector3_8h_source.html">vector3.h</a>&quot;</code><br />
+</div>
+<p><a href="aabb_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 3D axis-aligned bounding box defined by two corners (min and max). <a href="classmingfx_1_1_a_a_b_b.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3c3b45ed6edf3fe76f98a7fd165dca03"><td class="memItemLeft" align="right" valign="top">AABB&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">mingfx::operator+</a> (const AABB &amp;A, const AABB &amp;B)</td></tr>
+<tr class="separator:a3c3b45ed6edf3fe76f98a7fd165dca03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/aabb_8h_source.html b/dev/MinGfx/docs/html/aabb_8h_source.html
new file mode 100644
index 0000000..bef9f18
--- /dev/null
+++ b/dev/MinGfx/docs/html/aabb_8h_source.html
@@ -0,0 +1,185 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/aabb.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">aabb.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="aabb_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> David Schroeder, 2010-ish, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#ifndef SRC_AABB_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#define SRC_AABB_H_</span></div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; </div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector3_8h.html">vector3.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
+<div class="line"><a name="l00021"></a><span class="lineno"><a class="line" href="namespacemingfx.html"> 21</a></span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment">// forward declaration</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_mesh.html">Mesh</a>;</div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
+<div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html"> 31</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_a_a_b_b.html">AABB</a> {</div>
+<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#af7acb376dbda50fa1d8c30d1b5eb85fb"> 34</a></span>&#160; <a class="code" href="classmingfx_1_1_a_a_b_b.html#af7acb376dbda50fa1d8c30d1b5eb85fb">AABB</a>();</div>
+<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; </div>
+<div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#a5bf74f4e7f64adae9ea66f213a4012d1"> 37</a></span>&#160; <a class="code" href="classmingfx_1_1_a_a_b_b.html#a5bf74f4e7f64adae9ea66f213a4012d1">AABB</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;a);</div>
+<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; </div>
+<div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#aaa44f815006b66f67da76fd89c02a0cf"> 40</a></span>&#160; <a class="code" href="classmingfx_1_1_a_a_b_b.html#aaa44f815006b66f67da76fd89c02a0cf">AABB</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;a, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;b, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;c);</div>
+<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; </div>
+<div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#a0f3e7d3b4012e25018ad4c51edafd4f8"> 44</a></span>&#160; <a class="code" href="classmingfx_1_1_a_a_b_b.html#a0f3e7d3b4012e25018ad4c51edafd4f8">AABB</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;extents);</div>
+<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; </div>
+<div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#a7c47fca94d56a2845ca7729d580ee7d1"> 48</a></span>&#160; <a class="code" href="classmingfx_1_1_a_a_b_b.html#a7c47fca94d56a2845ca7729d580ee7d1">AABB</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;center, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;extents);</div>
+<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; </div>
+<div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#a95e244e6e0774c815de6b9434218ee09"> 51</a></span>&#160; <a class="code" href="classmingfx_1_1_a_a_b_b.html#a95e244e6e0774c815de6b9434218ee09">AABB</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;mesh);</div>
+<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; </div>
+<div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#a2bf325127a89d7dbd5bb082ae69fb5e9"> 54</a></span>&#160; <a class="code" href="classmingfx_1_1_a_a_b_b.html#a2bf325127a89d7dbd5bb082ae69fb5e9">AABB</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;mesh, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> tri_id);</div>
+<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; </div>
+<div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#aeb63c176a2f2408e803d9a2f6848eee5"> 56</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_a_a_b_b.html#aeb63c176a2f2408e803d9a2f6848eee5">~AABB</a>();</div>
+<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; </div>
+<div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#a3bf7d5ffa3ccccf7111e98d88a3ffeec"> 59</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_a_a_b_b.html#a3bf7d5ffa3ccccf7111e98d88a3ffeec">Dimensions</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; </div>
+<div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#a1ea0cf1c4051185b3f4296d20dd330c9"> 63</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_a_a_b_b.html#a1ea0cf1c4051185b3f4296d20dd330c9">Volume</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; </div>
+<div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#a3b46cdd39ffed26b7982d641b53158e6"> 66</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_a_a_b_b.html#a3b46cdd39ffed26b7982d641b53158e6">min</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; </div>
+<div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#abac247fedc82467c6b058ed4fe77d2a4"> 69</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_a_a_b_b.html#abac247fedc82467c6b058ed4fe77d2a4">max</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; </div>
+<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#ade89d21e799a97e7d82be5d593ee2e4b"> 74</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_a_a_b_b.html#ade89d21e799a97e7d82be5d593ee2e4b">set_user_data</a>(<span class="keywordtype">int</span> data);</div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; </div>
+<div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#a35def5a4ee2ecd287f5c71436b2c5843"> 79</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_a_a_b_b.html#a35def5a4ee2ecd287f5c71436b2c5843">user_data</a>();</div>
+<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; </div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; </div>
+<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> min_, max_;</div>
+<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; </div>
+<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="keywordtype">int</span> user_data_;</div>
+<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; </div>
+<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="classmingfx_1_1_a_a_b_b.html#a60e301aa632dd49eccdc27bab7c6d231"> 87</a></span>&#160; <span class="keyword">friend</span> <a class="code" href="classmingfx_1_1_a_a_b_b.html">AABB</a> <a class="code" href="classmingfx_1_1_a_a_b_b.html#a60e301aa632dd49eccdc27bab7c6d231">operator+</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;A, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;B);</div>
+<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;};</div>
+<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; </div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="comment">// Returns an AABB that contains both A and B completely (kind of like a union)</span></div>
+<div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03"> 91</a></span>&#160;<a class="code" href="classmingfx_1_1_a_a_b_b.html">AABB</a> <a class="code" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">operator+</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;A, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;B);</div>
+<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; </div>
+<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; </div>
+<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; </div>
+<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></div><div class="ttdoc">A 3D axis-aligned bounding box defined by two corners (min and max).</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00031">aabb.h:31</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_a0f3e7d3b4012e25018ad4c51edafd4f8"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#a0f3e7d3b4012e25018ad4c51edafd4f8">mingfx::AABB::AABB</a></div><div class="ttdeci">AABB(const Vector3 &amp;extents)</div><div class="ttdoc">Box centered at the origin with width, height, and depth specified by the vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_a1ea0cf1c4051185b3f4296d20dd330c9"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#a1ea0cf1c4051185b3f4296d20dd330c9">mingfx::AABB::Volume</a></div><div class="ttdeci">float Volume() const</div><div class="ttdoc">Returns the volume of the box or -1.0 when empty and 0.0 if the box contains just a single point.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_a2bf325127a89d7dbd5bb082ae69fb5e9"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#a2bf325127a89d7dbd5bb082ae69fb5e9">mingfx::AABB::AABB</a></div><div class="ttdeci">AABB(const Mesh &amp;mesh, unsigned int tri_id)</div><div class="ttdoc">Box that contains just triangle number &quot;tri_id&quot; from the specified mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_a35def5a4ee2ecd287f5c71436b2c5843"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#a35def5a4ee2ecd287f5c71436b2c5843">mingfx::AABB::user_data</a></div><div class="ttdeci">int user_data()</div><div class="ttdoc">You can set this to whatever you want in order to use it as a handle into your own program....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_a3b46cdd39ffed26b7982d641b53158e6"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#a3b46cdd39ffed26b7982d641b53158e6">mingfx::AABB::min</a></div><div class="ttdeci">Point3 min() const</div><div class="ttdoc">Returns the coordinates for the minimum corner of the box.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_a3bf7d5ffa3ccccf7111e98d88a3ffeec"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#a3bf7d5ffa3ccccf7111e98d88a3ffeec">mingfx::AABB::Dimensions</a></div><div class="ttdeci">Vector3 Dimensions() const</div><div class="ttdoc">Returns the dimensions of the box in x, y, and z as a 3D vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_a5bf74f4e7f64adae9ea66f213a4012d1"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#a5bf74f4e7f64adae9ea66f213a4012d1">mingfx::AABB::AABB</a></div><div class="ttdeci">AABB(const Point3 &amp;a)</div><div class="ttdoc">Box that contains a single point.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_a60e301aa632dd49eccdc27bab7c6d231"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#a60e301aa632dd49eccdc27bab7c6d231">mingfx::AABB::operator+</a></div><div class="ttdeci">friend AABB operator+(const AABB &amp;A, const AABB &amp;B)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_a7c47fca94d56a2845ca7729d580ee7d1"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#a7c47fca94d56a2845ca7729d580ee7d1">mingfx::AABB::AABB</a></div><div class="ttdeci">AABB(const Point3 &amp;center, const Vector3 &amp;extents)</div><div class="ttdoc">Box centered at the center with width, height, and depth specified by the vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_a95e244e6e0774c815de6b9434218ee09"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#a95e244e6e0774c815de6b9434218ee09">mingfx::AABB::AABB</a></div><div class="ttdeci">AABB(const Mesh &amp;mesh)</div><div class="ttdoc">Box that contains a whole mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_aaa44f815006b66f67da76fd89c02a0cf"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#aaa44f815006b66f67da76fd89c02a0cf">mingfx::AABB::AABB</a></div><div class="ttdeci">AABB(const Point3 &amp;a, const Point3 &amp;b, const Point3 &amp;c)</div><div class="ttdoc">Box that contains a triangle defined by 3 points.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_abac247fedc82467c6b058ed4fe77d2a4"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#abac247fedc82467c6b058ed4fe77d2a4">mingfx::AABB::max</a></div><div class="ttdeci">Point3 max() const</div><div class="ttdoc">Returns the coordinates for the maximum corner of the box.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_ade89d21e799a97e7d82be5d593ee2e4b"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#ade89d21e799a97e7d82be5d593ee2e4b">mingfx::AABB::set_user_data</a></div><div class="ttdeci">void set_user_data(int data)</div><div class="ttdoc">You can set this to whatever you want in order to use it as a handle into your own program....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_aeb63c176a2f2408e803d9a2f6848eee5"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#aeb63c176a2f2408e803d9a2f6848eee5">mingfx::AABB::~AABB</a></div><div class="ttdeci">virtual ~AABB()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html_af7acb376dbda50fa1d8c30d1b5eb85fb"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html#af7acb376dbda50fa1d8c30d1b5eb85fb">mingfx::AABB::AABB</a></div><div class="ttdeci">AABB()</div><div class="ttdoc">Creates an empty box.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html"><div class="ttname"><a href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></div><div class="ttdoc">A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.</div><div class="ttdef"><b>Definition:</b> <a href="mesh_8h_source.html#l00127">mesh.h:127</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="anamespacemingfx_html_a3c3b45ed6edf3fe76f98a7fd165dca03"><div class="ttname"><a href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">mingfx::operator+</a></div><div class="ttdeci">AABB operator+(const AABB &amp;A, const AABB &amp;B)</div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+<div class="ttc" id="avector3_8h_html"><div class="ttname"><a href="vector3_8h.html">vector3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/annotated.html b/dev/MinGfx/docs/html/annotated.html
new file mode 100644
index 0000000..549003b
--- /dev/null
+++ b/dev/MinGfx/docs/html/annotated.html
@@ -0,0 +1,119 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><a class="el" href="namespacemingfx.html" target="_self">mingfx</a></td><td class="desc">Namespace for the MinGfx Toolkit </td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_a_a_b_b.html" target="_self">AABB</a></td><td class="desc">A 3D axis-aligned bounding box defined by two corners (min and max) </td></tr>
+<tr id="row_0_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_b_v_h.html" target="_self">BVH</a></td><td class="desc">A Bounding Volume Hierarchy (<a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a>) data structure that can be used to accelerate ray-object intersection tests by carving up space into a hierarchy of partitions represented in a tree </td></tr>
+<tr id="row_0_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_color.html" target="_self">Color</a></td><td class="desc">Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with OpenGL </td></tr>
+<tr id="row_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_craft_cam.html" target="_self">CraftCam</a></td><td class="desc">This implements a user interface for controlling the camera with the mouse </td></tr>
+<tr id="row_0_4_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_4_" class="arrow" onclick="toggleFolder('0_4_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_default_shader.html" target="_self">DefaultShader</a></td><td class="desc">A simple GLSL shader for textured per-fragment Phong shading with multiple light sources </td></tr>
+<tr id="row_0_4_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html" target="_self">LightProperties</a></td><td class="desc">Small data structure to hold per-light properties </td></tr>
+<tr id="row_0_4_1_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html" target="_self">MaterialProperties</a></td><td class="desc">Small data structure to hold properties of the material to be lit </td></tr>
+<tr id="row_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_gfx_math.html" target="_self">GfxMath</a></td><td class="desc">This class holds a variety of static math functions that are useful to have defined with creating graphics programs </td></tr>
+<tr id="row_0_6_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_graphics_app.html" target="_self">GraphicsApp</a></td><td class="desc">This is the main application base class for the MinGfx Toolkit </td></tr>
+<tr id="row_0_7_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_matrix4.html" target="_self">Matrix4</a></td><td class="desc">A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be compatible with OpenGL </td></tr>
+<tr id="row_0_8_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_mesh.html" target="_self">Mesh</a></td><td class="desc">A triangle mesh data structure that can be rendered with a <a class="el" href="classmingfx_1_1_shader_program.html" title="A wrapper around GLSL shader programs.">ShaderProgram</a> like <a class="el" href="classmingfx_1_1_default_shader.html" title="A simple GLSL shader for textured per-fragment Phong shading with multiple light sources.">DefaultShader</a> </td></tr>
+<tr id="row_0_9_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_platform.html" target="_self">Platform</a></td><td class="desc">Provides access to the underlying file system and other platform-specific routines </td></tr>
+<tr id="row_0_10_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_point2.html" target="_self">Point2</a></td><td class="desc">A 2D Point with floating point coordinates, used for storing 2D texture coordinates, screen-space graphics, and mouse input </td></tr>
+<tr id="row_0_11_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_point3.html" target="_self">Point3</a></td><td class="desc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graphics operations </td></tr>
+<tr id="row_0_12_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_quaternion.html" target="_self">Quaternion</a></td><td class="desc">A quaternion to represent rotations in 3D space </td></tr>
+<tr id="row_0_13_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_quick_shapes.html" target="_self">QuickShapes</a></td><td class="desc">This class provides a quick way to draw shapes for use in debugging or simple scenes </td></tr>
+<tr id="row_0_14_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_ray.html" target="_self">Ray</a></td><td class="desc">Stores the mathematical object of a ray that begins at an origin (a 3D point) and points in a direction (a unit 3D vector) </td></tr>
+<tr id="row_0_15_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_shader_program.html" target="_self">ShaderProgram</a></td><td class="desc">A wrapper around GLSL shader programs </td></tr>
+<tr id="row_0_16_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_16_" class="arrow" onclick="toggleFolder('0_16_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_text_shader.html" target="_self">TextShader</a></td><td class="desc"></td></tr>
+<tr id="row_0_16_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html" target="_self">TextFormat</a></td><td class="desc"></td></tr>
+<tr id="row_0_17_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_texture2_d.html" target="_self">Texture2D</a></td><td class="desc">A wrapper around a 2D texture that supports loading images from files or setting texture color data directly </td></tr>
+<tr id="row_0_18_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_uni_cam.html" target="_self">UniCam</a></td><td class="desc">This implements a user interface for controlling the camera with the mouse </td></tr>
+<tr id="row_0_19_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_vector2.html" target="_self">Vector2</a></td><td class="desc">A 2D Vector with floating point coordinates, used for storing 2D translations, mouse movements, and screen-space vectors </td></tr>
+<tr id="row_0_20_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classmingfx_1_1_vector3.html" target="_self">Vector3</a></td><td class="desc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graphics operations </td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstbrp__context.html" target="_self">stbrp_context</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstbrp__node.html" target="_self">stbrp_node</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstbrp__rect.html" target="_self">stbrp_rect</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/api.html b/dev/MinGfx/docs/html/api.html
new file mode 100644
index 0000000..5e0df60
--- /dev/null
+++ b/dev/MinGfx/docs/html/api.html
@@ -0,0 +1,168 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: API - MinGfx Programming Reference Organized by Topic</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="PageDoc"><div class="header">
+ <div class="headertitle">
+<div class="title">API - MinGfx Programming Reference Organized by Topic </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p><a class="anchor" id="md_doc_api"></a></p>
+<h1><a class="anchor" id="autotoc_md0"></a>
+API by Topic</h1>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Application Class </th></tr>
+<tr class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_graphics_app.html">GraphicsApp</a> </td></tr>
+</table>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">3D Models </th></tr>
+<tr class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_quick_shapes.html">QuickShapes</a> </td></tr>
+<tr class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> </td></tr>
+</table>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Color and Textures </th></tr>
+<tr class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_color.html">Color</a> </td></tr>
+<tr class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a> </td></tr>
+</table>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Graphics Math </th></tr>
+<tr class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> </td></tr>
+<tr class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_point2.html">Point2</a> </td></tr>
+<tr class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> </td></tr>
+<tr class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> </td></tr>
+<tr class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> </td></tr>
+<tr class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_ray.html">Ray</a> </td></tr>
+<tr class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> </td></tr>
+<tr class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_gfx_math.html">GfxMath</a> </td></tr>
+</table>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">Shader Programs </th></tr>
+<tr class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_default_shader.html">DefaultShader</a> </td></tr>
+<tr class="markdownTableRowEven">
+<td class="markdownTableBodyNone">- <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">DefaultShader::LightProperties</a> </td></tr>
+<tr class="markdownTableRowOdd">
+<td class="markdownTableBodyNone">- <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">DefaultShader::MaterialProperties</a> </td></tr>
+<tr class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_shader_program.html">ShaderProgram</a> </td></tr>
+</table>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">User Interface </th></tr>
+<tr class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_craft_cam.html">CraftCam</a> </td></tr>
+<tr class="markdownTableRowEven">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_uni_cam.html">UniCam</a> </td></tr>
+</table>
+<table class="markdownTable">
+<tr class="markdownTableHead">
+<th class="markdownTableHeadNone">File I/O and System Routines </th></tr>
+<tr class="markdownTableRowOdd">
+<td class="markdownTableBodyNone"><a class="el" href="classmingfx_1_1_platform.html">Platform</a> </td></tr>
+</table>
+<h1><a class="anchor" id="autotoc_md1"></a>
+Coding Style</h1>
+<p>The library follows the <a href="https://google.github.io/styleguide/cppguide.html">Google C++ Style Guide</a>, in part as an example for students, since this style is also used in several courses. There are several things that programmers who are not familiar with the Google style might find unusual. These are the most common style rules to note:</p><ul>
+<li>C++ source filenames are all lowercase with underscores, and a .cc extension is used instead of .cpp.</li>
+<li>Variable names are all lowercase with underscores.</li>
+<li>Class member variables are named the same as regular variables but with a trailing _, as in my_member_var_.</li>
+<li>Functions start with capital letters unless they are small getter or setter methods.</li>
+<li>There are many other rules, a solid discussion of pros/cons, and an automated style checker <a href="https://google.github.io/styleguide/cppguide.html">here</a>. </li>
+</ul>
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/api_8md.html b/dev/MinGfx/docs/html/api_8md.html
new file mode 100644
index 0000000..5bb16f2
--- /dev/null
+++ b/dev/MinGfx/docs/html/api_8md.html
@@ -0,0 +1,87 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: doc/api.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/api.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/bc_s.png b/dev/MinGfx/docs/html/bc_s.png
new file mode 100644
index 0000000..21d5d36
--- /dev/null
+++ b/dev/MinGfx/docs/html/bc_s.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/bdwn.png b/dev/MinGfx/docs/html/bdwn.png
new file mode 100644
index 0000000..f057806
--- /dev/null
+++ b/dev/MinGfx/docs/html/bdwn.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/bvh_8h.html b/dev/MinGfx/docs/html/bvh_8h.html
new file mode 100644
index 0000000..d87f356
--- /dev/null
+++ b/dev/MinGfx/docs/html/bvh_8h.html
@@ -0,0 +1,111 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/bvh.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">bvh.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="aabb_8h_source.html">aabb.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+</div>
+<p><a href="bvh_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_b_v_h.html">mingfx::BVH</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A Bounding Volume Hierarchy (<a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a>) data structure that can be used to accelerate ray-object intersection tests by carving up space into a hierarchy of partitions represented in a tree. <a href="classmingfx_1_1_b_v_h.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/bvh_8h_source.html b/dev/MinGfx/docs/html/bvh_8h_source.html
new file mode 100644
index 0000000..2cbbadf
--- /dev/null
+++ b/dev/MinGfx/docs/html/bvh_8h_source.html
@@ -0,0 +1,177 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/bvh.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">bvh.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="bvh_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> David Schroeder, 2010-ish, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#ifndef SRC_BVH_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#define SRC_BVH_H_</span></div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; </div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="aabb_8h.html">aabb.h</a>&quot;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; </div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment">// forward declarations</span></div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="keyword">class </span>Mesh;</div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="keyword">class </span>Ray;</div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; </div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; </div>
+<div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="classmingfx_1_1_b_v_h.html"> 40</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_b_v_h.html">BVH</a> {</div>
+<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75"> 43</a></span>&#160; <a class="code" href="classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75">BVH</a>();</div>
+<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; </div>
+<div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="classmingfx_1_1_b_v_h.html#af81906830adcf4648cc8cf4e214b4269"> 45</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_b_v_h.html#af81906830adcf4648cc8cf4e214b4269">~BVH</a>();</div>
+<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; </div>
+<div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="classmingfx_1_1_b_v_h.html#a8ed3e91ecd2a0585a0dbac605d6f2c71"> 57</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_b_v_h.html#a8ed3e91ecd2a0585a0dbac605d6f2c71">CreateFromMesh</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;mesh);</div>
+<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; </div>
+<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; </div>
+<div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="classmingfx_1_1_b_v_h.html#a964420ca931fa93c420f0820e1b95942"> 63</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_b_v_h.html#a964420ca931fa93c420f0820e1b95942">CreateFromListOfBoxes</a>(<span class="keyword">const</span> std::vector&lt;AABB&gt; &amp;boxes);</div>
+<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; </div>
+<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; </div>
+<div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="classmingfx_1_1_b_v_h.html#afad54f50a29e8b3aace6cdec5c792c56"> 73</a></span>&#160; std::vector&lt;int&gt; <a class="code" href="classmingfx_1_1_b_v_h.html#afad54f50a29e8b3aace6cdec5c792c56">IntersectAndReturnUserData</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_ray.html">Ray</a> &amp;r) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; </div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; </div>
+<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; </div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="comment">// Simple internal data structure for storing each node of the BVH tree.</span></div>
+<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keyword">class </span>Node {</div>
+<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; Node() : child1(NULL), child2(NULL) {}</div>
+<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; </div>
+<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="comment">// Links to children</span></div>
+<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; Node *child1;</div>
+<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; Node *child2;</div>
+<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; </div>
+<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="comment">// Contains all geometry below this node.</span></div>
+<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <a class="code" href="classmingfx_1_1_a_a_b_b.html">AABB</a> box;</div>
+<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; };</div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; </div>
+<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; </div>
+<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="comment">// for now, the copy constructor is private so no copies are allowed.</span></div>
+<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="comment">// eventually, this would be good to implement and then it can be made public.</span></div>
+<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <a class="code" href="classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75">BVH</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75">BVH</a> &amp;other);</div>
+<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; </div>
+<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keywordtype">void</span> BuildHierarchyRecursive(Node *node, std::vector&lt;AABB&gt; boxes);</div>
+<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordtype">void</span> IntersectRecursive(<span class="keyword">const</span> Ray &amp;r, Node *node, std::vector&lt;int&gt; *data_list) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordtype">void</span> FreeNodeRecursive(Node* node);</div>
+<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; </div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; Node* root_;</div>
+<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;};</div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
+<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; </div>
+<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; </div>
+<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aaabb_8h_html"><div class="ttname"><a href="aabb_8h.html">aabb.h</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></div><div class="ttdoc">A 3D axis-aligned bounding box defined by two corners (min and max).</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00031">aabb.h:31</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_b_v_h_html"><div class="ttname"><a href="classmingfx_1_1_b_v_h.html">mingfx::BVH</a></div><div class="ttdoc">A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...</div><div class="ttdef"><b>Definition:</b> <a href="bvh_8h_source.html#l00040">bvh.h:40</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_b_v_h_html_a8ed3e91ecd2a0585a0dbac605d6f2c71"><div class="ttname"><a href="classmingfx_1_1_b_v_h.html#a8ed3e91ecd2a0585a0dbac605d6f2c71">mingfx::BVH::CreateFromMesh</a></div><div class="ttdeci">void CreateFromMesh(const Mesh &amp;mesh)</div><div class="ttdoc">Creates a bounding volume hierarchy where each leaf node contains a single triangle from the mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_b_v_h_html_a964420ca931fa93c420f0820e1b95942"><div class="ttname"><a href="classmingfx_1_1_b_v_h.html#a964420ca931fa93c420f0820e1b95942">mingfx::BVH::CreateFromListOfBoxes</a></div><div class="ttdeci">void CreateFromListOfBoxes(const std::vector&lt; AABB &gt; &amp;boxes)</div><div class="ttdoc">Creates a BVH where each leaf node contains one of the boxes passed in to the function.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_b_v_h_html_af812656193d247be31dd038a8e2fff75"><div class="ttname"><a href="classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75">mingfx::BVH::BVH</a></div><div class="ttdeci">BVH()</div><div class="ttdoc">Initializes the class with an empty hierarchy.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_b_v_h_html_af81906830adcf4648cc8cf4e214b4269"><div class="ttname"><a href="classmingfx_1_1_b_v_h.html#af81906830adcf4648cc8cf4e214b4269">mingfx::BVH::~BVH</a></div><div class="ttdeci">virtual ~BVH()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_b_v_h_html_afad54f50a29e8b3aace6cdec5c792c56"><div class="ttname"><a href="classmingfx_1_1_b_v_h.html#afad54f50a29e8b3aace6cdec5c792c56">mingfx::BVH::IntersectAndReturnUserData</a></div><div class="ttdeci">std::vector&lt; int &gt; IntersectAndReturnUserData(const Ray &amp;r) const</div><div class="ttdoc">Traverse the BVH to find leaf nodes whose AABBs are intersected by the ray.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html"><div class="ttname"><a href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></div><div class="ttdoc">A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.</div><div class="ttdef"><b>Definition:</b> <a href="mesh_8h_source.html#l00127">mesh.h:127</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html"><div class="ttname"><a href="classmingfx_1_1_ray.html">mingfx::Ray</a></div><div class="ttdoc">Stores the mathematical object of a ray that begins at an origin (a 3D point) and points in a directi...</div><div class="ttdef"><b>Definition:</b> <a href="ray_8h_source.html#l00054">ray.h:54</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classes.html b/dev/MinGfx/docs/html/classes.html
new file mode 100644
index 0000000..58382ef
--- /dev/null
+++ b/dev/MinGfx/docs/html/classes.html
@@ -0,0 +1,132 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class Index</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_B">B</a>&#160;|&#160;<a class="qindex" href="#letter_C">C</a>&#160;|&#160;<a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_G">G</a>&#160;|&#160;<a class="qindex" href="#letter_L">L</a>&#160;|&#160;<a class="qindex" href="#letter_M">M</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_Q">Q</a>&#160;|&#160;<a class="qindex" href="#letter_R">R</a>&#160;|&#160;<a class="qindex" href="#letter_S">S</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a>&#160;|&#160;<a class="qindex" href="#letter_U">U</a>&#160;|&#160;<a class="qindex" href="#letter_V">V</a></div>
+<div class="classindex">
+<dl class="classindex even">
+<dt class="alphachar"><a name="letter_A">A</a></dt>
+<dd><a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex odd">
+<dt class="alphachar"><a name="letter_B">B</a></dt>
+<dd><a class="el" href="classmingfx_1_1_b_v_h.html">BVH</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex even">
+<dt class="alphachar"><a name="letter_C">C</a></dt>
+<dd><a class="el" href="classmingfx_1_1_color.html">Color</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd><dd><a class="el" href="classmingfx_1_1_craft_cam.html">CraftCam</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex odd">
+<dt class="alphachar"><a name="letter_D">D</a></dt>
+<dd><a class="el" href="classmingfx_1_1_default_shader.html">DefaultShader</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex even">
+<dt class="alphachar"><a name="letter_G">G</a></dt>
+<dd><a class="el" href="classmingfx_1_1_gfx_math.html">GfxMath</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd><dd><a class="el" href="classmingfx_1_1_graphics_app.html">GraphicsApp</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex odd">
+<dt class="alphachar"><a name="letter_L">L</a></dt>
+<dd><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">DefaultShader::LightProperties</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex even">
+<dt class="alphachar"><a name="letter_M">M</a></dt>
+<dd><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">DefaultShader::MaterialProperties</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd><dd><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd><dd><a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex odd">
+<dt class="alphachar"><a name="letter_P">P</a></dt>
+<dd><a class="el" href="classmingfx_1_1_platform.html">Platform</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd><dd><a class="el" href="classmingfx_1_1_point2.html">Point2</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd><dd><a class="el" href="classmingfx_1_1_point3.html">Point3</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex even">
+<dt class="alphachar"><a name="letter_Q">Q</a></dt>
+<dd><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd><dd><a class="el" href="classmingfx_1_1_quick_shapes.html">QuickShapes</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex odd">
+<dt class="alphachar"><a name="letter_R">R</a></dt>
+<dd><a class="el" href="classmingfx_1_1_ray.html">Ray</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex even">
+<dt class="alphachar"><a name="letter_S">S</a></dt>
+<dd><a class="el" href="classmingfx_1_1_shader_program.html">ShaderProgram</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd><dd><a class="el" href="structstbrp__context.html">stbrp_context</a></dd><dd><a class="el" href="structstbrp__node.html">stbrp_node</a></dd><dd><a class="el" href="structstbrp__rect.html">stbrp_rect</a></dd></dl>
+<dl class="classindex odd">
+<dt class="alphachar"><a name="letter_T">T</a></dt>
+<dd><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">TextShader::TextFormat</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd><dd><a class="el" href="classmingfx_1_1_text_shader.html">TextShader</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd><dd><a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex even">
+<dt class="alphachar"><a name="letter_U">U</a></dt>
+<dd><a class="el" href="classmingfx_1_1_uni_cam.html">UniCam</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+<dl class="classindex odd">
+<dt class="alphachar"><a name="letter_V">V</a></dt>
+<dd><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd><dd><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> (<a class="el" href="namespacemingfx.html">mingfx</a>)</dd></dl>
+</div>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_a_a_b_b-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_a_a_b_b-members.html
new file mode 100644
index 0000000..68f1b69
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_a_a_b_b-members.html
@@ -0,0 +1,109 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::AABB Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#af7acb376dbda50fa1d8c30d1b5eb85fb">AABB</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a5bf74f4e7f64adae9ea66f213a4012d1">AABB</a>(const Point3 &amp;a)</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#aaa44f815006b66f67da76fd89c02a0cf">AABB</a>(const Point3 &amp;a, const Point3 &amp;b, const Point3 &amp;c)</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a0f3e7d3b4012e25018ad4c51edafd4f8">AABB</a>(const Vector3 &amp;extents)</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a7c47fca94d56a2845ca7729d580ee7d1">AABB</a>(const Point3 &amp;center, const Vector3 &amp;extents)</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a95e244e6e0774c815de6b9434218ee09">AABB</a>(const Mesh &amp;mesh)</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a2bf325127a89d7dbd5bb082ae69fb5e9">AABB</a>(const Mesh &amp;mesh, unsigned int tri_id)</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a3bf7d5ffa3ccccf7111e98d88a3ffeec">Dimensions</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#abac247fedc82467c6b058ed4fe77d2a4">max</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a3b46cdd39ffed26b7982d641b53158e6">min</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a60e301aa632dd49eccdc27bab7c6d231">operator+</a>(const AABB &amp;A, const AABB &amp;B)</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"><span class="mlabel">friend</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#ade89d21e799a97e7d82be5d593ee2e4b">set_user_data</a>(int data)</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a35def5a4ee2ecd287f5c71436b2c5843">user_data</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a1ea0cf1c4051185b3f4296d20dd330c9">Volume</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html#aeb63c176a2f2408e803d9a2f6848eee5">~AABB</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_a_a_b_b.html b/dev/MinGfx/docs/html/classmingfx_1_1_a_a_b_b.html
new file mode 100644
index 0000000..e4ba05b
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_a_a_b_b.html
@@ -0,0 +1,509 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::AABB Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#friends">Friends</a> &#124;
+<a href="classmingfx_1_1_a_a_b_b-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::AABB Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A 3D axis-aligned bounding box defined by two corners (min and max). </p>
+<p>AABBs can be added together using the + operator to make them grow to cover the extents of both boxes. Each box can also store a user_id (int), which can be used to associate the box with some other object in your program. </p>
+
+<p class="definition">Definition at line <a class="el" href="aabb_8h_source.html#l00031">31</a> of file <a class="el" href="aabb_8h_source.html">aabb.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="aabb_8h_source.html">aabb.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:af7acb376dbda50fa1d8c30d1b5eb85fb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#af7acb376dbda50fa1d8c30d1b5eb85fb">AABB</a> ()</td></tr>
+<tr class="memdesc:af7acb376dbda50fa1d8c30d1b5eb85fb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates an empty box. <a href="classmingfx_1_1_a_a_b_b.html#af7acb376dbda50fa1d8c30d1b5eb85fb">More...</a><br /></td></tr>
+<tr class="separator:af7acb376dbda50fa1d8c30d1b5eb85fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5bf74f4e7f64adae9ea66f213a4012d1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a5bf74f4e7f64adae9ea66f213a4012d1">AABB</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;a)</td></tr>
+<tr class="memdesc:a5bf74f4e7f64adae9ea66f213a4012d1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Box that contains a single point. <a href="classmingfx_1_1_a_a_b_b.html#a5bf74f4e7f64adae9ea66f213a4012d1">More...</a><br /></td></tr>
+<tr class="separator:a5bf74f4e7f64adae9ea66f213a4012d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaa44f815006b66f67da76fd89c02a0cf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#aaa44f815006b66f67da76fd89c02a0cf">AABB</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;a, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;b, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;c)</td></tr>
+<tr class="memdesc:aaa44f815006b66f67da76fd89c02a0cf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Box that contains a triangle defined by 3 points. <a href="classmingfx_1_1_a_a_b_b.html#aaa44f815006b66f67da76fd89c02a0cf">More...</a><br /></td></tr>
+<tr class="separator:aaa44f815006b66f67da76fd89c02a0cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f3e7d3b4012e25018ad4c51edafd4f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a0f3e7d3b4012e25018ad4c51edafd4f8">AABB</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;extents)</td></tr>
+<tr class="memdesc:a0f3e7d3b4012e25018ad4c51edafd4f8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Box centered at the origin with width, height, and depth specified by the vector. <a href="classmingfx_1_1_a_a_b_b.html#a0f3e7d3b4012e25018ad4c51edafd4f8">More...</a><br /></td></tr>
+<tr class="separator:a0f3e7d3b4012e25018ad4c51edafd4f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c47fca94d56a2845ca7729d580ee7d1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a7c47fca94d56a2845ca7729d580ee7d1">AABB</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;center, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;extents)</td></tr>
+<tr class="memdesc:a7c47fca94d56a2845ca7729d580ee7d1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Box centered at the center with width, height, and depth specified by the vector. <a href="classmingfx_1_1_a_a_b_b.html#a7c47fca94d56a2845ca7729d580ee7d1">More...</a><br /></td></tr>
+<tr class="separator:a7c47fca94d56a2845ca7729d580ee7d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a95e244e6e0774c815de6b9434218ee09"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a95e244e6e0774c815de6b9434218ee09">AABB</a> (const <a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;mesh)</td></tr>
+<tr class="memdesc:a95e244e6e0774c815de6b9434218ee09"><td class="mdescLeft">&#160;</td><td class="mdescRight">Box that contains a whole mesh. <a href="classmingfx_1_1_a_a_b_b.html#a95e244e6e0774c815de6b9434218ee09">More...</a><br /></td></tr>
+<tr class="separator:a95e244e6e0774c815de6b9434218ee09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2bf325127a89d7dbd5bb082ae69fb5e9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a2bf325127a89d7dbd5bb082ae69fb5e9">AABB</a> (const <a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;mesh, unsigned int tri_id)</td></tr>
+<tr class="memdesc:a2bf325127a89d7dbd5bb082ae69fb5e9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Box that contains just triangle number "tri_id" from the specified mesh. <a href="classmingfx_1_1_a_a_b_b.html#a2bf325127a89d7dbd5bb082ae69fb5e9">More...</a><br /></td></tr>
+<tr class="separator:a2bf325127a89d7dbd5bb082ae69fb5e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb63c176a2f2408e803d9a2f6848eee5"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#aeb63c176a2f2408e803d9a2f6848eee5">~AABB</a> ()</td></tr>
+<tr class="separator:aeb63c176a2f2408e803d9a2f6848eee5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3bf7d5ffa3ccccf7111e98d88a3ffeec"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a3bf7d5ffa3ccccf7111e98d88a3ffeec">Dimensions</a> () const</td></tr>
+<tr class="memdesc:a3bf7d5ffa3ccccf7111e98d88a3ffeec"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the dimensions of the box in x, y, and z as a 3D vector. <a href="classmingfx_1_1_a_a_b_b.html#a3bf7d5ffa3ccccf7111e98d88a3ffeec">More...</a><br /></td></tr>
+<tr class="separator:a3bf7d5ffa3ccccf7111e98d88a3ffeec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ea0cf1c4051185b3f4296d20dd330c9"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a1ea0cf1c4051185b3f4296d20dd330c9">Volume</a> () const</td></tr>
+<tr class="memdesc:a1ea0cf1c4051185b3f4296d20dd330c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the volume of the box or -1.0 when empty and 0.0 if the box contains just a single point. <a href="classmingfx_1_1_a_a_b_b.html#a1ea0cf1c4051185b3f4296d20dd330c9">More...</a><br /></td></tr>
+<tr class="separator:a1ea0cf1c4051185b3f4296d20dd330c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3b46cdd39ffed26b7982d641b53158e6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a3b46cdd39ffed26b7982d641b53158e6">min</a> () const</td></tr>
+<tr class="memdesc:a3b46cdd39ffed26b7982d641b53158e6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the coordinates for the minimum corner of the box. <a href="classmingfx_1_1_a_a_b_b.html#a3b46cdd39ffed26b7982d641b53158e6">More...</a><br /></td></tr>
+<tr class="separator:a3b46cdd39ffed26b7982d641b53158e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abac247fedc82467c6b058ed4fe77d2a4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#abac247fedc82467c6b058ed4fe77d2a4">max</a> () const</td></tr>
+<tr class="memdesc:abac247fedc82467c6b058ed4fe77d2a4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the coordinates for the maximum corner of the box. <a href="classmingfx_1_1_a_a_b_b.html#abac247fedc82467c6b058ed4fe77d2a4">More...</a><br /></td></tr>
+<tr class="separator:abac247fedc82467c6b058ed4fe77d2a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade89d21e799a97e7d82be5d593ee2e4b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#ade89d21e799a97e7d82be5d593ee2e4b">set_user_data</a> (int data)</td></tr>
+<tr class="memdesc:ade89d21e799a97e7d82be5d593ee2e4b"><td class="mdescLeft">&#160;</td><td class="mdescRight">You can set this to whatever you want in order to use it as a handle into your own program. The intent is to make it possible for you to associate this <a class="el" href="classmingfx_1_1_a_a_b_b.html" title="A 3D axis-aligned bounding box defined by two corners (min and max).">AABB</a> with the id of some object in your application. <a href="classmingfx_1_1_a_a_b_b.html#ade89d21e799a97e7d82be5d593ee2e4b">More...</a><br /></td></tr>
+<tr class="separator:ade89d21e799a97e7d82be5d593ee2e4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35def5a4ee2ecd287f5c71436b2c5843"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a35def5a4ee2ecd287f5c71436b2c5843">user_data</a> ()</td></tr>
+<tr class="memdesc:a35def5a4ee2ecd287f5c71436b2c5843"><td class="mdescLeft">&#160;</td><td class="mdescRight">You can set this to whatever you want in order to use it as a handle into your own program. The intent is to make it possible for you to associate this <a class="el" href="classmingfx_1_1_a_a_b_b.html" title="A 3D axis-aligned bounding box defined by two corners (min and max).">AABB</a> with the id of some object in your application. <a href="classmingfx_1_1_a_a_b_b.html#a35def5a4ee2ecd287f5c71436b2c5843">More...</a><br /></td></tr>
+<tr class="separator:a35def5a4ee2ecd287f5c71436b2c5843"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="friends"></a>
+Friends</h2></td></tr>
+<tr class="memitem:a60e301aa632dd49eccdc27bab7c6d231"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html#a60e301aa632dd49eccdc27bab7c6d231">operator+</a> (const <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;A, const <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;B)</td></tr>
+<tr class="separator:a60e301aa632dd49eccdc27bab7c6d231"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="af7acb376dbda50fa1d8c30d1b5eb85fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af7acb376dbda50fa1d8c30d1b5eb85fb">&#9670;&nbsp;</a></span>AABB() <span class="overload">[1/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::AABB::AABB </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates an empty box. </p>
+
+</div>
+</div>
+<a id="a5bf74f4e7f64adae9ea66f213a4012d1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5bf74f4e7f64adae9ea66f213a4012d1">&#9670;&nbsp;</a></span>AABB() <span class="overload">[2/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::AABB::AABB </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Box that contains a single point. </p>
+
+</div>
+</div>
+<a id="aaa44f815006b66f67da76fd89c02a0cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaa44f815006b66f67da76fd89c02a0cf">&#9670;&nbsp;</a></span>AABB() <span class="overload">[3/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::AABB::AABB </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>c</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Box that contains a triangle defined by 3 points. </p>
+
+</div>
+</div>
+<a id="a0f3e7d3b4012e25018ad4c51edafd4f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0f3e7d3b4012e25018ad4c51edafd4f8">&#9670;&nbsp;</a></span>AABB() <span class="overload">[4/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::AABB::AABB </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>extents</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Box centered at the origin with width, height, and depth specified by the vector. </p>
+
+</div>
+</div>
+<a id="a7c47fca94d56a2845ca7729d580ee7d1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7c47fca94d56a2845ca7729d580ee7d1">&#9670;&nbsp;</a></span>AABB() <span class="overload">[5/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::AABB::AABB </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>center</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>extents</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Box centered at the center with width, height, and depth specified by the vector. </p>
+
+</div>
+</div>
+<a id="a95e244e6e0774c815de6b9434218ee09"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a95e244e6e0774c815de6b9434218ee09">&#9670;&nbsp;</a></span>AABB() <span class="overload">[6/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::AABB::AABB </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;&#160;</td>
+ <td class="paramname"><em>mesh</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Box that contains a whole mesh. </p>
+
+</div>
+</div>
+<a id="a2bf325127a89d7dbd5bb082ae69fb5e9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2bf325127a89d7dbd5bb082ae69fb5e9">&#9670;&nbsp;</a></span>AABB() <span class="overload">[7/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::AABB::AABB </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;&#160;</td>
+ <td class="paramname"><em>mesh</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned int&#160;</td>
+ <td class="paramname"><em>tri_id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Box that contains just triangle number "tri_id" from the specified mesh. </p>
+
+</div>
+</div>
+<a id="aeb63c176a2f2408e803d9a2f6848eee5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeb63c176a2f2408e803d9a2f6848eee5">&#9670;&nbsp;</a></span>~AABB()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::AABB::~AABB </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a3bf7d5ffa3ccccf7111e98d88a3ffeec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3bf7d5ffa3ccccf7111e98d88a3ffeec">&#9670;&nbsp;</a></span>Dimensions()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::AABB::Dimensions </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the dimensions of the box in x, y, and z as a 3D vector. </p>
+
+</div>
+</div>
+<a id="abac247fedc82467c6b058ed4fe77d2a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abac247fedc82467c6b058ed4fe77d2a4">&#9670;&nbsp;</a></span>max()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::AABB::max </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the coordinates for the maximum corner of the box. </p>
+
+</div>
+</div>
+<a id="a3b46cdd39ffed26b7982d641b53158e6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3b46cdd39ffed26b7982d641b53158e6">&#9670;&nbsp;</a></span>min()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::AABB::min </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the coordinates for the minimum corner of the box. </p>
+
+</div>
+</div>
+<a id="ade89d21e799a97e7d82be5d593ee2e4b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ade89d21e799a97e7d82be5d593ee2e4b">&#9670;&nbsp;</a></span>set_user_data()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::AABB::set_user_data </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>data</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>You can set this to whatever you want in order to use it as a handle into your own program. The intent is to make it possible for you to associate this <a class="el" href="classmingfx_1_1_a_a_b_b.html" title="A 3D axis-aligned bounding box defined by two corners (min and max).">AABB</a> with the id of some object in your application. </p>
+
+</div>
+</div>
+<a id="a35def5a4ee2ecd287f5c71436b2c5843"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a35def5a4ee2ecd287f5c71436b2c5843">&#9670;&nbsp;</a></span>user_data()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int mingfx::AABB::user_data </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>You can set this to whatever you want in order to use it as a handle into your own program. The intent is to make it possible for you to associate this <a class="el" href="classmingfx_1_1_a_a_b_b.html" title="A 3D axis-aligned bounding box defined by two corners (min and max).">AABB</a> with the id of some object in your application. </p>
+
+</div>
+</div>
+<a id="a1ea0cf1c4051185b3f4296d20dd330c9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1ea0cf1c4051185b3f4296d20dd330c9">&#9670;&nbsp;</a></span>Volume()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::AABB::Volume </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the volume of the box or -1.0 when empty and 0.0 if the box contains just a single point. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Friends And Related Function Documentation</h2>
+<a id="a60e301aa632dd49eccdc27bab7c6d231"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a60e301aa632dd49eccdc27bab7c6d231">&#9670;&nbsp;</a></span>operator+</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;&#160;</td>
+ <td class="paramname"><em>A</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;&#160;</td>
+ <td class="paramname"><em>B</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">friend</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="aabb_8h_source.html">aabb.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_b_v_h-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_b_v_h-members.html
new file mode 100644
index 0000000..68ec3cc
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_b_v_h-members.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_b_v_h.html">BVH</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::BVH Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_b_v_h.html">mingfx::BVH</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75">BVH</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_b_v_h.html">mingfx::BVH</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_b_v_h.html#a964420ca931fa93c420f0820e1b95942">CreateFromListOfBoxes</a>(const std::vector&lt; AABB &gt; &amp;boxes)</td><td class="entry"><a class="el" href="classmingfx_1_1_b_v_h.html">mingfx::BVH</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_b_v_h.html#a8ed3e91ecd2a0585a0dbac605d6f2c71">CreateFromMesh</a>(const Mesh &amp;mesh)</td><td class="entry"><a class="el" href="classmingfx_1_1_b_v_h.html">mingfx::BVH</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_b_v_h.html#afad54f50a29e8b3aace6cdec5c792c56">IntersectAndReturnUserData</a>(const Ray &amp;r) const</td><td class="entry"><a class="el" href="classmingfx_1_1_b_v_h.html">mingfx::BVH</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_b_v_h.html#af81906830adcf4648cc8cf4e214b4269">~BVH</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_b_v_h.html">mingfx::BVH</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_b_v_h.html b/dev/MinGfx/docs/html/classmingfx_1_1_b_v_h.html
new file mode 100644
index 0000000..032d128
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_b_v_h.html
@@ -0,0 +1,232 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::BVH Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_b_v_h.html">BVH</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_b_v_h-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::BVH Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A Bounding Volume Hierarchy (<a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a>) data structure that can be used to accelerate ray-object intersection tests by carving up space into a hierarchy of partitions represented in a tree. </p>
+<p>Each node of the tree is represented as an <a class="el" href="classmingfx_1_1_a_a_b_b.html" title="A 3D axis-aligned bounding box defined by two corners (min and max).">AABB</a> (Axis-Aligned Bounding Box) that contains all of the nodes under it. Different objects can be stored inside each bounding box. For example, when a <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> is created for a mesh, each leaf node can contain a <a class="el" href="classmingfx_1_1_a_a_b_b.html" title="A 3D axis-aligned bounding box defined by two corners (min and max).">AABB</a> that contains just a single triangle. Or, when a <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> is created for an entire scene, you could have each leaf node contain an entire mesh or other object within the scene. In each case, use <a class="el" href="classmingfx_1_1_a_a_b_b.html" title="A 3D axis-aligned bounding box defined by two corners (min and max).">AABB</a>'s set_user_data() and user_data() methods to store a handle for whetever you want to store inside the nodes. </p>
+
+<p class="definition">Definition at line <a class="el" href="bvh_8h_source.html#l00040">40</a> of file <a class="el" href="bvh_8h_source.html">bvh.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="bvh_8h_source.html">bvh.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:af812656193d247be31dd038a8e2fff75"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75">BVH</a> ()</td></tr>
+<tr class="memdesc:af812656193d247be31dd038a8e2fff75"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes the class with an empty hierarchy. <a href="classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75">More...</a><br /></td></tr>
+<tr class="separator:af812656193d247be31dd038a8e2fff75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af81906830adcf4648cc8cf4e214b4269"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_b_v_h.html#af81906830adcf4648cc8cf4e214b4269">~BVH</a> ()</td></tr>
+<tr class="separator:af81906830adcf4648cc8cf4e214b4269"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ed3e91ecd2a0585a0dbac605d6f2c71"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_b_v_h.html#a8ed3e91ecd2a0585a0dbac605d6f2c71">CreateFromMesh</a> (const <a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;mesh)</td></tr>
+<tr class="memdesc:a8ed3e91ecd2a0585a0dbac605d6f2c71"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a bounding volume hierarchy where each leaf node contains a single triangle from the mesh. <a href="classmingfx_1_1_b_v_h.html#a8ed3e91ecd2a0585a0dbac605d6f2c71">More...</a><br /></td></tr>
+<tr class="separator:a8ed3e91ecd2a0585a0dbac605d6f2c71"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a964420ca931fa93c420f0820e1b95942"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_b_v_h.html#a964420ca931fa93c420f0820e1b95942">CreateFromListOfBoxes</a> (const std::vector&lt; <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &gt; &amp;boxes)</td></tr>
+<tr class="memdesc:a964420ca931fa93c420f0820e1b95942"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> where each leaf node contains one of the boxes passed in to the function. <a href="classmingfx_1_1_b_v_h.html#a964420ca931fa93c420f0820e1b95942">More...</a><br /></td></tr>
+<tr class="separator:a964420ca931fa93c420f0820e1b95942"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afad54f50a29e8b3aace6cdec5c792c56"><td class="memItemLeft" align="right" valign="top">std::vector&lt; int &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_b_v_h.html#afad54f50a29e8b3aace6cdec5c792c56">IntersectAndReturnUserData</a> (const <a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;r) const</td></tr>
+<tr class="memdesc:afad54f50a29e8b3aace6cdec5c792c56"><td class="mdescLeft">&#160;</td><td class="mdescRight">Traverse the <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> to find leaf nodes whose AABBs are intersected by the ray. <a href="classmingfx_1_1_b_v_h.html#afad54f50a29e8b3aace6cdec5c792c56">More...</a><br /></td></tr>
+<tr class="separator:afad54f50a29e8b3aace6cdec5c792c56"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="af812656193d247be31dd038a8e2fff75"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af812656193d247be31dd038a8e2fff75">&#9670;&nbsp;</a></span>BVH()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::BVH::BVH </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Initializes the class with an empty hierarchy. </p>
+
+</div>
+</div>
+<a id="af81906830adcf4648cc8cf4e214b4269"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af81906830adcf4648cc8cf4e214b4269">&#9670;&nbsp;</a></span>~BVH()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::BVH::~BVH </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a964420ca931fa93c420f0820e1b95942"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a964420ca931fa93c420f0820e1b95942">&#9670;&nbsp;</a></span>CreateFromListOfBoxes()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::BVH::CreateFromListOfBoxes </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>boxes</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> where each leaf node contains one of the boxes passed in to the function. </p>
+
+</div>
+</div>
+<a id="a8ed3e91ecd2a0585a0dbac605d6f2c71"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8ed3e91ecd2a0585a0dbac605d6f2c71">&#9670;&nbsp;</a></span>CreateFromMesh()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::BVH::CreateFromMesh </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;&#160;</td>
+ <td class="paramname"><em>mesh</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a bounding volume hierarchy where each leaf node contains a single triangle from the mesh. </p>
+<p>For leaf nodes, the triangle index can be retrieved with: </p><div class="fragment"><div class="line"><span class="keywordtype">int</span> tri_id = leafnode-&gt;box.user_data();</div>
+</div><!-- fragment --><p> The user_data will be -1 for non-leaf nodes. Once the structure has been created, it can be used to perform fast ray-mesh intersection tests. See <a class="el" href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc" title="Checks to see if the ray intersects a triangle mesh.">Ray::FastIntersectMesh()</a>. </p>
+
+</div>
+</div>
+<a id="afad54f50a29e8b3aace6cdec5c792c56"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afad54f50a29e8b3aace6cdec5c792c56">&#9670;&nbsp;</a></span>IntersectAndReturnUserData()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::vector&lt;int&gt; mingfx::BVH::IntersectAndReturnUserData </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;&#160;</td>
+ <td class="paramname"><em>r</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Traverse the <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> to find leaf nodes whose AABBs are intersected by the ray. </p>
+<p>These are candidates to test more thoroughly using whatever ray-object intersection test is appropriate for the objects stored inside the <a class="el" href="classmingfx_1_1_a_a_b_b.html" title="A 3D axis-aligned bounding box defined by two corners (min and max).">AABB</a>. This routine returns the user_data for each <a class="el" href="classmingfx_1_1_a_a_b_b.html" title="A 3D axis-aligned bounding box defined by two corners (min and max).">AABB</a> leaf node. In the case of a <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> created using CreateFromMesh, this means it stores the indices to the mesh triangles that should be tested for ray-triangle intersection. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="bvh_8h_source.html">bvh.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_color-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_color-members.html
new file mode 100644
index 0000000..2ad8cd6
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_color-members.html
@@ -0,0 +1,109 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_color.html">Color</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::Color Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">Color</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_color.html#a81b442b8afcd157c260487081f25dcc3">Color</a>(float red, float green, float blue, float alpha=1.0)</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_color.html#ab4d6c067128e779add5390d83ea3410e">Color</a>(float *p)</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_color.html#a7e0ca85141895a108c852f59f7ca00b9">Color</a>(const std::vector&lt; float &gt; &amp;vals)</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_color.html#accb83cd759b7290ce2817724d57e246a">Color</a>(const Color &amp;p)</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_color.html#abdec9bbfdd82ed75afc45b103c8bbcf4">Lerp</a>(const Color &amp;b, float alpha) const</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_color.html#a883787431fef36c06c724c3b9ed25363">Lerp</a>(const Color &amp;a, const Color &amp;b, float alpha)</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_color.html#acf92f9f413cf11639b73dc0d7d431244">operator!=</a>(const Color &amp;p) const</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_color.html#ae51a066a9bb018e4f050d9b8cc7f330e">operator=</a>(const Color &amp;p)</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_color.html#a5411077527ff2a12d18ce1ae52688cf0">operator==</a>(const Color &amp;p) const</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_color.html#aa879c4f6e90c419a2c121e323ce31500">operator[]</a>(const int i) const</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_color.html#a474ed028db8b31e359d8bfec50147bcc">operator[]</a>(const int i)</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_color.html#ae7371e464c4af7ac93d9edd4c0772c2b">ToVector</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_color.html#aa3a93033db8e00aff817a125eb5b54a0">value_ptr</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_color.html#ab1a90432dd7fd7b2adf41d747be85378">~Color</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_color.html b/dev/MinGfx/docs/html/classmingfx_1_1_color.html
new file mode 100644
index 0000000..d863be4
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_color.html
@@ -0,0 +1,529 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::Color Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_color.html">Color</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_color-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::Color Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with OpenGL. </p>
+<p>Example usage: </p><div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">Color</a> black(0, 0, 0);</div>
+<div class="line"><a class="code" href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">Color</a> white(1, 1, 1);</div>
+<div class="line"><a class="code" href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">Color</a> gray(0.5, 0.5, 0.5);</div>
+<div class="line"><a class="code" href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">Color</a> tranparent_red(1.0, 0.0, 0.0, 0.5);</div>
+<div class="line"><a class="code" href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">Color</a> orange(1.0, 0.65, 0.0);</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">float</span> red_component_of_orange = orange[0];</div>
+<div class="line"><span class="keywordtype">float</span> green_component_of_orange = orange[1];</div>
+<div class="line"><span class="keywordtype">float</span> blue_component_of_orange = orange[2];</div>
+<div class="line"><span class="keywordtype">float</span> alpha_component_of_orange = orange[3];</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// Use value_ptr() to send the array of floats directly to OpenGL commands</span></div>
+<div class="line">glColor4fv(orange.value_ptr());</div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_ab4d264b5a1189b73443948c01eab088d"><div class="ttname"><a href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">mingfx::Color::Color</a></div><div class="ttdeci">Color()</div><div class="ttdoc">Defaults to black.</div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="color_8h_source.html#l00041">41</a> of file <a class="el" href="color_8h_source.html">color.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="color_8h_source.html">color.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ab4d264b5a1189b73443948c01eab088d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">Color</a> ()</td></tr>
+<tr class="memdesc:ab4d264b5a1189b73443948c01eab088d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Defaults to black. <a href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">More...</a><br /></td></tr>
+<tr class="separator:ab4d264b5a1189b73443948c01eab088d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81b442b8afcd157c260487081f25dcc3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#a81b442b8afcd157c260487081f25dcc3">Color</a> (float red, float green, float blue, float alpha=1.0)</td></tr>
+<tr class="memdesc:a81b442b8afcd157c260487081f25dcc3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a color. Alpha defaults to 1.0 (completely opaque) <a href="classmingfx_1_1_color.html#a81b442b8afcd157c260487081f25dcc3">More...</a><br /></td></tr>
+<tr class="separator:a81b442b8afcd157c260487081f25dcc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4d6c067128e779add5390d83ea3410e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#ab4d6c067128e779add5390d83ea3410e">Color</a> (float *p)</td></tr>
+<tr class="memdesc:ab4d6c067128e779add5390d83ea3410e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a point given a pointer to float array. <a href="classmingfx_1_1_color.html#ab4d6c067128e779add5390d83ea3410e">More...</a><br /></td></tr>
+<tr class="separator:ab4d6c067128e779add5390d83ea3410e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e0ca85141895a108c852f59f7ca00b9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#a7e0ca85141895a108c852f59f7ca00b9">Color</a> (const std::vector&lt; float &gt; &amp;vals)</td></tr>
+<tr class="memdesc:a7e0ca85141895a108c852f59f7ca00b9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a point given a 3 or 4-element vector of floats. <a href="classmingfx_1_1_color.html#a7e0ca85141895a108c852f59f7ca00b9">More...</a><br /></td></tr>
+<tr class="separator:a7e0ca85141895a108c852f59f7ca00b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:accb83cd759b7290ce2817724d57e246a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#accb83cd759b7290ce2817724d57e246a">Color</a> (const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;p)</td></tr>
+<tr class="memdesc:accb83cd759b7290ce2817724d57e246a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy constructor. <a href="classmingfx_1_1_color.html#accb83cd759b7290ce2817724d57e246a">More...</a><br /></td></tr>
+<tr class="separator:accb83cd759b7290ce2817724d57e246a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1a90432dd7fd7b2adf41d747be85378"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#ab1a90432dd7fd7b2adf41d747be85378">~Color</a> ()</td></tr>
+<tr class="memdesc:ab1a90432dd7fd7b2adf41d747be85378"><td class="mdescLeft">&#160;</td><td class="mdescRight"><a class="el" href="classmingfx_1_1_color.html" title="Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with Op...">Color</a> destructor. <a href="classmingfx_1_1_color.html#ab1a90432dd7fd7b2adf41d747be85378">More...</a><br /></td></tr>
+<tr class="separator:ab1a90432dd7fd7b2adf41d747be85378"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5411077527ff2a12d18ce1ae52688cf0"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#a5411077527ff2a12d18ce1ae52688cf0">operator==</a> (const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;p) const</td></tr>
+<tr class="memdesc:a5411077527ff2a12d18ce1ae52688cf0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for equality. <a href="classmingfx_1_1_color.html#a5411077527ff2a12d18ce1ae52688cf0">More...</a><br /></td></tr>
+<tr class="separator:a5411077527ff2a12d18ce1ae52688cf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acf92f9f413cf11639b73dc0d7d431244"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#acf92f9f413cf11639b73dc0d7d431244">operator!=</a> (const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;p) const</td></tr>
+<tr class="memdesc:acf92f9f413cf11639b73dc0d7d431244"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for inequality. <a href="classmingfx_1_1_color.html#acf92f9f413cf11639b73dc0d7d431244">More...</a><br /></td></tr>
+<tr class="separator:acf92f9f413cf11639b73dc0d7d431244"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae51a066a9bb018e4f050d9b8cc7f330e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#ae51a066a9bb018e4f050d9b8cc7f330e">operator=</a> (const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;p)</td></tr>
+<tr class="memdesc:ae51a066a9bb018e4f050d9b8cc7f330e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Assignment operator. <a href="classmingfx_1_1_color.html#ae51a066a9bb018e4f050d9b8cc7f330e">More...</a><br /></td></tr>
+<tr class="separator:ae51a066a9bb018e4f050d9b8cc7f330e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa879c4f6e90c419a2c121e323ce31500"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#aa879c4f6e90c419a2c121e323ce31500">operator[]</a> (const int i) const</td></tr>
+<tr class="memdesc:aa879c4f6e90c419a2c121e323ce31500"><td class="mdescLeft">&#160;</td><td class="mdescRight">Accesses the ith component of the color, stored in RGBA order. <a href="classmingfx_1_1_color.html#aa879c4f6e90c419a2c121e323ce31500">More...</a><br /></td></tr>
+<tr class="separator:aa879c4f6e90c419a2c121e323ce31500"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a474ed028db8b31e359d8bfec50147bcc"><td class="memItemLeft" align="right" valign="top">float &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#a474ed028db8b31e359d8bfec50147bcc">operator[]</a> (const int i)</td></tr>
+<tr class="memdesc:a474ed028db8b31e359d8bfec50147bcc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Accesses the ith coordinate of the color, stored in RGBA order. <a href="classmingfx_1_1_color.html#a474ed028db8b31e359d8bfec50147bcc">More...</a><br /></td></tr>
+<tr class="separator:a474ed028db8b31e359d8bfec50147bcc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3a93033db8e00aff817a125eb5b54a0"><td class="memItemLeft" align="right" valign="top">const float *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#aa3a93033db8e00aff817a125eb5b54a0">value_ptr</a> () const</td></tr>
+<tr class="memdesc:aa3a93033db8e00aff817a125eb5b54a0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a const pointer to the raw data array. <a href="classmingfx_1_1_color.html#aa3a93033db8e00aff817a125eb5b54a0">More...</a><br /></td></tr>
+<tr class="separator:aa3a93033db8e00aff817a125eb5b54a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7371e464c4af7ac93d9edd4c0772c2b"><td class="memItemLeft" align="right" valign="top">std::vector&lt; float &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#ae7371e464c4af7ac93d9edd4c0772c2b">ToVector</a> () const</td></tr>
+<tr class="separator:ae7371e464c4af7ac93d9edd4c0772c2b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abdec9bbfdd82ed75afc45b103c8bbcf4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#abdec9bbfdd82ed75afc45b103c8bbcf4">Lerp</a> (const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;b, float alpha) const</td></tr>
+<tr class="memdesc:abdec9bbfdd82ed75afc45b103c8bbcf4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Linear interpolation between this color and another. Alpha=0.0 returns this color, and alpha=1.0 returns the other color, other values blend between the two via a linear interpolation on each color channel. <a href="classmingfx_1_1_color.html#abdec9bbfdd82ed75afc45b103c8bbcf4">More...</a><br /></td></tr>
+<tr class="separator:abdec9bbfdd82ed75afc45b103c8bbcf4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:a883787431fef36c06c724c3b9ed25363"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html#a883787431fef36c06c724c3b9ed25363">Lerp</a> (const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;a, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;b, float alpha)</td></tr>
+<tr class="memdesc:a883787431fef36c06c724c3b9ed25363"><td class="mdescLeft">&#160;</td><td class="mdescRight">Linear interpolation between two colors. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b', other values blend between the two via a linear interpolation on each color channel. <a href="classmingfx_1_1_color.html#a883787431fef36c06c724c3b9ed25363">More...</a><br /></td></tr>
+<tr class="separator:a883787431fef36c06c724c3b9ed25363"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="ab4d264b5a1189b73443948c01eab088d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab4d264b5a1189b73443948c01eab088d">&#9670;&nbsp;</a></span>Color() <span class="overload">[1/5]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Color::Color </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Defaults to black. </p>
+
+</div>
+</div>
+<a id="a81b442b8afcd157c260487081f25dcc3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81b442b8afcd157c260487081f25dcc3">&#9670;&nbsp;</a></span>Color() <span class="overload">[2/5]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Color::Color </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>red</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>green</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>blue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em> = <code>1.0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a color. Alpha defaults to 1.0 (completely opaque) </p>
+
+</div>
+</div>
+<a id="ab4d6c067128e779add5390d83ea3410e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab4d6c067128e779add5390d83ea3410e">&#9670;&nbsp;</a></span>Color() <span class="overload">[3/5]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Color::Color </td>
+ <td>(</td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a point given a pointer to float array. </p>
+
+</div>
+</div>
+<a id="a7e0ca85141895a108c852f59f7ca00b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e0ca85141895a108c852f59f7ca00b9">&#9670;&nbsp;</a></span>Color() <span class="overload">[4/5]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Color::Color </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; float &gt; &amp;&#160;</td>
+ <td class="paramname"><em>vals</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a point given a 3 or 4-element vector of floats. </p>
+
+</div>
+</div>
+<a id="accb83cd759b7290ce2817724d57e246a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#accb83cd759b7290ce2817724d57e246a">&#9670;&nbsp;</a></span>Color() <span class="overload">[5/5]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Color::Color </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy constructor. </p>
+
+</div>
+</div>
+<a id="ab1a90432dd7fd7b2adf41d747be85378"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab1a90432dd7fd7b2adf41d747be85378">&#9670;&nbsp;</a></span>~Color()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::Color::~Color </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p><a class="el" href="classmingfx_1_1_color.html" title="Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with Op...">Color</a> destructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a883787431fef36c06c724c3b9ed25363"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a883787431fef36c06c724c3b9ed25363">&#9670;&nbsp;</a></span>Lerp() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_color.html">Color</a> mingfx::Color::Lerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Linear interpolation between two colors. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b', other values blend between the two via a linear interpolation on each color channel. </p>
+
+</div>
+</div>
+<a id="abdec9bbfdd82ed75afc45b103c8bbcf4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abdec9bbfdd82ed75afc45b103c8bbcf4">&#9670;&nbsp;</a></span>Lerp() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_color.html">Color</a> mingfx::Color::Lerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Linear interpolation between this color and another. Alpha=0.0 returns this color, and alpha=1.0 returns the other color, other values blend between the two via a linear interpolation on each color channel. </p>
+
+</div>
+</div>
+<a id="acf92f9f413cf11639b73dc0d7d431244"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acf92f9f413cf11639b73dc0d7d431244">&#9670;&nbsp;</a></span>operator!=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Color::operator!= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for inequality. </p>
+
+</div>
+</div>
+<a id="ae51a066a9bb018e4f050d9b8cc7f330e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae51a066a9bb018e4f050d9b8cc7f330e">&#9670;&nbsp;</a></span>operator=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_color.html">Color</a>&amp; mingfx::Color::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Assignment operator. </p>
+
+</div>
+</div>
+<a id="a5411077527ff2a12d18ce1ae52688cf0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5411077527ff2a12d18ce1ae52688cf0">&#9670;&nbsp;</a></span>operator==()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Color::operator== </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for equality. </p>
+
+</div>
+</div>
+<a id="a474ed028db8b31e359d8bfec50147bcc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a474ed028db8b31e359d8bfec50147bcc">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float&amp; mingfx::Color::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Accesses the ith coordinate of the color, stored in RGBA order. </p>
+
+</div>
+</div>
+<a id="aa879c4f6e90c419a2c121e323ce31500"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa879c4f6e90c419a2c121e323ce31500">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Color::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Accesses the ith component of the color, stored in RGBA order. </p>
+
+</div>
+</div>
+<a id="ae7371e464c4af7ac93d9edd4c0772c2b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae7371e464c4af7ac93d9edd4c0772c2b">&#9670;&nbsp;</a></span>ToVector()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::vector&lt;float&gt; mingfx::Color::ToVector </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aa3a93033db8e00aff817a125eb5b54a0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa3a93033db8e00aff817a125eb5b54a0">&#9670;&nbsp;</a></span>value_ptr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const float* mingfx::Color::value_ptr </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a const pointer to the raw data array. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="color_8h_source.html">color.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_craft_cam-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_craft_cam-members.html
new file mode 100644
index 0000000..758badd
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_craft_cam-members.html
@@ -0,0 +1,110 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_craft_cam.html">CraftCam</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::CraftCam Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171">CraftCam</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#ab9e1864b5859c22d27ba809b1ba7a51f">CraftCam</a>(const Matrix4 &amp;initial_view_matrix)</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a82a8e20596247e2986e5929c1ef7f150">eye</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a2c7546bccfbf986eb9cd0a2784f74859">look</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a96ba4a36029ca8234576cbf2791c5ccb">look_scale</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311">OnMouseMove</a>(const Vector2 &amp;normalized_mouse_delta)</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a9fe22cc3b933b12674a5b8f1b5c834ac">rotation_scale</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a15092ae5de6920546e3ce79aeb196f44">set_look_scale</a>(float s)</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a352f5a42f6e88d2e599bd5acb42e5831">set_rotation_scale</a>(float s)</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a151fde09d08001ee2a615f25ec1acea7">set_translation_scale</a>(float s)</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8">set_view_matrix</a>(Matrix4 view_matrix)</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a93567af7acbae2939d57cfd8a72bcef2">translation_scale</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#ae3d9c7ea9307dbbadaa4b6e2f9933a7b">UpdateHeight</a>(float new_y_value)</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7">UpdateSimulation</a>(double dt, GLFWwindow *window_ptr)</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36">view_matrix</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html#a85ef9bebdd1595be1288bc104245f4ff">~CraftCam</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_craft_cam.html b/dev/MinGfx/docs/html/classmingfx_1_1_craft_cam.html
new file mode 100644
index 0000000..502b4cb
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_craft_cam.html
@@ -0,0 +1,541 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::CraftCam Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_craft_cam.html">CraftCam</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_craft_cam-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::CraftCam Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This implements a user interface for controlling the camera with the mouse. </p>
+<p>This interface is appropriate for "first person" camera control, as in games like Minecraft.</p>
+<p>Use the arrow keys or A,S,W,Z keys to move around in the virtual world. UP/DOWN and W/Z move forward and back. LEFT/RIGHT or A/S rotate your body to face left or right. You can rotate and tilt your head to look left/right/up/down by moving the mouse. In Minecraft, that movement happens whenever you move the mouse, regardless of whether you are holding down a mouse button, but in some games you want to hold the camera still while you use the mouse to draw on the screen or do something else. It's possible to use this interface both ways by calling the MouseMove() function either every time the mouse moves, or only when the mouse is in a dragging mode.</p>
+<p>Example usage: </p><div class="fragment"><div class="line"><span class="comment">// Create a global or member variable in your MyGraphicsApp class:</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171">CraftCam</a> cam_;</div>
+<div class="line"> </div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// If you want to always rotate the view with the mouse, use this:</span></div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::OnMouseMove(<span class="keyword">const</span> Point2 &amp;pos, <span class="keyword">const</span> Vector2 &amp;delta) {</div>
+<div class="line"> Vector2 delta_ndc = PixelsToNormalizedDeviceCoords(pos);</div>
+<div class="line"> cam_.OnMouseMove(delta_ndc);</div>
+<div class="line">}</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// Alternatively, if you want to only rotate the view when the mouse button is</span></div>
+<div class="line"><span class="comment">// held down, use this instead. Call cam_.OnMouseMove() in either one function</span></div>
+<div class="line"><span class="comment">// or the other, but not both!</span></div>
+<div class="line"><span class="comment">// void MyGraphicsApp::OnLeftMouseDrag(const Point2 &amp;pos, const Vector2 &amp;delta) {</span></div>
+<div class="line"><span class="comment">// Vector2 delta_ndc = PixelsToNormalizedDeviceCoords(pos);</span></div>
+<div class="line"><span class="comment">// cam_.OnMouseMove(delta_ndc);</span></div>
+<div class="line"><span class="comment">// }</span></div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// This tells the camera to simulate walking based on the keyboard keys currently</span></div>
+<div class="line"><span class="comment">// pressed. You need to pass a pointer to the underlying GLFW window created by</span></div>
+<div class="line"><span class="comment">// GraphicsApp.</span></div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::UpdateSimulation(<span class="keywordtype">double</span> dt) {</div>
+<div class="line"> cam_.UpdateSimulation(dt, window());</div>
+<div class="line">}</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::InitOpenGL() {</div>
+<div class="line"> cam_.set_view_matrix(Matrix4::lookAt(Point3(0,2,2), Point3(0,2,0), Vector3(0,1,0)););</div>
+<div class="line">}</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::DrawOpenGL() {</div>
+<div class="line"> <span class="comment">// draw your scene using the view matrix from the camera</span></div>
+<div class="line"> Matrix4 proj_matrix = Matrix4::perspective(60, aspect_ratio(), 1, 200);</div>
+<div class="line"> Matrix4 <a class="code" href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36">view_matrix</a> = cam_.view_matrix();</div>
+<div class="line"> Matrix4 model_matrix = Matrix4::RotateY(to_radians(45.0));</div>
+<div class="line"> quick_shapes.DrawCube(model_matrix, view_matirx, proj_matrix, Color(1,1,1));</div>
+<div class="line">}</div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_acccdadc08d8d8a0b7b9426f18209ff36"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36">mingfx::CraftCam::view_matrix</a></div><div class="ttdeci">Matrix4 view_matrix()</div><div class="ttdoc">Access the camera view matrix created by the CraftCam interactions via this method and use it to draw...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_ae0b0e8d75ffc69c6373a13f1f9c2f171"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171">mingfx::CraftCam::CraftCam</a></div><div class="ttdeci">CraftCam()</div><div class="ttdoc">Creates a CraftCam object with an initial view matrix = identity.</div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="craft__cam_8h_source.html#l00079">79</a> of file <a class="el" href="craft__cam_8h_source.html">craft_cam.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="craft__cam_8h_source.html">craft_cam.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ae0b0e8d75ffc69c6373a13f1f9c2f171"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171">CraftCam</a> ()</td></tr>
+<tr class="memdesc:ae0b0e8d75ffc69c6373a13f1f9c2f171"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a <a class="el" href="classmingfx_1_1_craft_cam.html" title="This implements a user interface for controlling the camera with the mouse.">CraftCam</a> object with an initial view matrix = identity. <a href="classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171">More...</a><br /></td></tr>
+<tr class="separator:ae0b0e8d75ffc69c6373a13f1f9c2f171"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab9e1864b5859c22d27ba809b1ba7a51f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#ab9e1864b5859c22d27ba809b1ba7a51f">CraftCam</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;initial_view_matrix)</td></tr>
+<tr class="memdesc:ab9e1864b5859c22d27ba809b1ba7a51f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a <a class="el" href="classmingfx_1_1_craft_cam.html" title="This implements a user interface for controlling the camera with the mouse.">CraftCam</a> object with the supplied initial view matrix. <a href="classmingfx_1_1_craft_cam.html#ab9e1864b5859c22d27ba809b1ba7a51f">More...</a><br /></td></tr>
+<tr class="separator:ab9e1864b5859c22d27ba809b1ba7a51f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85ef9bebdd1595be1288bc104245f4ff"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a85ef9bebdd1595be1288bc104245f4ff">~CraftCam</a> ()</td></tr>
+<tr class="separator:a85ef9bebdd1595be1288bc104245f4ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b7808e489933b117583cf709fa46bc7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7">UpdateSimulation</a> (double dt, GLFWwindow *window_ptr)</td></tr>
+<tr class="memdesc:a2b7808e489933b117583cf709fa46bc7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call this from your app's <a class="el" href="classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7" title="Call this from your app&#39;s UpdateSimulation() method. This tells the camera to simulate walking based ...">UpdateSimulation()</a> method. This tells the camera to simulate walking based on the keyboard keys currently pressed. You need to pass a pointer to the underlying GLFW window created by <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>. Example: <a href="classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7">More...</a><br /></td></tr>
+<tr class="separator:a2b7808e489933b117583cf709fa46bc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8366e9d8e9bb3b048d1dd14af2f76311"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311">OnMouseMove</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;normalized_mouse_delta)</td></tr>
+<tr class="memdesc:a8366e9d8e9bb3b048d1dd14af2f76311"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call this from your app's <a class="el" href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311" title="Call this from your app&#39;s OnMouseMove() or On*MouseDrag() method. Use OnMouseMove() if you want to al...">OnMouseMove()</a> or On*MouseDrag() method. Use <a class="el" href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311" title="Call this from your app&#39;s OnMouseMove() or On*MouseDrag() method. Use OnMouseMove() if you want to al...">OnMouseMove()</a> if you want to always rotate the view with the mouse. Remember to convert the mouse coordinates (usually reported by window managers in pixels) into normalized device coordinates: <a href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311">More...</a><br /></td></tr>
+<tr class="separator:a8366e9d8e9bb3b048d1dd14af2f76311"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acccdadc08d8d8a0b7b9426f18209ff36"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36">view_matrix</a> ()</td></tr>
+<tr class="memdesc:acccdadc08d8d8a0b7b9426f18209ff36"><td class="mdescLeft">&#160;</td><td class="mdescRight">Access the camera view matrix created by the <a class="el" href="classmingfx_1_1_craft_cam.html" title="This implements a user interface for controlling the camera with the mouse.">CraftCam</a> interactions via this method and use it to draw the geometry in your scence. For example, within <a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca" title="Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.">GraphicsApp::DrawUsingOpenGL()</a>, you might have: <a href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36">More...</a><br /></td></tr>
+<tr class="separator:acccdadc08d8d8a0b7b9426f18209ff36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a82a8e20596247e2986e5929c1ef7f150"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a82a8e20596247e2986e5929c1ef7f150">eye</a> ()</td></tr>
+<tr class="memdesc:a82a8e20596247e2986e5929c1ef7f150"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the "eye" point (i.e., focal point) of the camera in world space coordinates. <a href="classmingfx_1_1_craft_cam.html#a82a8e20596247e2986e5929c1ef7f150">More...</a><br /></td></tr>
+<tr class="separator:a82a8e20596247e2986e5929c1ef7f150"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c7546bccfbf986eb9cd0a2784f74859"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a2c7546bccfbf986eb9cd0a2784f74859">look</a> ()</td></tr>
+<tr class="memdesc:a2c7546bccfbf986eb9cd0a2784f74859"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the look direction (i.e., -Z axis of the camera matrix) in world space coordinates. <a href="classmingfx_1_1_craft_cam.html#a2c7546bccfbf986eb9cd0a2784f74859">More...</a><br /></td></tr>
+<tr class="separator:a2c7546bccfbf986eb9cd0a2784f74859"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae3d9c7ea9307dbbadaa4b6e2f9933a7b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#ae3d9c7ea9307dbbadaa4b6e2f9933a7b">UpdateHeight</a> (float new_y_value)</td></tr>
+<tr class="memdesc:ae3d9c7ea9307dbbadaa4b6e2f9933a7b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the y value of the camera (i.e., the height). If you want to set the entire view matrix, then use <a class="el" href="classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8" title="This is not required, but you may use this if you wish to set an initial view matrix or reset the vie...">set_view_matrix()</a>, but if you just want to update the height, e.g., while walking around a bumpy terrain, then use this. <a href="classmingfx_1_1_craft_cam.html#ae3d9c7ea9307dbbadaa4b6e2f9933a7b">More...</a><br /></td></tr>
+<tr class="separator:ae3d9c7ea9307dbbadaa4b6e2f9933a7b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a79a194be8675a0a968f14fe3dcd79da8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8">set_view_matrix</a> (<a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="el" href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36">view_matrix</a>)</td></tr>
+<tr class="memdesc:a79a194be8675a0a968f14fe3dcd79da8"><td class="mdescLeft">&#160;</td><td class="mdescRight">This is not required, but you may use this if you wish to set an initial view matrix or reset the view matrix. <a href="classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8">More...</a><br /></td></tr>
+<tr class="separator:a79a194be8675a0a968f14fe3dcd79da8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a93567af7acbae2939d57cfd8a72bcef2"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a93567af7acbae2939d57cfd8a72bcef2">translation_scale</a> ()</td></tr>
+<tr class="memdesc:a93567af7acbae2939d57cfd8a72bcef2"><td class="mdescLeft">&#160;</td><td class="mdescRight">This is the scale factor used to speed up / slow down forward/backward translation when walking for the UP / DOWN keys. It defaults to 1.0, smaller values will make the camera walk slower, larger values will speed it up. <a href="classmingfx_1_1_craft_cam.html#a93567af7acbae2939d57cfd8a72bcef2">More...</a><br /></td></tr>
+<tr class="separator:a93567af7acbae2939d57cfd8a72bcef2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a151fde09d08001ee2a615f25ec1acea7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a151fde09d08001ee2a615f25ec1acea7">set_translation_scale</a> (float s)</td></tr>
+<tr class="memdesc:a151fde09d08001ee2a615f25ec1acea7"><td class="mdescLeft">&#160;</td><td class="mdescRight">This is the scale factor used to speed up / slow down forward/backward translation when walking for the UP / DOWN keys. It defaults to 1.0, smaller values will make the camera walk slower, larger values will speed it up. <a href="classmingfx_1_1_craft_cam.html#a151fde09d08001ee2a615f25ec1acea7">More...</a><br /></td></tr>
+<tr class="separator:a151fde09d08001ee2a615f25ec1acea7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9fe22cc3b933b12674a5b8f1b5c834ac"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a9fe22cc3b933b12674a5b8f1b5c834ac">rotation_scale</a> ()</td></tr>
+<tr class="memdesc:a9fe22cc3b933b12674a5b8f1b5c834ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">This is the scale factor used to speed up / slow down left/right rotation when walking for the LEFT / RIGHT keys. It defaults to 1.0, smaller values will make the camera turn slower, larger values will speed it up. <a href="classmingfx_1_1_craft_cam.html#a9fe22cc3b933b12674a5b8f1b5c834ac">More...</a><br /></td></tr>
+<tr class="separator:a9fe22cc3b933b12674a5b8f1b5c834ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a352f5a42f6e88d2e599bd5acb42e5831"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a352f5a42f6e88d2e599bd5acb42e5831">set_rotation_scale</a> (float s)</td></tr>
+<tr class="memdesc:a352f5a42f6e88d2e599bd5acb42e5831"><td class="mdescLeft">&#160;</td><td class="mdescRight">This is the scale factor used to speed up / slow down left/right rotation when walking for the LEFT / RIGHT keys. It defaults to 1.0, smaller values will make the camera turn slower, larger values will speed it up. <a href="classmingfx_1_1_craft_cam.html#a352f5a42f6e88d2e599bd5acb42e5831">More...</a><br /></td></tr>
+<tr class="separator:a352f5a42f6e88d2e599bd5acb42e5831"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96ba4a36029ca8234576cbf2791c5ccb"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a96ba4a36029ca8234576cbf2791c5ccb">look_scale</a> ()</td></tr>
+<tr class="memdesc:a96ba4a36029ca8234576cbf2791c5ccb"><td class="mdescLeft">&#160;</td><td class="mdescRight">This is the scale factor used to speed up / slow down looking around when moving the head with the mouse. It defaults to 1.0, smaller values will make the camera turn slower, larger values will speed it up. <a href="classmingfx_1_1_craft_cam.html#a96ba4a36029ca8234576cbf2791c5ccb">More...</a><br /></td></tr>
+<tr class="separator:a96ba4a36029ca8234576cbf2791c5ccb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15092ae5de6920546e3ce79aeb196f44"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html#a15092ae5de6920546e3ce79aeb196f44">set_look_scale</a> (float s)</td></tr>
+<tr class="memdesc:a15092ae5de6920546e3ce79aeb196f44"><td class="mdescLeft">&#160;</td><td class="mdescRight">This is the scale factor used to speed up / slow down looking around when moving the head with the mouse. It defaults to 1.0, smaller values will make the camera turn slower, larger values will speed it up. <a href="classmingfx_1_1_craft_cam.html#a15092ae5de6920546e3ce79aeb196f44">More...</a><br /></td></tr>
+<tr class="separator:a15092ae5de6920546e3ce79aeb196f44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="ae0b0e8d75ffc69c6373a13f1f9c2f171"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae0b0e8d75ffc69c6373a13f1f9c2f171">&#9670;&nbsp;</a></span>CraftCam() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::CraftCam::CraftCam </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a <a class="el" href="classmingfx_1_1_craft_cam.html" title="This implements a user interface for controlling the camera with the mouse.">CraftCam</a> object with an initial view matrix = identity. </p>
+
+</div>
+</div>
+<a id="ab9e1864b5859c22d27ba809b1ba7a51f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab9e1864b5859c22d27ba809b1ba7a51f">&#9670;&nbsp;</a></span>CraftCam() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::CraftCam::CraftCam </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>initial_view_matrix</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a <a class="el" href="classmingfx_1_1_craft_cam.html" title="This implements a user interface for controlling the camera with the mouse.">CraftCam</a> object with the supplied initial view matrix. </p>
+
+</div>
+</div>
+<a id="a85ef9bebdd1595be1288bc104245f4ff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a85ef9bebdd1595be1288bc104245f4ff">&#9670;&nbsp;</a></span>~CraftCam()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::CraftCam::~CraftCam </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a82a8e20596247e2986e5929c1ef7f150"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a82a8e20596247e2986e5929c1ef7f150">&#9670;&nbsp;</a></span>eye()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::CraftCam::eye </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the "eye" point (i.e., focal point) of the camera in world space coordinates. </p>
+
+</div>
+</div>
+<a id="a2c7546bccfbf986eb9cd0a2784f74859"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c7546bccfbf986eb9cd0a2784f74859">&#9670;&nbsp;</a></span>look()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::CraftCam::look </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the look direction (i.e., -Z axis of the camera matrix) in world space coordinates. </p>
+
+</div>
+</div>
+<a id="a96ba4a36029ca8234576cbf2791c5ccb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a96ba4a36029ca8234576cbf2791c5ccb">&#9670;&nbsp;</a></span>look_scale()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::CraftCam::look_scale </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This is the scale factor used to speed up / slow down looking around when moving the head with the mouse. It defaults to 1.0, smaller values will make the camera turn slower, larger values will speed it up. </p>
+
+</div>
+</div>
+<a id="a8366e9d8e9bb3b048d1dd14af2f76311"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8366e9d8e9bb3b048d1dd14af2f76311">&#9670;&nbsp;</a></span>OnMouseMove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::CraftCam::OnMouseMove </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>normalized_mouse_delta</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Call this from your app's <a class="el" href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311" title="Call this from your app&#39;s OnMouseMove() or On*MouseDrag() method. Use OnMouseMove() if you want to al...">OnMouseMove()</a> or On*MouseDrag() method. Use <a class="el" href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311" title="Call this from your app&#39;s OnMouseMove() or On*MouseDrag() method. Use OnMouseMove() if you want to al...">OnMouseMove()</a> if you want to always rotate the view with the mouse. Remember to convert the mouse coordinates (usually reported by window managers in pixels) into normalized device coordinates: </p>
+<div class="fragment"><div class="line"><span class="keywordtype">void</span> MyGraphicsApp::OnMouseMove(<span class="keyword">const</span> Point2 &amp;pos, <span class="keyword">const</span> Vector2 &amp;delta) {</div>
+<div class="line"> Vector2 delta_ndc = PixelsToNormalizedDeviceCoords(pos);</div>
+<div class="line"> cam_.OnMouseMove(delta_ndc);</div>
+<div class="line">}</div>
+</div><!-- fragment --><p> Alternatively, if you want to only rotate the view when the mouse button is held down, use On*MouseDrag() instead: </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> MyGraphicsApp::OnLeftMouseDrag(<span class="keyword">const</span> Point2 &amp;pos, <span class="keyword">const</span> Vector2 &amp;delta) {</div>
+<div class="line"> Vector2 delta_ndc = PixelsToNormalizedDeviceCoords(pos);</div>
+<div class="line"> cam_.OnMouseMove(delta_ndc);</div>
+<div class="line">}</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="a9fe22cc3b933b12674a5b8f1b5c834ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9fe22cc3b933b12674a5b8f1b5c834ac">&#9670;&nbsp;</a></span>rotation_scale()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::CraftCam::rotation_scale </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This is the scale factor used to speed up / slow down left/right rotation when walking for the LEFT / RIGHT keys. It defaults to 1.0, smaller values will make the camera turn slower, larger values will speed it up. </p>
+
+</div>
+</div>
+<a id="a15092ae5de6920546e3ce79aeb196f44"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a15092ae5de6920546e3ce79aeb196f44">&#9670;&nbsp;</a></span>set_look_scale()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::CraftCam::set_look_scale </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This is the scale factor used to speed up / slow down looking around when moving the head with the mouse. It defaults to 1.0, smaller values will make the camera turn slower, larger values will speed it up. </p>
+
+</div>
+</div>
+<a id="a352f5a42f6e88d2e599bd5acb42e5831"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a352f5a42f6e88d2e599bd5acb42e5831">&#9670;&nbsp;</a></span>set_rotation_scale()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::CraftCam::set_rotation_scale </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This is the scale factor used to speed up / slow down left/right rotation when walking for the LEFT / RIGHT keys. It defaults to 1.0, smaller values will make the camera turn slower, larger values will speed it up. </p>
+
+</div>
+</div>
+<a id="a151fde09d08001ee2a615f25ec1acea7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a151fde09d08001ee2a615f25ec1acea7">&#9670;&nbsp;</a></span>set_translation_scale()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::CraftCam::set_translation_scale </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This is the scale factor used to speed up / slow down forward/backward translation when walking for the UP / DOWN keys. It defaults to 1.0, smaller values will make the camera walk slower, larger values will speed it up. </p>
+
+</div>
+</div>
+<a id="a79a194be8675a0a968f14fe3dcd79da8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a79a194be8675a0a968f14fe3dcd79da8">&#9670;&nbsp;</a></span>set_view_matrix()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::CraftCam::set_view_matrix </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td>
+ <td class="paramname"><em>view_matrix</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This is not required, but you may use this if you wish to set an initial view matrix or reset the view matrix. </p>
+
+</div>
+</div>
+<a id="a93567af7acbae2939d57cfd8a72bcef2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a93567af7acbae2939d57cfd8a72bcef2">&#9670;&nbsp;</a></span>translation_scale()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::CraftCam::translation_scale </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This is the scale factor used to speed up / slow down forward/backward translation when walking for the UP / DOWN keys. It defaults to 1.0, smaller values will make the camera walk slower, larger values will speed it up. </p>
+
+</div>
+</div>
+<a id="ae3d9c7ea9307dbbadaa4b6e2f9933a7b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae3d9c7ea9307dbbadaa4b6e2f9933a7b">&#9670;&nbsp;</a></span>UpdateHeight()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::CraftCam::UpdateHeight </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>new_y_value</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the y value of the camera (i.e., the height). If you want to set the entire view matrix, then use <a class="el" href="classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8" title="This is not required, but you may use this if you wish to set an initial view matrix or reset the vie...">set_view_matrix()</a>, but if you just want to update the height, e.g., while walking around a bumpy terrain, then use this. </p>
+
+</div>
+</div>
+<a id="a2b7808e489933b117583cf709fa46bc7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b7808e489933b117583cf709fa46bc7">&#9670;&nbsp;</a></span>UpdateSimulation()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::CraftCam::UpdateSimulation </td>
+ <td>(</td>
+ <td class="paramtype">double&#160;</td>
+ <td class="paramname"><em>dt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">GLFWwindow *&#160;</td>
+ <td class="paramname"><em>window_ptr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Call this from your app's <a class="el" href="classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7" title="Call this from your app&#39;s UpdateSimulation() method. This tells the camera to simulate walking based ...">UpdateSimulation()</a> method. This tells the camera to simulate walking based on the keyboard keys currently pressed. You need to pass a pointer to the underlying GLFW window created by <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>. Example: </p>
+<div class="fragment"><div class="line"><span class="keywordtype">void</span> MyGraphicsApp::UpdateSimulation(<span class="keywordtype">double</span> dt) {</div>
+<div class="line"> cam_.UpdateSimulation(dt, window());</div>
+<div class="line">}</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="acccdadc08d8d8a0b7b9426f18209ff36"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acccdadc08d8d8a0b7b9426f18209ff36">&#9670;&nbsp;</a></span>view_matrix()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::CraftCam::view_matrix </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Access the camera view matrix created by the <a class="el" href="classmingfx_1_1_craft_cam.html" title="This implements a user interface for controlling the camera with the mouse.">CraftCam</a> interactions via this method and use it to draw the geometry in your scence. For example, within <a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca" title="Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.">GraphicsApp::DrawUsingOpenGL()</a>, you might have: </p>
+<div class="fragment"><div class="line">Matrix4 P = <a class="code" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">Matrix4::Perspective</a>(30, aspect_ratio(), 1, 20);</div>
+<div class="line">Matrix4 V = cam.view_matrix();</div>
+<div class="line">Matrix4 M = Matrix4::RotateY(<a class="code" href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">GfxMath::ToRadians</a>(45.0));</div>
+<div class="line">quick_shapes.DrawCube(M, V, P, Color(1,1,1));</div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a1336de2695bc3bb750b23fb0ea211637"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">mingfx::GfxMath::ToRadians</a></div><div class="ttdeci">static float ToRadians(float degrees)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0e34aee86758a0397074590b87712c5e"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">mingfx::Matrix4::Perspective</a></div><div class="ttdeci">static Matrix4 Perspective(float fov_y_in_degrees, float aspect_ratio, float near_plane_dist, float far_plane_dist)</div><div class="ttdoc">Returns a perspective projection matrix equivalent to the one gluPerspective creates.</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="craft__cam_8h_source.html">craft_cam.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_default_shader-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader-members.html
new file mode 100644
index 0000000..e68c9e0
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader-members.html
@@ -0,0 +1,105 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_default_shader.html">DefaultShader</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::DefaultShader Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html#af54a8e489d9fb34cfceb1c07562c6e2c">AddLight</a>(LightProperties light)</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428">DefaultShader</a>(bool add_default_light=true)</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b">Draw</a>(const Matrix4 &amp;model, const Matrix4 &amp;view, const Matrix4 &amp;projection, Mesh *mesh, const MaterialProperties &amp;material)</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3">Init</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316">light</a>(int i)</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24">MAX_LIGHTS</a></td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html#ac5b779672a983df8aa67c9cbe026e0c2">num_lights</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html#a41e74fb8af72a6b22c72b0916726b6d6">SetLight</a>(int i, LightProperties light)</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67">StopProgram</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0">UseProgram</a>(const Matrix4 &amp;model, const Matrix4 &amp;view, const Matrix4 &amp;projection, const MaterialProperties &amp;material)</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html#a0fe7d605d039ecdbf17837bc5bbe0aba">~DefaultShader</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_default_shader.html b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader.html
new file mode 100644
index 0000000..3787d3d
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader.html
@@ -0,0 +1,465 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::DefaultShader Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_default_shader.html">DefaultShader</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="classmingfx_1_1_default_shader-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::DefaultShader Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A simple GLSL shader for textured per-fragment Phong shading with multiple light sources. </p>
+<p>This can be used to draw 3D models stored in a <a class="el" href="classmingfx_1_1_mesh.html" title="A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.">mingfx::Mesh</a> data structure or you can use it with your own geometry data structures. Lighting properties are stored within the class itself since these are considered part of the shading model. Material properties are considered properties of the meshes or other materials you wish to draw so these are stored outside of the class and passed into the <a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b" title="This starts the shader and sets its uniform variables based upon the current set of lights,...">Draw()</a> or <a class="el" href="classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0" title="Only needed if you do not want to draw a Mesh. This does all of the same setup for drawing that the D...">UseProgram()</a> functions.</p>
+<p>An example of using <a class="el" href="classmingfx_1_1_default_shader.html" title="A simple GLSL shader for textured per-fragment Phong shading with multiple light sources.">DefaultShader</a> to render a mesh: </p><div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428">DefaultShader</a> phong_shader;</div>
+<div class="line">Mesh teapot;</div>
+<div class="line">DefaultShader::MaterialProperties teapot_material;</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3">Init</a>() {</div>
+<div class="line"> <span class="comment">// initialize the shader</span></div>
+<div class="line"> DefaultShader::LightProperties red_light;</div>
+<div class="line"> red_light.position = Point3(-10, 5, 5);</div>
+<div class="line"> red_light.diffuseIntensity = Color(1,0,0);</div>
+<div class="line"> phong_shader.AddLight(red_light);</div>
+<div class="line"> </div>
+<div class="line"> <span class="comment">// initialize the mesh</span></div>
+<div class="line"> teapot.LoadFromOBJ(<a class="code" href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b">Platform::FindMinGfxDataFile</a>(<span class="stringliteral">&quot;teapot.obj&quot;</span>));</div>
+<div class="line">}</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> DrawUsingOpenGL() {</div>
+<div class="line"> Matrix4 M;</div>
+<div class="line"> Matrix4 V = <a class="code" href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">Matrix4::LookAt</a>(Point3(0,0,3), Point3(0,0,0), Vector3(0,1,0));</div>
+<div class="line"> Matrix4 P = <a class="code" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">Matrix4::Perspective</a>(60.0, aspect_ratio(), 0.1, 10.0);</div>
+<div class="line"> phong_shader.Draw(M, V, P, teapot, teapot_material);</div>
+<div class="line">}</div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_a5cb9f0a1709452268858ec338448a4c3"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3">mingfx::DefaultShader::Init</a></div><div class="ttdeci">void Init()</div><div class="ttdoc">This loads vertex and fragment shaders from files, compiles them, and links them. So,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_ac030575fd76a6076262bdd09bbb93428"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428">mingfx::DefaultShader::DefaultShader</a></div><div class="ttdeci">DefaultShader(bool add_default_light=true)</div><div class="ttdoc">The constructor defaults to adding a single white light to the scene at (10,10,10)....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0e34aee86758a0397074590b87712c5e"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">mingfx::Matrix4::Perspective</a></div><div class="ttdeci">static Matrix4 Perspective(float fov_y_in_degrees, float aspect_ratio, float near_plane_dist, float far_plane_dist)</div><div class="ttdoc">Returns a perspective projection matrix equivalent to the one gluPerspective creates.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a4543695a6dfc996d0312b70c2eaa00de"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">mingfx::Matrix4::LookAt</a></div><div class="ttdeci">static Matrix4 LookAt(Point3 eye, Point3 target, Vector3 up)</div><div class="ttdoc">Returns a view matrix that centers the camera at the 'eye' position and orients it to look at the des...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_platform_html_a2c36ca57a246efa218a49a942c8c4a3b"><div class="ttname"><a href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b">mingfx::Platform::FindMinGfxDataFile</a></div><div class="ttdeci">static std::string FindMinGfxDataFile(const std::string &amp;basename)</div><div class="ttdoc">Searches for a data file that ships with MinGfx.</div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00062">62</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="default__shader_8h_source.html">default_shader.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Small data structure to hold per-light properties. <a href="classmingfx_1_1_default_shader_1_1_light_properties.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">MaterialProperties</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Small data structure to hold properties of the material to be lit. <a href="classmingfx_1_1_default_shader_1_1_material_properties.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ac030575fd76a6076262bdd09bbb93428"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428">DefaultShader</a> (bool add_default_light=true)</td></tr>
+<tr class="memdesc:ac030575fd76a6076262bdd09bbb93428"><td class="mdescLeft">&#160;</td><td class="mdescRight">The constructor defaults to adding a single white light to the scene at (10,10,10). Change this by passing it 'false'. The constructor does not load and compile the shader right away. This is done inside <a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3" title="This loads vertex and fragment shaders from files, compiles them, and links them. So,...">Init()</a>. <a href="classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428">More...</a><br /></td></tr>
+<tr class="separator:ac030575fd76a6076262bdd09bbb93428"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0fe7d605d039ecdbf17837bc5bbe0aba"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html#a0fe7d605d039ecdbf17837bc5bbe0aba">~DefaultShader</a> ()</td></tr>
+<tr class="separator:a0fe7d605d039ecdbf17837bc5bbe0aba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af54a8e489d9fb34cfceb1c07562c6e2c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html#af54a8e489d9fb34cfceb1c07562c6e2c">AddLight</a> (<a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a> <a class="el" href="classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316">light</a>)</td></tr>
+<tr class="memdesc:af54a8e489d9fb34cfceb1c07562c6e2c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiple lights are supported, this adds one to the end of the list. Up to MAX_LIGHTS can be added. <a href="classmingfx_1_1_default_shader.html#af54a8e489d9fb34cfceb1c07562c6e2c">More...</a><br /></td></tr>
+<tr class="separator:af54a8e489d9fb34cfceb1c07562c6e2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a41e74fb8af72a6b22c72b0916726b6d6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html#a41e74fb8af72a6b22c72b0916726b6d6">SetLight</a> (int i, <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a> <a class="el" href="classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316">light</a>)</td></tr>
+<tr class="memdesc:a41e74fb8af72a6b22c72b0916726b6d6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Changes the properties for a light that was already added. <a href="classmingfx_1_1_default_shader.html#a41e74fb8af72a6b22c72b0916726b6d6">More...</a><br /></td></tr>
+<tr class="separator:a41e74fb8af72a6b22c72b0916726b6d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5cb9f0a1709452268858ec338448a4c3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3">Init</a> ()</td></tr>
+<tr class="memdesc:a5cb9f0a1709452268858ec338448a4c3"><td class="mdescLeft">&#160;</td><td class="mdescRight">This loads vertex and fragment shaders from files, compiles them, and links them. So, it must be called from within an active OpenGL context, for example, from within GraphicsApp::Init() or <a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca" title="Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.">GraphicsApp::DrawUsingOpenGL()</a>. If you call <a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b" title="This starts the shader and sets its uniform variables based upon the current set of lights,...">Draw()</a> before calling <a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3" title="This loads vertex and fragment shaders from files, compiles them, and links them. So,...">Init()</a>, then <a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3" title="This loads vertex and fragment shaders from files, compiles them, and links them. So,...">Init()</a> will be called as the first step within <a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b" title="This starts the shader and sets its uniform variables based upon the current set of lights,...">Draw()</a>. So, if you do not mind a slowdown on the very first frame of your program, it is fine to skip calling <a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3" title="This loads vertex and fragment shaders from files, compiles them, and links them. So,...">Init()</a>. <a href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3">More...</a><br /></td></tr>
+<tr class="separator:a5cb9f0a1709452268858ec338448a4c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a652b3d00bb6ae2a806b1ca3e3d42242b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b">Draw</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;model, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;view, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projection, <a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> *mesh, const <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">MaterialProperties</a> &amp;material)</td></tr>
+<tr class="memdesc:a652b3d00bb6ae2a806b1ca3e3d42242b"><td class="mdescLeft">&#160;</td><td class="mdescRight">This starts the shader and sets its uniform variables based upon the current set of lights, the material properties passed in, and the model, view, and projection matrices. Then, it calls mesh-&gt;<a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b" title="This starts the shader and sets its uniform variables based upon the current set of lights,...">Draw()</a>. After drawing, it disables the shader. <a href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b">More...</a><br /></td></tr>
+<tr class="separator:a652b3d00bb6ae2a806b1ca3e3d42242b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a053599d8c7acd9920461aab8ce945ab0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0">UseProgram</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;model, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;view, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projection, const <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">MaterialProperties</a> &amp;material)</td></tr>
+<tr class="memdesc:a053599d8c7acd9920461aab8ce945ab0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Only needed if you do not want to draw a <a class="el" href="classmingfx_1_1_mesh.html" title="A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.">Mesh</a>. This does all of the same setup for drawing that the <a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b" title="This starts the shader and sets its uniform variables based upon the current set of lights,...">Draw()</a> function does and then it returns so that you may draw your own geometry however you want. After doing your draw must call <a class="el" href="classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67" title="Only needed if you do not want to draw a Mesh. Call this after UseProgram() and after drawing your ge...">StopProgram()</a> to turn off the shader. <a href="classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0">More...</a><br /></td></tr>
+<tr class="separator:a053599d8c7acd9920461aab8ce945ab0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c188bc0fc5f7fc7405f04b036bd4d67"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67">StopProgram</a> ()</td></tr>
+<tr class="memdesc:a2c188bc0fc5f7fc7405f04b036bd4d67"><td class="mdescLeft">&#160;</td><td class="mdescRight">Only needed if you do not want to draw a <a class="el" href="classmingfx_1_1_mesh.html" title="A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.">Mesh</a>. Call this after <a class="el" href="classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0" title="Only needed if you do not want to draw a Mesh. This does all of the same setup for drawing that the D...">UseProgram()</a> and after drawing your geometry to turn off the shader. <a href="classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67">More...</a><br /></td></tr>
+<tr class="separator:a2c188bc0fc5f7fc7405f04b036bd4d67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac5b779672a983df8aa67c9cbe026e0c2"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html#ac5b779672a983df8aa67c9cbe026e0c2">num_lights</a> ()</td></tr>
+<tr class="separator:ac5b779672a983df8aa67c9cbe026e0c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2ed33efad35aefbb400be45250cd316"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316">light</a> (int i)</td></tr>
+<tr class="separator:aa2ed33efad35aefbb400be45250cd316"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:a21c1fd93273eaf643e7ac9b05ba0fb24"><td class="memItemLeft" align="right" valign="top">static const unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24">MAX_LIGHTS</a> = 10</td></tr>
+<tr class="memdesc:a21c1fd93273eaf643e7ac9b05ba0fb24"><td class="mdescLeft">&#160;</td><td class="mdescRight">If changed, this needs to also be changed in the glsl shader code. <a href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24">More...</a><br /></td></tr>
+<tr class="separator:a21c1fd93273eaf643e7ac9b05ba0fb24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="ac030575fd76a6076262bdd09bbb93428"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac030575fd76a6076262bdd09bbb93428">&#9670;&nbsp;</a></span>DefaultShader()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::DefaultShader::DefaultShader </td>
+ <td>(</td>
+ <td class="paramtype">bool&#160;</td>
+ <td class="paramname"><em>add_default_light</em> = <code>true</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>The constructor defaults to adding a single white light to the scene at (10,10,10). Change this by passing it 'false'. The constructor does not load and compile the shader right away. This is done inside <a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3" title="This loads vertex and fragment shaders from files, compiles them, and links them. So,...">Init()</a>. </p>
+
+</div>
+</div>
+<a id="a0fe7d605d039ecdbf17837bc5bbe0aba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0fe7d605d039ecdbf17837bc5bbe0aba">&#9670;&nbsp;</a></span>~DefaultShader()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::DefaultShader::~DefaultShader </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="af54a8e489d9fb34cfceb1c07562c6e2c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af54a8e489d9fb34cfceb1c07562c6e2c">&#9670;&nbsp;</a></span>AddLight()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::DefaultShader::AddLight </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a>&#160;</td>
+ <td class="paramname"><em>light</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiple lights are supported, this adds one to the end of the list. Up to MAX_LIGHTS can be added. </p>
+
+</div>
+</div>
+<a id="a652b3d00bb6ae2a806b1ca3e3d42242b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a652b3d00bb6ae2a806b1ca3e3d42242b">&#9670;&nbsp;</a></span>Draw()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::DefaultShader::Draw </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>model</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>view</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projection</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> *&#160;</td>
+ <td class="paramname"><em>mesh</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">MaterialProperties</a> &amp;&#160;</td>
+ <td class="paramname"><em>material</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This starts the shader and sets its uniform variables based upon the current set of lights, the material properties passed in, and the model, view, and projection matrices. Then, it calls mesh-&gt;<a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b" title="This starts the shader and sets its uniform variables based upon the current set of lights,...">Draw()</a>. After drawing, it disables the shader. </p>
+
+</div>
+</div>
+<a id="a5cb9f0a1709452268858ec338448a4c3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5cb9f0a1709452268858ec338448a4c3">&#9670;&nbsp;</a></span>Init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::DefaultShader::Init </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This loads vertex and fragment shaders from files, compiles them, and links them. So, it must be called from within an active OpenGL context, for example, from within GraphicsApp::Init() or <a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca" title="Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.">GraphicsApp::DrawUsingOpenGL()</a>. If you call <a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b" title="This starts the shader and sets its uniform variables based upon the current set of lights,...">Draw()</a> before calling <a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3" title="This loads vertex and fragment shaders from files, compiles them, and links them. So,...">Init()</a>, then <a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3" title="This loads vertex and fragment shaders from files, compiles them, and links them. So,...">Init()</a> will be called as the first step within <a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b" title="This starts the shader and sets its uniform variables based upon the current set of lights,...">Draw()</a>. So, if you do not mind a slowdown on the very first frame of your program, it is fine to skip calling <a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3" title="This loads vertex and fragment shaders from files, compiles them, and links them. So,...">Init()</a>. </p>
+
+</div>
+</div>
+<a id="aa2ed33efad35aefbb400be45250cd316"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa2ed33efad35aefbb400be45250cd316">&#9670;&nbsp;</a></span>light()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a> mingfx::DefaultShader::light </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac5b779672a983df8aa67c9cbe026e0c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac5b779672a983df8aa67c9cbe026e0c2">&#9670;&nbsp;</a></span>num_lights()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int mingfx::DefaultShader::num_lights </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a41e74fb8af72a6b22c72b0916726b6d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a41e74fb8af72a6b22c72b0916726b6d6">&#9670;&nbsp;</a></span>SetLight()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::DefaultShader::SetLight </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>i</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a>&#160;</td>
+ <td class="paramname"><em>light</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Changes the properties for a light that was already added. </p>
+
+</div>
+</div>
+<a id="a2c188bc0fc5f7fc7405f04b036bd4d67"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c188bc0fc5f7fc7405f04b036bd4d67">&#9670;&nbsp;</a></span>StopProgram()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::DefaultShader::StopProgram </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Only needed if you do not want to draw a <a class="el" href="classmingfx_1_1_mesh.html" title="A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.">Mesh</a>. Call this after <a class="el" href="classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0" title="Only needed if you do not want to draw a Mesh. This does all of the same setup for drawing that the D...">UseProgram()</a> and after drawing your geometry to turn off the shader. </p>
+
+</div>
+</div>
+<a id="a053599d8c7acd9920461aab8ce945ab0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a053599d8c7acd9920461aab8ce945ab0">&#9670;&nbsp;</a></span>UseProgram()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::DefaultShader::UseProgram </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>model</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>view</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projection</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">MaterialProperties</a> &amp;&#160;</td>
+ <td class="paramname"><em>material</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Only needed if you do not want to draw a <a class="el" href="classmingfx_1_1_mesh.html" title="A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.">Mesh</a>. This does all of the same setup for drawing that the <a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b" title="This starts the shader and sets its uniform variables based upon the current set of lights,...">Draw()</a> function does and then it returns so that you may draw your own geometry however you want. After doing your draw must call <a class="el" href="classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67" title="Only needed if you do not want to draw a Mesh. Call this after UseProgram() and after drawing your ge...">StopProgram()</a> to turn off the shader. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a id="a21c1fd93273eaf643e7ac9b05ba0fb24"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a21c1fd93273eaf643e7ac9b05ba0fb24">&#9670;&nbsp;</a></span>MAX_LIGHTS</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const unsigned int mingfx::DefaultShader::MAX_LIGHTS = 10</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>If changed, this needs to also be changed in the glsl shader code. </p>
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00066">66</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="default__shader_8h_source.html">default_shader.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_light_properties-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_light_properties-members.html
new file mode 100644
index 0000000..5eb35e8
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_light_properties-members.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_default_shader.html">DefaultShader</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::DefaultShader::LightProperties Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">mingfx::DefaultShader::LightProperties</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a226c173b193459af291687dd45280fbb">ambient_intensity</a></td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">mingfx::DefaultShader::LightProperties</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a9a010057c15e3db5661b07a03d5176d7">diffuse_intensity</a></td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">mingfx::DefaultShader::LightProperties</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a582ceee332260b06cbf2ec607257aba3">LightProperties</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">mingfx::DefaultShader::LightProperties</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a160b58a0e70294008b9dac8eb6291d3e">position</a></td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">mingfx::DefaultShader::LightProperties</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#abef7666629dbb9da661b163e0584c9a4">specular_intensity</a></td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">mingfx::DefaultShader::LightProperties</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_light_properties.html b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_light_properties.html
new file mode 100644
index 0000000..b2a402d
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_light_properties.html
@@ -0,0 +1,214 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::DefaultShader::LightProperties Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_default_shader.html">DefaultShader</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="classmingfx_1_1_default_shader_1_1_light_properties-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::DefaultShader::LightProperties Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Small data structure to hold per-light properties. </p>
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00088">88</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="default__shader_8h_source.html">default_shader.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a582ceee332260b06cbf2ec607257aba3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a582ceee332260b06cbf2ec607257aba3">LightProperties</a> ()</td></tr>
+<tr class="separator:a582ceee332260b06cbf2ec607257aba3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a160b58a0e70294008b9dac8eb6291d3e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a160b58a0e70294008b9dac8eb6291d3e">position</a></td></tr>
+<tr class="separator:a160b58a0e70294008b9dac8eb6291d3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a226c173b193459af291687dd45280fbb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a226c173b193459af291687dd45280fbb">ambient_intensity</a></td></tr>
+<tr class="separator:a226c173b193459af291687dd45280fbb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a010057c15e3db5661b07a03d5176d7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a9a010057c15e3db5661b07a03d5176d7">diffuse_intensity</a></td></tr>
+<tr class="separator:a9a010057c15e3db5661b07a03d5176d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abef7666629dbb9da661b163e0584c9a4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#abef7666629dbb9da661b163e0584c9a4">specular_intensity</a></td></tr>
+<tr class="separator:abef7666629dbb9da661b163e0584c9a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a582ceee332260b06cbf2ec607257aba3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a582ceee332260b06cbf2ec607257aba3">&#9670;&nbsp;</a></span>LightProperties()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::DefaultShader::LightProperties::LightProperties </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00096">96</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a id="a226c173b193459af291687dd45280fbb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a226c173b193459af291687dd45280fbb">&#9670;&nbsp;</a></span>ambient_intensity</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_color.html">Color</a> mingfx::DefaultShader::LightProperties::ambient_intensity</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00091">91</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<a id="a9a010057c15e3db5661b07a03d5176d7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a010057c15e3db5661b07a03d5176d7">&#9670;&nbsp;</a></span>diffuse_intensity</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_color.html">Color</a> mingfx::DefaultShader::LightProperties::diffuse_intensity</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00092">92</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<a id="a160b58a0e70294008b9dac8eb6291d3e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a160b58a0e70294008b9dac8eb6291d3e">&#9670;&nbsp;</a></span>position</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::DefaultShader::LightProperties::position</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00090">90</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<a id="abef7666629dbb9da661b163e0584c9a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abef7666629dbb9da661b163e0584c9a4">&#9670;&nbsp;</a></span>specular_intensity</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_color.html">Color</a> mingfx::DefaultShader::LightProperties::specular_intensity</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00093">93</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="default__shader_8h_source.html">default_shader.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_material_properties-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_material_properties-members.html
new file mode 100644
index 0000000..83ee843
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_material_properties-members.html
@@ -0,0 +1,100 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_default_shader.html">DefaultShader</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">MaterialProperties</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::DefaultShader::MaterialProperties Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">mingfx::DefaultShader::MaterialProperties</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad4db9a1b0636db84f57f022c51ce7657">ambient_reflectance</a></td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">mingfx::DefaultShader::MaterialProperties</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa7b75f95a45d7a1030c297192b14014f">diffuse_reflectance</a></td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">mingfx::DefaultShader::MaterialProperties</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa24361a9c6eb0a87355d0ad00e47dd96">MaterialProperties</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">mingfx::DefaultShader::MaterialProperties</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad77e4c78a2bf60776c673b91bc4c8a13">shinniness</a></td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">mingfx::DefaultShader::MaterialProperties</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#acfd78796e08f527a24cce3c1e206148c">specular_reflectance</a></td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">mingfx::DefaultShader::MaterialProperties</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ae26eed46a279c73e947880858763514e">surface_texture</a></td><td class="entry"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">mingfx::DefaultShader::MaterialProperties</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_material_properties.html b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_material_properties.html
new file mode 100644
index 0000000..27400b1
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_default_shader_1_1_material_properties.html
@@ -0,0 +1,232 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::DefaultShader::MaterialProperties Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_default_shader.html">DefaultShader</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">MaterialProperties</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="classmingfx_1_1_default_shader_1_1_material_properties-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::DefaultShader::MaterialProperties Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Small data structure to hold properties of the material to be lit. </p>
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00070">70</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="default__shader_8h_source.html">default_shader.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:aa24361a9c6eb0a87355d0ad00e47dd96"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa24361a9c6eb0a87355d0ad00e47dd96">MaterialProperties</a> ()</td></tr>
+<tr class="separator:aa24361a9c6eb0a87355d0ad00e47dd96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:ad4db9a1b0636db84f57f022c51ce7657"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad4db9a1b0636db84f57f022c51ce7657">ambient_reflectance</a></td></tr>
+<tr class="separator:ad4db9a1b0636db84f57f022c51ce7657"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7b75f95a45d7a1030c297192b14014f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa7b75f95a45d7a1030c297192b14014f">diffuse_reflectance</a></td></tr>
+<tr class="separator:aa7b75f95a45d7a1030c297192b14014f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acfd78796e08f527a24cce3c1e206148c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#acfd78796e08f527a24cce3c1e206148c">specular_reflectance</a></td></tr>
+<tr class="separator:acfd78796e08f527a24cce3c1e206148c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad77e4c78a2bf60776c673b91bc4c8a13"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad77e4c78a2bf60776c673b91bc4c8a13">shinniness</a></td></tr>
+<tr class="separator:ad77e4c78a2bf60776c673b91bc4c8a13"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae26eed46a279c73e947880858763514e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ae26eed46a279c73e947880858763514e">surface_texture</a></td></tr>
+<tr class="separator:ae26eed46a279c73e947880858763514e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="aa24361a9c6eb0a87355d0ad00e47dd96"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa24361a9c6eb0a87355d0ad00e47dd96">&#9670;&nbsp;</a></span>MaterialProperties()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::DefaultShader::MaterialProperties::MaterialProperties </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00080">80</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a id="ad4db9a1b0636db84f57f022c51ce7657"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad4db9a1b0636db84f57f022c51ce7657">&#9670;&nbsp;</a></span>ambient_reflectance</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_color.html">Color</a> mingfx::DefaultShader::MaterialProperties::ambient_reflectance</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00072">72</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<a id="aa7b75f95a45d7a1030c297192b14014f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa7b75f95a45d7a1030c297192b14014f">&#9670;&nbsp;</a></span>diffuse_reflectance</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_color.html">Color</a> mingfx::DefaultShader::MaterialProperties::diffuse_reflectance</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00073">73</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<a id="ad77e4c78a2bf60776c673b91bc4c8a13"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad77e4c78a2bf60776c673b91bc4c8a13">&#9670;&nbsp;</a></span>shinniness</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::DefaultShader::MaterialProperties::shinniness</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00075">75</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<a id="acfd78796e08f527a24cce3c1e206148c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acfd78796e08f527a24cce3c1e206148c">&#9670;&nbsp;</a></span>specular_reflectance</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_color.html">Color</a> mingfx::DefaultShader::MaterialProperties::specular_reflectance</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00074">74</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<a id="ae26eed46a279c73e947880858763514e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae26eed46a279c73e947880858763514e">&#9670;&nbsp;</a></span>surface_texture</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a> mingfx::DefaultShader::MaterialProperties::surface_texture</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="default__shader_8h_source.html#l00076">76</a> of file <a class="el" href="default__shader_8h_source.html">default_shader.h</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="default__shader_8h_source.html">default_shader.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_gfx_math-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_gfx_math-members.html
new file mode 100644
index 0000000..f0ee0f2
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_gfx_math-members.html
@@ -0,0 +1,107 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_gfx_math.html">GfxMath</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::GfxMath Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#af227209ec043b375497556ee2dcdf850">Clamp</a>(float x, float a, float b)</td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#ab5ba8ba54257d86dcf95bd2bbeb534c0">HALF_PI</a></td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#af255bde64498e9b55be466abeea97f4d">iLerp</a>(int a, int b, float alpha)</td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#ace452fb6b86eb638897b474e9dd51647">Lerp</a>(float a, float b, float alpha)</td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#aaa14e60a5f7c158db443f8b6d87958b4">PI</a></td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#aaa6af7c0de01fdad46d48d43efb6aa67">ScreenToDepthPlane</a>(const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projMatrix, const Point2 &amp;normalizedScreenPt, float planeDepth)</td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0">ScreenToNearPlane</a>(const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projMatrix, const Point2 &amp;normalizedScreenPt)</td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#a24048d7b688ae46317c3e8de8a701273">ScreenToWorld</a>(const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projMatrix, const Point2 &amp;normalizedScreenPt, float normalizedZ)</td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3">ToDegrees</a>(float radians)</td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#aa5411a7d8bfc8e47d596362a328dbde8">ToDegrees</a>(Vector3 radians)</td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">ToRadians</a>(float degrees)</td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#a38927f1f8ea4625d909e64efa93c5190">ToRadians</a>(Vector3 degrees)</td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html#a0e5c7562116babf11c61f4c7f20f8b69">TWO_PI</a></td><td class="entry"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_gfx_math.html b/dev/MinGfx/docs/html/classmingfx_1_1_gfx_math.html
new file mode 100644
index 0000000..938c08c
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_gfx_math.html
@@ -0,0 +1,591 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::GfxMath Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_gfx_math.html">GfxMath</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="classmingfx_1_1_gfx_math-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::GfxMath Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This class holds a variety of static math functions that are useful to have defined with creating graphics programs. </p>
+
+<p class="definition">Definition at line <a class="el" href="gfxmath_8h_source.html#l00028">28</a> of file <a class="el" href="gfxmath_8h_source.html">gfxmath.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="gfxmath_8h_source.html">gfxmath.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:af227209ec043b375497556ee2dcdf850"><td class="memItemLeft" align="right" valign="top">static float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#af227209ec043b375497556ee2dcdf850">Clamp</a> (float x, float a, float b)</td></tr>
+<tr class="memdesc:af227209ec043b375497556ee2dcdf850"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a if x is less than a and b if x is greater than b. <a href="classmingfx_1_1_gfx_math.html#af227209ec043b375497556ee2dcdf850">More...</a><br /></td></tr>
+<tr class="separator:af227209ec043b375497556ee2dcdf850"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1336de2695bc3bb750b23fb0ea211637"><td class="memItemLeft" align="right" valign="top">static float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">ToRadians</a> (float degrees)</td></tr>
+<tr class="separator:a1336de2695bc3bb750b23fb0ea211637"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a39a2b5973249fb3aefc210b18b0fdff3"><td class="memItemLeft" align="right" valign="top">static float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3">ToDegrees</a> (float radians)</td></tr>
+<tr class="separator:a39a2b5973249fb3aefc210b18b0fdff3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38927f1f8ea4625d909e64efa93c5190"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#a38927f1f8ea4625d909e64efa93c5190">ToRadians</a> (<a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> degrees)</td></tr>
+<tr class="separator:a38927f1f8ea4625d909e64efa93c5190"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5411a7d8bfc8e47d596362a328dbde8"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#aa5411a7d8bfc8e47d596362a328dbde8">ToDegrees</a> (<a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> radians)</td></tr>
+<tr class="separator:aa5411a7d8bfc8e47d596362a328dbde8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace452fb6b86eb638897b474e9dd51647"><td class="memItemLeft" align="right" valign="top">static float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#ace452fb6b86eb638897b474e9dd51647">Lerp</a> (float a, float b, float alpha)</td></tr>
+<tr class="separator:ace452fb6b86eb638897b474e9dd51647"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af255bde64498e9b55be466abeea97f4d"><td class="memItemLeft" align="right" valign="top">static int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#af255bde64498e9b55be466abeea97f4d">iLerp</a> (int a, int b, float alpha)</td></tr>
+<tr class="separator:af255bde64498e9b55be466abeea97f4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2086a2f885f887fb53da8a5adb5860f0"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0">ScreenToNearPlane</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projMatrix, const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedScreenPt)</td></tr>
+<tr class="memdesc:a2086a2f885f887fb53da8a5adb5860f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 2D point on the filmplane represented in Normalized Device Coorindates, which means (-1,1) for the top left corner of the screen and (1,-1) for the bottom right corner, to a 3D point that lies on the camera's near plane. Useful for converting mouse coordinates into a 3D point. Remember that this uses NORMALIZED device coordinates for the screenPt, not pixels. <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a> and most other graphics engines report mouse move events in pixels, so you need to convert these to normalized device coordinates first. If you are using <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, you can do this with: <a class="el" href="classmingfx_1_1_point2.html" title="A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...">Point2</a> normPos = graphicsApp-&gt;pixels_to_normalized_coordinates(mousePos);. <a href="classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0">More...</a><br /></td></tr>
+<tr class="separator:a2086a2f885f887fb53da8a5adb5860f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaa6af7c0de01fdad46d48d43efb6aa67"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#aaa6af7c0de01fdad46d48d43efb6aa67">ScreenToDepthPlane</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projMatrix, const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedScreenPt, float planeDepth)</td></tr>
+<tr class="memdesc:aaa6af7c0de01fdad46d48d43efb6aa67"><td class="mdescLeft">&#160;</td><td class="mdescRight">Similar to filmplane2D_to_nearplane3D() but here rather than using the nearplane, you specify the depth of the plane to use as a distance away from the camera's focal point. <a href="classmingfx_1_1_gfx_math.html#aaa6af7c0de01fdad46d48d43efb6aa67">More...</a><br /></td></tr>
+<tr class="separator:aaa6af7c0de01fdad46d48d43efb6aa67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24048d7b688ae46317c3e8de8a701273"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#a24048d7b688ae46317c3e8de8a701273">ScreenToWorld</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projMatrix, const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedScreenPt, float normalizedZ)</td></tr>
+<tr class="memdesc:a24048d7b688ae46317c3e8de8a701273"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a 2D point on the filmplane represented in Normalized Device Coorindates, which means (-1,1) for the top left corner of the screen and (1,-1) for the bottom right corner, to a 3D point in the world. The depth buffer value under the pixel must be supplied. If you are using <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, you can use the mouse pos in pixels to get the required arguments like this: <a class="el" href="classmingfx_1_1_point2.html" title="A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...">Point2</a> normPos = graphicsApp-&gt;pixels_to_normalized_coordinates(mousePos); float normZ = graphicsApp-&gt;z_value_at_pixel(mousePos);. <a href="classmingfx_1_1_gfx_math.html#a24048d7b688ae46317c3e8de8a701273">More...</a><br /></td></tr>
+<tr class="separator:a24048d7b688ae46317c3e8de8a701273"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:aaa14e60a5f7c158db443f8b6d87958b4"><td class="memItemLeft" align="right" valign="top">static const float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#aaa14e60a5f7c158db443f8b6d87958b4">PI</a></td></tr>
+<tr class="separator:aaa14e60a5f7c158db443f8b6d87958b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e5c7562116babf11c61f4c7f20f8b69"><td class="memItemLeft" align="right" valign="top">static const float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#a0e5c7562116babf11c61f4c7f20f8b69">TWO_PI</a></td></tr>
+<tr class="separator:a0e5c7562116babf11c61f4c7f20f8b69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5ba8ba54257d86dcf95bd2bbeb534c0"><td class="memItemLeft" align="right" valign="top">static const float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html#ab5ba8ba54257d86dcf95bd2bbeb534c0">HALF_PI</a></td></tr>
+<tr class="separator:ab5ba8ba54257d86dcf95bd2bbeb534c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="af227209ec043b375497556ee2dcdf850"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af227209ec043b375497556ee2dcdf850">&#9670;&nbsp;</a></span>Clamp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static float mingfx::GfxMath::Clamp </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns a if x is less than a and b if x is greater than b. </p>
+
+</div>
+</div>
+<a id="af255bde64498e9b55be466abeea97f4d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af255bde64498e9b55be466abeea97f4d">&#9670;&nbsp;</a></span>iLerp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static int mingfx::GfxMath::iLerp </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ace452fb6b86eb638897b474e9dd51647"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ace452fb6b86eb638897b474e9dd51647">&#9670;&nbsp;</a></span>Lerp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static float mingfx::GfxMath::Lerp </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aaa6af7c0de01fdad46d48d43efb6aa67"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaa6af7c0de01fdad46d48d43efb6aa67">&#9670;&nbsp;</a></span>ScreenToDepthPlane()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::GfxMath::ScreenToDepthPlane </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>normalizedScreenPt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>planeDepth</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Similar to filmplane2D_to_nearplane3D() but here rather than using the nearplane, you specify the depth of the plane to use as a distance away from the camera's focal point. </p>
+
+</div>
+</div>
+<a id="a2086a2f885f887fb53da8a5adb5860f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2086a2f885f887fb53da8a5adb5860f0">&#9670;&nbsp;</a></span>ScreenToNearPlane()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::GfxMath::ScreenToNearPlane </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>normalizedScreenPt</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Converts a 2D point on the filmplane represented in Normalized Device Coorindates, which means (-1,1) for the top left corner of the screen and (1,-1) for the bottom right corner, to a 3D point that lies on the camera's near plane. Useful for converting mouse coordinates into a 3D point. Remember that this uses NORMALIZED device coordinates for the screenPt, not pixels. <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a> and most other graphics engines report mouse move events in pixels, so you need to convert these to normalized device coordinates first. If you are using <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, you can do this with: <a class="el" href="classmingfx_1_1_point2.html" title="A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...">Point2</a> normPos = graphicsApp-&gt;pixels_to_normalized_coordinates(mousePos);. </p>
+
+</div>
+</div>
+<a id="a24048d7b688ae46317c3e8de8a701273"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a24048d7b688ae46317c3e8de8a701273">&#9670;&nbsp;</a></span>ScreenToWorld()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::GfxMath::ScreenToWorld </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>normalizedScreenPt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>normalizedZ</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Converts a 2D point on the filmplane represented in Normalized Device Coorindates, which means (-1,1) for the top left corner of the screen and (1,-1) for the bottom right corner, to a 3D point in the world. The depth buffer value under the pixel must be supplied. If you are using <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, you can use the mouse pos in pixels to get the required arguments like this: <a class="el" href="classmingfx_1_1_point2.html" title="A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...">Point2</a> normPos = graphicsApp-&gt;pixels_to_normalized_coordinates(mousePos); float normZ = graphicsApp-&gt;z_value_at_pixel(mousePos);. </p>
+
+</div>
+</div>
+<a id="a39a2b5973249fb3aefc210b18b0fdff3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a39a2b5973249fb3aefc210b18b0fdff3">&#9670;&nbsp;</a></span>ToDegrees() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static float mingfx::GfxMath::ToDegrees </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>radians</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aa5411a7d8bfc8e47d596362a328dbde8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa5411a7d8bfc8e47d596362a328dbde8">&#9670;&nbsp;</a></span>ToDegrees() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::GfxMath::ToDegrees </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td>
+ <td class="paramname"><em>radians</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a1336de2695bc3bb750b23fb0ea211637"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1336de2695bc3bb750b23fb0ea211637">&#9670;&nbsp;</a></span>ToRadians() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static float mingfx::GfxMath::ToRadians </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>degrees</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a38927f1f8ea4625d909e64efa93c5190"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a38927f1f8ea4625d909e64efa93c5190">&#9670;&nbsp;</a></span>ToRadians() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::GfxMath::ToRadians </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td>
+ <td class="paramname"><em>degrees</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a id="ab5ba8ba54257d86dcf95bd2bbeb534c0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5ba8ba54257d86dcf95bd2bbeb534c0">&#9670;&nbsp;</a></span>HALF_PI</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const float mingfx::GfxMath::HALF_PI</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="gfxmath_8h_source.html#l00074">74</a> of file <a class="el" href="gfxmath_8h_source.html">gfxmath.h</a>.</p>
+
+</div>
+</div>
+<a id="aaa14e60a5f7c158db443f8b6d87958b4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaa14e60a5f7c158db443f8b6d87958b4">&#9670;&nbsp;</a></span>PI</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const float mingfx::GfxMath::PI</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="gfxmath_8h_source.html#l00072">72</a> of file <a class="el" href="gfxmath_8h_source.html">gfxmath.h</a>.</p>
+
+</div>
+</div>
+<a id="a0e5c7562116babf11c61f4c7f20f8b69"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0e5c7562116babf11c61f4c7f20f8b69">&#9670;&nbsp;</a></span>TWO_PI</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const float mingfx::GfxMath::TWO_PI</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="gfxmath_8h_source.html#l00073">73</a> of file <a class="el" href="gfxmath_8h_source.html">gfxmath.h</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="gfxmath_8h_source.html">gfxmath.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_graphics_app-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_graphics_app-members.html
new file mode 100644
index 0000000..d8ef647
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_graphics_app-members.html
@@ -0,0 +1,137 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_graphics_app.html">GraphicsApp</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::GraphicsApp Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23">aspect_ratio</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0">DrawUsingNanoVG</a>(NVGcontext *ctx)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca">DrawUsingOpenGL</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#af58153eb104f53216a3e67de2a472f32">framebuffer_height</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#ad596e69d030e7689ad91eaaec6975696">framebuffer_width</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b">GraphicsApp</a>(int width, int height, const std::string &amp;caption)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a04beb462aa04371dc86d807838f999e1">InitGraphicsContext</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a">InitNanoGUI</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3">InitOpenGL</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a60688614e5dfeaabf57f8825cdaa08ac">IsKeyDown</a>(int key)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a5b78d79192180a6ef5271d2a2b2d1cc7">IsLeftMouseDown</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a941f7598400073bfa93aa194a3773434">IsMiddleMouseDown</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a4aa30e3d33731178a9162454a81be08d">IsRightMouseDown</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a6141ec6adc29572ee99ca26cf90e6248">NormalizedDeviceCoordsToPixels</a>(const Point2 &amp;pointInNDC)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a45596da36aa3905e7c752826a7fd9f93">NormalizedDeviceCoordsToPixels</a>(const Vector2 &amp;pointInNDC)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a002560456139e537877d079978db4b01">OnKeyDown</a>(const char *c, int modifiers)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a1d5831953b37fae615fbd1bf527214b0">OnKeyRepeat</a>(const char *c, int modifiers)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a8376ef8eb0840b229a2301f995db3f6c">OnKeyUp</a>(const char *c, int modifiers)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#ae12d9b192a2167a71e0c103405addb17">OnLeftMouseDown</a>(const Point2 &amp;pos)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a56d350a8b030998709a51630753d509b">OnLeftMouseDrag</a>(const Point2 &amp;pos, const Vector2 &amp;delta)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a536dbadf0b8a11ef59d7e855ca43f613">OnLeftMouseUp</a>(const Point2 &amp;pos)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a588315d5c45490b440a764af2bc5bd48">OnMiddleMouseDown</a>(const Point2 &amp;pos)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#ac7628fece754c0ac4875791e19712dc6">OnMiddleMouseDrag</a>(const Point2 &amp;pos, const Vector2 &amp;delta)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a378b8a102775eeb01a6da9dd68482d08">OnMiddleMouseUp</a>(const Point2 &amp;pos)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f">OnMouseMove</a>(const Point2 &amp;pos, const Vector2 &amp;delta)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c">OnRightMouseDown</a>(const Point2 &amp;pos)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7">OnRightMouseDrag</a>(const Point2 &amp;pos, const Vector2 &amp;delta)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3">OnRightMouseUp</a>(const Point2 &amp;pos)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#abcf1935e92550bcda311cac62f312952">OnSpecialKeyDown</a>(int key, int scancode, int modifiers)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a8362762489e287edfa59617a6602db22">OnSpecialKeyRepeat</a>(int key, int scancode, int modifiers)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a0deb6da45fc0d3980e44556a861c7a14">OnSpecialKeyUp</a>(int key, int scancode, int modifiers)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#adafdc4631db256fefce3c4ffdfd5086a">OnWindowResize</a>(int new_width, int new_height)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a94b19404e61411ef64c0ddde8ad6c07a">PixelsToNormalizedDeviceCoords</a>(const Point2 &amp;pointInPixels)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a4e8ac965474de9046448b8811bf25dd1">PixelsToNormalizedDeviceCoords</a>(const Vector2 &amp;vectorInPixels)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a471951dbf45ffa88027cb92707443646">ReadZValueAtPixel</a>(const Point2 &amp;pointInPixels, unsigned int whichBuffer=GL_BACK)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5">ResizeWindow</a>(int new_width, int new_height)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9">Run</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16">screen</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa">UpdateSimulation</a>(double dt)</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">window</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016">window_height</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0">window_width</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html#aab7925c6b844e6bef428feacf4aa9afb">~GraphicsApp</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_graphics_app.html b/dev/MinGfx/docs/html/classmingfx_1_1_graphics_app.html
new file mode 100644
index 0000000..15fe349
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_graphics_app.html
@@ -0,0 +1,1837 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::GraphicsApp Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_graphics_app.html">GraphicsApp</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_graphics_app-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::GraphicsApp Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This is the main application base class for the MinGfx Toolkit. </p>
+<p><br />
+</p>
+<p><em>Create a Subclass:</em></p>
+<p>To create your own graphics application, you should create a subclass of <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a> and then override some key functions:</p>
+<ol type="1">
+<li>User Input: To get input from the keyboard and mouse, override <a class="el" href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f" title="If the mouse has moved in the past frame and no mouse buttons are currently pressed,...">OnMouseMove()</a> and/or the other On...() functions.</li>
+<li>Drawing Graphics: To draw graphics override one or more of the Draw*() functions.<ul>
+<li><a class="el" href="classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0" title="Override this to draw graphics using the nanovg vector graphics library, which provides an easy way t...">DrawUsingNanoVG()</a> is the right place to make 2D drawing calls using the nanovg library.</li>
+<li><a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca" title="Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.">DrawUsingOpenGL()</a> is the right place to make 2D or 3D drawing calls using OpenGL. This includes drawing using the <a class="el" href="classmingfx_1_1_mesh.html" title="A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.">Mesh</a>, <a class="el" href="classmingfx_1_1_quick_shapes.html" title="This class provides a quick way to draw shapes for use in debugging or simple scenes.">QuickShapes</a>, <a class="el" href="classmingfx_1_1_default_shader.html" title="A simple GLSL shader for textured per-fragment Phong shading with multiple light sources.">DefaultShader</a>, <a class="el" href="classmingfx_1_1_shader_program.html" title="A wrapper around GLSL shader programs.">ShaderProgram</a>, and all other MinGfx classes since these are all based on OpenGL.</li>
+<li><a class="el" href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a" title="Called at the beginning of the Run() method.">InitNanoGUI()</a> is the right place to create nanogui windows to add a 2D user interface to your app.</li>
+<li><a class="el" href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3" title="Override this to initialize the OpenGL context with textures, vertex buffers, etc.">InitOpenGL()</a> is the right place to load textures, meshes, shaders, and other graphics objects that can only be created after the OpenGL context exists.</li>
+</ul>
+</li>
+<li>Physics, Animation, AI, etc.: Override the <a class="el" href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa" title="Called once per frame.">UpdateSimulation()</a> function to do other non-graphics calculations required by your program. This is called automatically once per frame.</li>
+</ol>
+<p>Keep in mind that internally the app uses a rendering loop that looks something like this: </p><div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a">InitNanoGUI</a>(); <span class="comment">// your hook for initializing NanoGUI widgets</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3">InitOpenGL</a>(); <span class="comment">// your hook for initializing OpenGL graphics</span></div>
+<div class="line"><span class="keywordflow">while</span> (!program_ready_to_close) {</div>
+<div class="line"> <span class="comment">// user input</span></div>
+<div class="line"> internal_get_input_events_from_operating_system();</div>
+<div class="line"> <a class="code" href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f">OnMouseMove</a>(); <span class="comment">// your hook for processing input</span></div>
+<div class="line"> On*(); <span class="comment">// all other event callbacks -- your hook for processing input</span></div>
+<div class="line"> </div>
+<div class="line"> <span class="comment">// phyics, etc.</span></div>
+<div class="line"> <a class="code" href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa">UpdateSimulation</a>(); <span class="comment">// your hook for physics, animation, AI, etc.</span></div>
+<div class="line"> </div>
+<div class="line"> <span class="comment">// draw graphics</span></div>
+<div class="line"> internal_render_gui_elements_using_nanogui();</div>
+<div class="line"> <a class="code" href="classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0">DrawUsingNanoVG</a>(); <span class="comment">// your hook for drawing 2D vector graphics</span></div>
+<div class="line"> <a class="code" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca">DrawUsingOpenGL</a>(); <span class="comment">// your hook for 2D/3D rendering with OpenGL</span></div>
+<div class="line">}</div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a23a780feda9b52eea7319a53b204ce8f"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f">mingfx::GraphicsApp::OnMouseMove</a></div><div class="ttdeci">virtual void OnMouseMove(const Point2 &amp;pos, const Vector2 &amp;delta)</div><div class="ttdoc">If the mouse has moved in the past frame and no mouse buttons are currently pressed,...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00165">graphics_app.h:165</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a5a858fd10651f7617491f37b49dbf8ca"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca">mingfx::GraphicsApp::DrawUsingOpenGL</a></div><div class="ttdeci">virtual void DrawUsingOpenGL()</div><div class="ttdoc">Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00317">graphics_app.h:317</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a688f12675da58210e8ec2ffcda4923d0"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0">mingfx::GraphicsApp::DrawUsingNanoVG</a></div><div class="ttdeci">virtual void DrawUsingNanoVG(NVGcontext *ctx)</div><div class="ttdoc">Override this to draw graphics using the nanovg vector graphics library, which provides an easy way t...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00311">graphics_app.h:311</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a96196b37f8b488b64072ec74b5d2b0b3"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3">mingfx::GraphicsApp::InitOpenGL</a></div><div class="ttdeci">virtual void InitOpenGL()</div><div class="ttdoc">Override this to initialize the OpenGL context with textures, vertex buffers, etc.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00297">graphics_app.h:297</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a9e2b4cd7eeabe1ace9d5e9220349fbaa"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa">mingfx::GraphicsApp::UpdateSimulation</a></div><div class="ttdeci">virtual void UpdateSimulation(double dt)</div><div class="ttdoc">Called once per frame.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00306">graphics_app.h:306</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_adfe77d841f43961b299ea6159477968a"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a">mingfx::GraphicsApp::InitNanoGUI</a></div><div class="ttdeci">virtual void InitNanoGUI()</div><div class="ttdoc">Called at the beginning of the Run() method.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00284">graphics_app.h:284</a></div></div>
+</div><!-- fragment --><p><em>A Complete Example with GUI Widgets</em></p>
+<p>If you wish to add some buttons, sliders, etc. in your application, you can do this inside <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a> by accessing the NanoGUI library. You will need to pass NanoGUI a nanogui::screen object, which you can get from the <a class="el" href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16" title="Access to the underlying NanoGUI Screen object.">screen()</a> function. NanoGui setup should be done in the constructor, like this: </p><div class="fragment"><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="mingfx_8h.html">mingfx.h</a>&gt;</span></div>
+<div class="line"><span class="keyword">using namespace </span><a class="code" href="namespacemingfx.html">mingfx</a>;</div>
+<div class="line"> </div>
+<div class="line"><span class="keyword">class </span>MyApp : <span class="keyword">public</span> GraphcisApp {</div>
+<div class="line"><span class="keyword">public</span>:</div>
+<div class="line"> MyApp() : <a class="code" href="classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b">GraphicsApp</a>(1024,768, <span class="stringliteral">&quot;My Amazing App&quot;</span>) {</div>
+<div class="line"> }</div>
+<div class="line"> </div>
+<div class="line"> <span class="keyword">virtual</span> ~MyApp() {}</div>
+<div class="line"> </div>
+<div class="line"> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a">InitNanoGUI</a>() {</div>
+<div class="line"> <span class="comment">// Setup the GUI window</span></div>
+<div class="line"> nanogui::Window *<a class="code" href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">window</a> = <span class="keyword">new</span> nanogui::Window(<a class="code" href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16">screen</a>(), <span class="stringliteral">&quot;My GUI Panel&quot;</span>);</div>
+<div class="line"> <a class="code" href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">window</a>-&gt;setPosition(Eigen::Vector2i(10, 10));</div>
+<div class="line"> <a class="code" href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">window</a>-&gt;setSize(Eigen::Vector2i(400,200));</div>
+<div class="line"> <a class="code" href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">window</a>-&gt;setLayout(<span class="keyword">new</span> nanogui::GroupLayout());</div>
+<div class="line"> </div>
+<div class="line"> nanogui::Button pause_btn = <span class="keyword">new</span> nanogui::Button(<a class="code" href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">window</a>, <span class="stringliteral">&quot;Pause&quot;</span>);</div>
+<div class="line"> pause_btn-&gt;setCallback(std::bind(&amp;MyApp::OnPauseBtnPressed, <span class="keyword">this</span>));</div>
+<div class="line"> pause_btn-&gt;setTooltip(<span class="stringliteral">&quot;Toggle playback.&quot;</span>);</div>
+<div class="line"> </div>
+<div class="line"> <a class="code" href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16">screen</a>()-&gt;performLayout();</div>
+<div class="line"> }</div>
+<div class="line"> </div>
+<div class="line"> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3">InitOpenGL</a>() {</div>
+<div class="line"> glClearColor(0.0, 0.0, 0.0, 1);</div>
+<div class="line"> }</div>
+<div class="line"> </div>
+<div class="line"> <span class="comment">// this callback is for the nanogui pause_btn defined above</span></div>
+<div class="line"> <span class="keywordtype">void</span> OnPauseBtnPressed() {</div>
+<div class="line"> std::cout &lt;&lt; <span class="stringliteral">&quot;Pause pressed.&quot;</span> &lt;&lt; std::endl; </div>
+<div class="line"> }</div>
+<div class="line"> </div>
+<div class="line"> <span class="comment">// this callback is built into the base GraphicsApp class</span></div>
+<div class="line"> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f">OnMouseMove</a>(<span class="keyword">const</span> Point2 &amp;pos, <span class="keyword">const</span> Vector2 &amp;delta) {</div>
+<div class="line"> std::cout &lt;&lt; <span class="stringliteral">&quot;Mouse moved to &quot;</span> &lt;&lt; pos &lt;&lt; std::endl;</div>
+<div class="line"> }</div>
+<div class="line"> </div>
+<div class="line"> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca">DrawUsingOpenGL</a>() {</div>
+<div class="line"> Matrix4 model = <a class="code" href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">Matrix4::Translation</a>(Vector3(-1,0,0)) * <a class="code" href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e">Matrix4::Scale</a>(Vector3(0.5, 0.5, 0.5));</div>
+<div class="line"> Matrix4 view = <a class="code" href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">Matrix4::LookAt</a>(Point3(0,0,3), Point3(0,0,0), Vector3(0,1,0));</div>
+<div class="line"> Matrix4 proj = <a class="code" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">Matrix4::Perspective</a>(60.0, <a class="code" href="classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23">aspect_ratio</a>(), 0.1, 10.0);</div>
+<div class="line"> quick_shapes_.DrawCube(model, view, proj, Color(1,1,1));</div>
+<div class="line"> }</div>
+<div class="line"> </div>
+<div class="line"><span class="keyword">private</span>:</div>
+<div class="line"> QuickShapes quick_shapes_;</div>
+<div class="line">};</div>
+<div class="line"> </div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keyword">const</span> <span class="keywordtype">char</span> *argv[]) {</div>
+<div class="line"> MyApp app;</div>
+<div class="line"> app.Run();</div>
+<div class="line"> <span class="keywordflow">return</span> 0;</div>
+<div class="line">}</div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_abd0ee14f7e12146000cdb3532d54ba94"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">mingfx::GraphicsApp::window</a></div><div class="ttdeci">virtual GLFWwindow * window()</div><div class="ttdoc">Access to the underlying GLFWwindow object.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_abf0b48c7d8e5325ab038fddbe1c38b5b"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b">mingfx::GraphicsApp::GraphicsApp</a></div><div class="ttdeci">GraphicsApp(int width, int height, const std::string &amp;caption)</div><div class="ttdoc">Constructs a new app but does not yet run it.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_ac682691ee96ea32037abafd74d144a23"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23">mingfx::GraphicsApp::aspect_ratio</a></div><div class="ttdeci">virtual float aspect_ratio()</div><div class="ttdoc">Returns width/height for the current shape of the window.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_adc68196c3f03bd0608c41f6e4d7dad16"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16">mingfx::GraphicsApp::screen</a></div><div class="ttdeci">virtual nanogui::Screen * screen()</div><div class="ttdoc">Access to the underlying NanoGUI Screen object.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0232a58d20b1da5374cf8c72fb113a4e"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e">mingfx::Matrix4::Scale</a></div><div class="ttdeci">static Matrix4 Scale(const Vector3 &amp;v)</div><div class="ttdoc">Returns the scale matrix described by the vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0e34aee86758a0397074590b87712c5e"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">mingfx::Matrix4::Perspective</a></div><div class="ttdeci">static Matrix4 Perspective(float fov_y_in_degrees, float aspect_ratio, float near_plane_dist, float far_plane_dist)</div><div class="ttdoc">Returns a perspective projection matrix equivalent to the one gluPerspective creates.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a4543695a6dfc996d0312b70c2eaa00de"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">mingfx::Matrix4::LookAt</a></div><div class="ttdeci">static Matrix4 LookAt(Point3 eye, Point3 target, Vector3 up)</div><div class="ttdoc">Returns a view matrix that centers the camera at the 'eye' position and orients it to look at the des...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_ae82bab81df82dc03f5eb11e74ba1dd84"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">mingfx::Matrix4::Translation</a></div><div class="ttdeci">static Matrix4 Translation(const Vector3 &amp;v)</div><div class="ttdoc">Returns the translation matrix described by the vector.</div></div>
+<div class="ttc" id="amingfx_8h_html"><div class="ttname"><a href="mingfx_8h.html">mingfx.h</a></div><div class="ttdoc">Includes the entire MinGfx library and calls using namespace mingfx.</div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00135">135</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:abf0b48c7d8e5325ab038fddbe1c38b5b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b">GraphicsApp</a> (int width, int height, const std::string &amp;caption)</td></tr>
+<tr class="memdesc:abf0b48c7d8e5325ab038fddbe1c38b5b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a new app but does not yet run it. <a href="classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b">More...</a><br /></td></tr>
+<tr class="separator:abf0b48c7d8e5325ab038fddbe1c38b5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab7925c6b844e6bef428feacf4aa9afb"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#aab7925c6b844e6bef428feacf4aa9afb">~GraphicsApp</a> ()</td></tr>
+<tr class="memdesc:aab7925c6b844e6bef428feacf4aa9afb"><td class="mdescLeft">&#160;</td><td class="mdescRight">The destructor will shutdown the graphics system and window. <a href="classmingfx_1_1_graphics_app.html#aab7925c6b844e6bef428feacf4aa9afb">More...</a><br /></td></tr>
+<tr class="separator:aab7925c6b844e6bef428feacf4aa9afb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a23a780feda9b52eea7319a53b204ce8f"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f">OnMouseMove</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;delta)</td></tr>
+<tr class="memdesc:a23a780feda9b52eea7319a53b204ce8f"><td class="mdescLeft">&#160;</td><td class="mdescRight">If the mouse has moved in the past frame and no mouse buttons are currently pressed, then this callback function will be called to report the new position of the mouse to you. <a href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f">More...</a><br /></td></tr>
+<tr class="separator:a23a780feda9b52eea7319a53b204ce8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae12d9b192a2167a71e0c103405addb17"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#ae12d9b192a2167a71e0c103405addb17">OnLeftMouseDown</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos)</td></tr>
+<tr class="memdesc:ae12d9b192a2167a71e0c103405addb17"><td class="mdescLeft">&#160;</td><td class="mdescRight">If the mouse button was pressed down since the last frame, then this function will be called to notify you. <a href="classmingfx_1_1_graphics_app.html#ae12d9b192a2167a71e0c103405addb17">More...</a><br /></td></tr>
+<tr class="separator:ae12d9b192a2167a71e0c103405addb17"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56d350a8b030998709a51630753d509b"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a56d350a8b030998709a51630753d509b">OnLeftMouseDrag</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;delta)</td></tr>
+<tr class="memdesc:a56d350a8b030998709a51630753d509b"><td class="mdescLeft">&#160;</td><td class="mdescRight">If the mouse button is held down and the mouse has moved in the past frame then this function will be called to tell you that a "dragging" operation is happening. <a href="classmingfx_1_1_graphics_app.html#a56d350a8b030998709a51630753d509b">More...</a><br /></td></tr>
+<tr class="separator:a56d350a8b030998709a51630753d509b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a536dbadf0b8a11ef59d7e855ca43f613"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a536dbadf0b8a11ef59d7e855ca43f613">OnLeftMouseUp</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos)</td></tr>
+<tr class="memdesc:a536dbadf0b8a11ef59d7e855ca43f613"><td class="mdescLeft">&#160;</td><td class="mdescRight">If the mouse button was released since the last frame, then this function will be called to notify you. <a href="classmingfx_1_1_graphics_app.html#a536dbadf0b8a11ef59d7e855ca43f613">More...</a><br /></td></tr>
+<tr class="separator:a536dbadf0b8a11ef59d7e855ca43f613"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a588315d5c45490b440a764af2bc5bd48"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a588315d5c45490b440a764af2bc5bd48">OnMiddleMouseDown</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos)</td></tr>
+<tr class="memdesc:a588315d5c45490b440a764af2bc5bd48"><td class="mdescLeft">&#160;</td><td class="mdescRight">If the mouse button was pressed down since the last frame, then this function will be called to notify you. <a href="classmingfx_1_1_graphics_app.html#a588315d5c45490b440a764af2bc5bd48">More...</a><br /></td></tr>
+<tr class="separator:a588315d5c45490b440a764af2bc5bd48"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac7628fece754c0ac4875791e19712dc6"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#ac7628fece754c0ac4875791e19712dc6">OnMiddleMouseDrag</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;delta)</td></tr>
+<tr class="memdesc:ac7628fece754c0ac4875791e19712dc6"><td class="mdescLeft">&#160;</td><td class="mdescRight">If the mouse button is held down and the mouse has moved in the past frame then this function will be called to tell you that a "dragging" operation is happening. <a href="classmingfx_1_1_graphics_app.html#ac7628fece754c0ac4875791e19712dc6">More...</a><br /></td></tr>
+<tr class="separator:ac7628fece754c0ac4875791e19712dc6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a378b8a102775eeb01a6da9dd68482d08"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a378b8a102775eeb01a6da9dd68482d08">OnMiddleMouseUp</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos)</td></tr>
+<tr class="memdesc:a378b8a102775eeb01a6da9dd68482d08"><td class="mdescLeft">&#160;</td><td class="mdescRight">If the mouse button was released since the last frame, then this function will be called to notify you. <a href="classmingfx_1_1_graphics_app.html#a378b8a102775eeb01a6da9dd68482d08">More...</a><br /></td></tr>
+<tr class="separator:a378b8a102775eeb01a6da9dd68482d08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a903f94b82cc10f32039ff3f2ba368a9c"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c">OnRightMouseDown</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos)</td></tr>
+<tr class="memdesc:a903f94b82cc10f32039ff3f2ba368a9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">If the mouse button was pressed down since the last frame, then this function will be called to notify you. <a href="classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c">More...</a><br /></td></tr>
+<tr class="separator:a903f94b82cc10f32039ff3f2ba368a9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a00ad5039af2f428a08fe45751a9731c7"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7">OnRightMouseDrag</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;delta)</td></tr>
+<tr class="memdesc:a00ad5039af2f428a08fe45751a9731c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">If the mouse button is held down and the mouse has moved in the past frame then this function will be called to tell you that a "dragging" operation is happening. <a href="classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7">More...</a><br /></td></tr>
+<tr class="separator:a00ad5039af2f428a08fe45751a9731c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad7c33791c44afc87ce789874f3002ca3"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3">OnRightMouseUp</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos)</td></tr>
+<tr class="memdesc:ad7c33791c44afc87ce789874f3002ca3"><td class="mdescLeft">&#160;</td><td class="mdescRight">If the mouse button was released since the last frame, then this function will be called to notify you. <a href="classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3">More...</a><br /></td></tr>
+<tr class="separator:ad7c33791c44afc87ce789874f3002ca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a002560456139e537877d079978db4b01"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a002560456139e537877d079978db4b01">OnKeyDown</a> (const char *c, int modifiers)</td></tr>
+<tr class="memdesc:a002560456139e537877d079978db4b01"><td class="mdescLeft">&#160;</td><td class="mdescRight">Transforms a keyboard down event into the actual character typed. <a href="classmingfx_1_1_graphics_app.html#a002560456139e537877d079978db4b01">More...</a><br /></td></tr>
+<tr class="separator:a002560456139e537877d079978db4b01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d5831953b37fae615fbd1bf527214b0"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a1d5831953b37fae615fbd1bf527214b0">OnKeyRepeat</a> (const char *c, int modifiers)</td></tr>
+<tr class="memdesc:a1d5831953b37fae615fbd1bf527214b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Transforms a keyboard repeat event into the actual character typed. <a href="classmingfx_1_1_graphics_app.html#a1d5831953b37fae615fbd1bf527214b0">More...</a><br /></td></tr>
+<tr class="separator:a1d5831953b37fae615fbd1bf527214b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8376ef8eb0840b229a2301f995db3f6c"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a8376ef8eb0840b229a2301f995db3f6c">OnKeyUp</a> (const char *c, int modifiers)</td></tr>
+<tr class="memdesc:a8376ef8eb0840b229a2301f995db3f6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Transforms a keyboard up event into the actual character typed. <a href="classmingfx_1_1_graphics_app.html#a8376ef8eb0840b229a2301f995db3f6c">More...</a><br /></td></tr>
+<tr class="separator:a8376ef8eb0840b229a2301f995db3f6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abcf1935e92550bcda311cac62f312952"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#abcf1935e92550bcda311cac62f312952">OnSpecialKeyDown</a> (int key, int scancode, int modifiers)</td></tr>
+<tr class="memdesc:abcf1935e92550bcda311cac62f312952"><td class="mdescLeft">&#160;</td><td class="mdescRight">The values for key, scancode, and modifiers are documented here: <a href="http://www.glfw.org/docs/latest/group__keys.html">http://www.glfw.org/docs/latest/group__keys.html</a>. <a href="classmingfx_1_1_graphics_app.html#abcf1935e92550bcda311cac62f312952">More...</a><br /></td></tr>
+<tr class="separator:abcf1935e92550bcda311cac62f312952"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8362762489e287edfa59617a6602db22"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a8362762489e287edfa59617a6602db22">OnSpecialKeyRepeat</a> (int key, int scancode, int modifiers)</td></tr>
+<tr class="memdesc:a8362762489e287edfa59617a6602db22"><td class="mdescLeft">&#160;</td><td class="mdescRight">The values for key, scancode, and modifiers are documented here: <a href="http://www.glfw.org/docs/latest/group__keys.html">http://www.glfw.org/docs/latest/group__keys.html</a>. <a href="classmingfx_1_1_graphics_app.html#a8362762489e287edfa59617a6602db22">More...</a><br /></td></tr>
+<tr class="separator:a8362762489e287edfa59617a6602db22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0deb6da45fc0d3980e44556a861c7a14"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a0deb6da45fc0d3980e44556a861c7a14">OnSpecialKeyUp</a> (int key, int scancode, int modifiers)</td></tr>
+<tr class="memdesc:a0deb6da45fc0d3980e44556a861c7a14"><td class="mdescLeft">&#160;</td><td class="mdescRight">The values for key, scancode, and modifiers are documented here: <a href="http://www.glfw.org/docs/latest/group__keys.html">http://www.glfw.org/docs/latest/group__keys.html</a>. <a href="classmingfx_1_1_graphics_app.html#a0deb6da45fc0d3980e44556a861c7a14">More...</a><br /></td></tr>
+<tr class="separator:a0deb6da45fc0d3980e44556a861c7a14"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adafdc4631db256fefce3c4ffdfd5086a"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#adafdc4631db256fefce3c4ffdfd5086a">OnWindowResize</a> (int new_width, int new_height)</td></tr>
+<tr class="memdesc:adafdc4631db256fefce3c4ffdfd5086a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Override this to respond when the graphics window and/or framebuffer are resized, either by the user dragging the window or through a call to <a class="el" href="classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5" title="Cause the graphics windows to resize programmatically rather than by dragging on the corner manually.">ResizeWindow()</a>. <a href="classmingfx_1_1_graphics_app.html#adafdc4631db256fefce3c4ffdfd5086a">More...</a><br /></td></tr>
+<tr class="separator:adafdc4631db256fefce3c4ffdfd5086a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ee9ae3d14e76c949979a8008687d6c9"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9">Run</a> ()</td></tr>
+<tr class="memdesc:a5ee9ae3d14e76c949979a8008687d6c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">After creating a new <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, call this to start the app's mainloop. <a href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9">More...</a><br /></td></tr>
+<tr class="separator:a5ee9ae3d14e76c949979a8008687d6c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfe77d841f43961b299ea6159477968a"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a">InitNanoGUI</a> ()</td></tr>
+<tr class="memdesc:adfe77d841f43961b299ea6159477968a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called at the beginning of the <a class="el" href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9" title="After creating a new GraphicsApp, call this to start the app&#39;s mainloop.">Run()</a> method. <a href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a">More...</a><br /></td></tr>
+<tr class="separator:adfe77d841f43961b299ea6159477968a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96196b37f8b488b64072ec74b5d2b0b3"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3">InitOpenGL</a> ()</td></tr>
+<tr class="memdesc:a96196b37f8b488b64072ec74b5d2b0b3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Override this to initialize the OpenGL context with textures, vertex buffers, etc. <a href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3">More...</a><br /></td></tr>
+<tr class="separator:a96196b37f8b488b64072ec74b5d2b0b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e2b4cd7eeabe1ace9d5e9220349fbaa"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa">UpdateSimulation</a> (double dt)</td></tr>
+<tr class="memdesc:a9e2b4cd7eeabe1ace9d5e9220349fbaa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called once per frame. <a href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa">More...</a><br /></td></tr>
+<tr class="separator:a9e2b4cd7eeabe1ace9d5e9220349fbaa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a688f12675da58210e8ec2ffcda4923d0"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0">DrawUsingNanoVG</a> (NVGcontext *ctx)</td></tr>
+<tr class="memdesc:a688f12675da58210e8ec2ffcda4923d0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Override this to draw graphics using the nanovg vector graphics library, which provides an easy way to draw 2D shapes to the screen. <a href="classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0">More...</a><br /></td></tr>
+<tr class="separator:a688f12675da58210e8ec2ffcda4923d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a858fd10651f7617491f37b49dbf8ca"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca">DrawUsingOpenGL</a> ()</td></tr>
+<tr class="memdesc:a5a858fd10651f7617491f37b49dbf8ca"><td class="mdescLeft">&#160;</td><td class="mdescRight">Override this to draw graphics using raw OpenGL 2D or 3D graphics calls. <a href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca">More...</a><br /></td></tr>
+<tr class="separator:a5a858fd10651f7617491f37b49dbf8ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60688614e5dfeaabf57f8825cdaa08ac"><td class="memItemLeft" align="right" valign="top">virtual bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a60688614e5dfeaabf57f8825cdaa08ac">IsKeyDown</a> (int key)</td></tr>
+<tr class="memdesc:a60688614e5dfeaabf57f8825cdaa08ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">True if the specified is is currently held down. Uses the GLFW key codes found here: <a href="http://www.glfw.org/docs/latest/group__keys.html">http://www.glfw.org/docs/latest/group__keys.html</a>. <a href="classmingfx_1_1_graphics_app.html#a60688614e5dfeaabf57f8825cdaa08ac">More...</a><br /></td></tr>
+<tr class="separator:a60688614e5dfeaabf57f8825cdaa08ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b78d79192180a6ef5271d2a2b2d1cc7"><td class="memItemLeft" align="right" valign="top">virtual bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a5b78d79192180a6ef5271d2a2b2d1cc7">IsLeftMouseDown</a> ()</td></tr>
+<tr class="memdesc:a5b78d79192180a6ef5271d2a2b2d1cc7"><td class="mdescLeft">&#160;</td><td class="mdescRight">True if the left mouse button is currently held down. <a href="classmingfx_1_1_graphics_app.html#a5b78d79192180a6ef5271d2a2b2d1cc7">More...</a><br /></td></tr>
+<tr class="separator:a5b78d79192180a6ef5271d2a2b2d1cc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a941f7598400073bfa93aa194a3773434"><td class="memItemLeft" align="right" valign="top">virtual bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a941f7598400073bfa93aa194a3773434">IsMiddleMouseDown</a> ()</td></tr>
+<tr class="memdesc:a941f7598400073bfa93aa194a3773434"><td class="mdescLeft">&#160;</td><td class="mdescRight">True if the middle mouse button is currently held down. <a href="classmingfx_1_1_graphics_app.html#a941f7598400073bfa93aa194a3773434">More...</a><br /></td></tr>
+<tr class="separator:a941f7598400073bfa93aa194a3773434"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4aa30e3d33731178a9162454a81be08d"><td class="memItemLeft" align="right" valign="top">virtual bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a4aa30e3d33731178a9162454a81be08d">IsRightMouseDown</a> ()</td></tr>
+<tr class="memdesc:a4aa30e3d33731178a9162454a81be08d"><td class="mdescLeft">&#160;</td><td class="mdescRight">True if the right mouse button is currently held down. <a href="classmingfx_1_1_graphics_app.html#a4aa30e3d33731178a9162454a81be08d">More...</a><br /></td></tr>
+<tr class="separator:a4aa30e3d33731178a9162454a81be08d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c682fa2dd0bce855e1e32ffeac532b0"><td class="memItemLeft" align="right" valign="top">virtual int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0">window_width</a> ()</td></tr>
+<tr class="memdesc:a1c682fa2dd0bce855e1e32ffeac532b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the current width of the client area of the window in pixels. <a href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0">More...</a><br /></td></tr>
+<tr class="separator:a1c682fa2dd0bce855e1e32ffeac532b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad7a641f7ccf174cd0a059347b623e016"><td class="memItemLeft" align="right" valign="top">virtual int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016">window_height</a> ()</td></tr>
+<tr class="memdesc:ad7a641f7ccf174cd0a059347b623e016"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the current height of the client area of the window in pixels. <a href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016">More...</a><br /></td></tr>
+<tr class="separator:ad7a641f7ccf174cd0a059347b623e016"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad596e69d030e7689ad91eaaec6975696"><td class="memItemLeft" align="right" valign="top">virtual int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#ad596e69d030e7689ad91eaaec6975696">framebuffer_width</a> ()</td></tr>
+<tr class="memdesc:ad596e69d030e7689ad91eaaec6975696"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the current width of the framebuffer in pixels. <a href="classmingfx_1_1_graphics_app.html#ad596e69d030e7689ad91eaaec6975696">More...</a><br /></td></tr>
+<tr class="separator:ad596e69d030e7689ad91eaaec6975696"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af58153eb104f53216a3e67de2a472f32"><td class="memItemLeft" align="right" valign="top">virtual int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#af58153eb104f53216a3e67de2a472f32">framebuffer_height</a> ()</td></tr>
+<tr class="memdesc:af58153eb104f53216a3e67de2a472f32"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the current height of the framebuffer in pixels. <a href="classmingfx_1_1_graphics_app.html#af58153eb104f53216a3e67de2a472f32">More...</a><br /></td></tr>
+<tr class="separator:af58153eb104f53216a3e67de2a472f32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac682691ee96ea32037abafd74d144a23"><td class="memItemLeft" align="right" valign="top">virtual float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23">aspect_ratio</a> ()</td></tr>
+<tr class="memdesc:ac682691ee96ea32037abafd74d144a23"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns width/height for the current shape of the window. <a href="classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23">More...</a><br /></td></tr>
+<tr class="separator:ac682691ee96ea32037abafd74d144a23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94b19404e61411ef64c0ddde8ad6c07a"><td class="memItemLeft" align="right" valign="top">virtual <a class="el" href="classmingfx_1_1_point2.html">Point2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a94b19404e61411ef64c0ddde8ad6c07a">PixelsToNormalizedDeviceCoords</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pointInPixels)</td></tr>
+<tr class="memdesc:a94b19404e61411ef64c0ddde8ad6c07a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Transforms a point in viewport coordinates (pixels where top left = (0,0) and bottom right = (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>-1, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>-1)) to normalized device coordinates, (top left = (-1,1) bottom right (1,-1)). <a href="classmingfx_1_1_graphics_app.html#a94b19404e61411ef64c0ddde8ad6c07a">More...</a><br /></td></tr>
+<tr class="separator:a94b19404e61411ef64c0ddde8ad6c07a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6141ec6adc29572ee99ca26cf90e6248"><td class="memItemLeft" align="right" valign="top">virtual <a class="el" href="classmingfx_1_1_point2.html">Point2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a6141ec6adc29572ee99ca26cf90e6248">NormalizedDeviceCoordsToPixels</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pointInNDC)</td></tr>
+<tr class="memdesc:a6141ec6adc29572ee99ca26cf90e6248"><td class="mdescLeft">&#160;</td><td class="mdescRight">Transforms a point in normalized device coordinates (top left = (-1,1) bottom right (1,-1)) to pixels (top left = (0,0), bottom right = (window width-1, window height-1)) <a href="classmingfx_1_1_graphics_app.html#a6141ec6adc29572ee99ca26cf90e6248">More...</a><br /></td></tr>
+<tr class="separator:a6141ec6adc29572ee99ca26cf90e6248"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e8ac965474de9046448b8811bf25dd1"><td class="memItemLeft" align="right" valign="top">virtual <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a4e8ac965474de9046448b8811bf25dd1">PixelsToNormalizedDeviceCoords</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;vectorInPixels)</td></tr>
+<tr class="memdesc:a4e8ac965474de9046448b8811bf25dd1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Transforms a vector in viewport coordinates (pixels where top left = (0,0) and bottom right = (window width-1, window height-1)) to normalized device coordinates, (top left = (-1,1) bottom right (1,-1)). <a href="classmingfx_1_1_graphics_app.html#a4e8ac965474de9046448b8811bf25dd1">More...</a><br /></td></tr>
+<tr class="separator:a4e8ac965474de9046448b8811bf25dd1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45596da36aa3905e7c752826a7fd9f93"><td class="memItemLeft" align="right" valign="top">virtual <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a45596da36aa3905e7c752826a7fd9f93">NormalizedDeviceCoordsToPixels</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;pointInNDC)</td></tr>
+<tr class="memdesc:a45596da36aa3905e7c752826a7fd9f93"><td class="mdescLeft">&#160;</td><td class="mdescRight">Transforms a vector in normalized device coordinates (top left = (-1,1) bottom right (1,-1)) to pixels (top left = (0,0), bottom right = (window width-1, window height-1)) <a href="classmingfx_1_1_graphics_app.html#a45596da36aa3905e7c752826a7fd9f93">More...</a><br /></td></tr>
+<tr class="separator:a45596da36aa3905e7c752826a7fd9f93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a471951dbf45ffa88027cb92707443646"><td class="memItemLeft" align="right" valign="top">virtual float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a471951dbf45ffa88027cb92707443646">ReadZValueAtPixel</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;pointInPixels, unsigned int whichBuffer=GL_BACK)</td></tr>
+<tr class="memdesc:a471951dbf45ffa88027cb92707443646"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the z buffer value under the specified pixel. z will be 0 at the near plane and +1 at the far plane. <a href="classmingfx_1_1_graphics_app.html#a471951dbf45ffa88027cb92707443646">More...</a><br /></td></tr>
+<tr class="separator:a471951dbf45ffa88027cb92707443646"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adc68196c3f03bd0608c41f6e4d7dad16"><td class="memItemLeft" align="right" valign="top">virtual nanogui::Screen *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16">screen</a> ()</td></tr>
+<tr class="memdesc:adc68196c3f03bd0608c41f6e4d7dad16"><td class="mdescLeft">&#160;</td><td class="mdescRight">Access to the underlying NanoGUI Screen object. <a href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16">More...</a><br /></td></tr>
+<tr class="separator:adc68196c3f03bd0608c41f6e4d7dad16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd0ee14f7e12146000cdb3532d54ba94"><td class="memItemLeft" align="right" valign="top">virtual GLFWwindow *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">window</a> ()</td></tr>
+<tr class="memdesc:abd0ee14f7e12146000cdb3532d54ba94"><td class="mdescLeft">&#160;</td><td class="mdescRight">Access to the underlying GLFWwindow object. <a href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">More...</a><br /></td></tr>
+<tr class="separator:abd0ee14f7e12146000cdb3532d54ba94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0db71b2465e12a8aef4eefbe8b9fcee5"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5">ResizeWindow</a> (int new_width, int new_height)</td></tr>
+<tr class="memdesc:a0db71b2465e12a8aef4eefbe8b9fcee5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Cause the graphics windows to resize programmatically rather than by dragging on the corner manually. <a href="classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5">More...</a><br /></td></tr>
+<tr class="separator:a0db71b2465e12a8aef4eefbe8b9fcee5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a04beb462aa04371dc86d807838f999e1"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html#a04beb462aa04371dc86d807838f999e1">InitGraphicsContext</a> ()</td></tr>
+<tr class="memdesc:a04beb462aa04371dc86d807838f999e1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Users cannot make any graphics calls (e.g., setting the clear color, saving mesh data to the GPU) until the graphics context is initialized by calling this method. <a href="classmingfx_1_1_graphics_app.html#a04beb462aa04371dc86d807838f999e1">More...</a><br /></td></tr>
+<tr class="separator:a04beb462aa04371dc86d807838f999e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="abf0b48c7d8e5325ab038fddbe1c38b5b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf0b48c7d8e5325ab038fddbe1c38b5b">&#9670;&nbsp;</a></span>GraphicsApp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::GraphicsApp::GraphicsApp </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>height</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>caption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a new app but does not yet run it. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">width</td><td>The width of the client area of the window in pixels. </td></tr>
+ <tr><td class="paramname">height</td><td>The height of the client area of the window in pixels. </td></tr>
+ <tr><td class="paramname">caption</td><td>The caption for the window's title bar. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aab7925c6b844e6bef428feacf4aa9afb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aab7925c6b844e6bef428feacf4aa9afb">&#9670;&nbsp;</a></span>~GraphicsApp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::GraphicsApp::~GraphicsApp </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>The destructor will shutdown the graphics system and window. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="ac682691ee96ea32037abafd74d144a23"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac682691ee96ea32037abafd74d144a23">&#9670;&nbsp;</a></span>aspect_ratio()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual float mingfx::GraphicsApp::aspect_ratio </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns width/height for the current shape of the window. </p>
+
+</div>
+</div>
+<a id="a688f12675da58210e8ec2ffcda4923d0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a688f12675da58210e8ec2ffcda4923d0">&#9670;&nbsp;</a></span>DrawUsingNanoVG()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::DrawUsingNanoVG </td>
+ <td>(</td>
+ <td class="paramtype">NVGcontext *&#160;</td>
+ <td class="paramname"><em>ctx</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Override this to draw graphics using the nanovg vector graphics library, which provides an easy way to draw 2D shapes to the screen. </p>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00311">311</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a5a858fd10651f7617491f37b49dbf8ca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5a858fd10651f7617491f37b49dbf8ca">&#9670;&nbsp;</a></span>DrawUsingOpenGL()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::DrawUsingOpenGL </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Override this to draw graphics using raw OpenGL 2D or 3D graphics calls. </p>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00317">317</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="af58153eb104f53216a3e67de2a472f32"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af58153eb104f53216a3e67de2a472f32">&#9670;&nbsp;</a></span>framebuffer_height()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual int mingfx::GraphicsApp::framebuffer_height </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the current height of the framebuffer in pixels. </p>
+<p>Note that on some displays (e.g., Mac Retina) the framebuffer is larger than the window. </p>
+
+</div>
+</div>
+<a id="ad596e69d030e7689ad91eaaec6975696"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad596e69d030e7689ad91eaaec6975696">&#9670;&nbsp;</a></span>framebuffer_width()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual int mingfx::GraphicsApp::framebuffer_width </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the current width of the framebuffer in pixels. </p>
+<p>Note that on some displays (e.g., Mac Retina) the framebuffer is larger than the window. </p>
+
+</div>
+</div>
+<a id="a04beb462aa04371dc86d807838f999e1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a04beb462aa04371dc86d807838f999e1">&#9670;&nbsp;</a></span>InitGraphicsContext()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::InitGraphicsContext </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Users cannot make any graphics calls (e.g., setting the clear color, saving mesh data to the GPU) until the graphics context is initialized by calling this method. </p>
+<p>It is called automatically by the <a class="el" href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9" title="After creating a new GraphicsApp, call this to start the app&#39;s mainloop.">Run()</a> method before calling the <a class="el" href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a" title="Called at the beginning of the Run() method.">InitNanoGUI()</a> and <a class="el" href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3" title="Override this to initialize the OpenGL context with textures, vertex buffers, etc.">InitOpenGL()</a> methods. So, users should place all of their graphics initialization code inside one of those two methods. </p>
+
+</div>
+</div>
+<a id="adfe77d841f43961b299ea6159477968a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adfe77d841f43961b299ea6159477968a">&#9670;&nbsp;</a></span>InitNanoGUI()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::InitNanoGUI </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Called at the beginning of the <a class="el" href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9" title="After creating a new GraphicsApp, call this to start the app&#39;s mainloop.">Run()</a> method. </p>
+<p>Override this to initialize any NanoGUI graphics related properties including 2D windows, buttons, sliders, etc...</p>
+<p>IMPORTANT: Put any NanoGUI initialization code here, NOT in the constructors of the classes that you create, or, create your classes from within this function. The graphics calls will fail if the OpenGL context has not yet been initialized, and it is not guaranteed to be initialized until this function has been called. </p>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00284">284</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a96196b37f8b488b64072ec74b5d2b0b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a96196b37f8b488b64072ec74b5d2b0b3">&#9670;&nbsp;</a></span>InitOpenGL()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::InitOpenGL </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Override this to initialize the OpenGL context with textures, vertex buffers, etc. </p>
+<p>that you will use later inside <a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca" title="Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.">DrawUsingOpenGL()</a>. This <a class="el" href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3" title="Override this to initialize the OpenGL context with textures, vertex buffers, etc.">InitOpenGL()</a> function is called once on program startup just after the OpenGL drawing context is created.</p>
+<p>IMPORTANT: Put any OpenGL initialization code here, NOT in the constructors of the classes that you create, or, create your classes from within this function. The graphics calls will fail if the OpenGL context has not yet been initialized, and it is not guaranteed to be initialized until this function has been called. </p>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00297">297</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a60688614e5dfeaabf57f8825cdaa08ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a60688614e5dfeaabf57f8825cdaa08ac">&#9670;&nbsp;</a></span>IsKeyDown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual bool mingfx::GraphicsApp::IsKeyDown </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>key</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>True if the specified is is currently held down. Uses the GLFW key codes found here: <a href="http://www.glfw.org/docs/latest/group__keys.html">http://www.glfw.org/docs/latest/group__keys.html</a>. </p>
+
+</div>
+</div>
+<a id="a5b78d79192180a6ef5271d2a2b2d1cc7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5b78d79192180a6ef5271d2a2b2d1cc7">&#9670;&nbsp;</a></span>IsLeftMouseDown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual bool mingfx::GraphicsApp::IsLeftMouseDown </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>True if the left mouse button is currently held down. </p>
+
+</div>
+</div>
+<a id="a941f7598400073bfa93aa194a3773434"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a941f7598400073bfa93aa194a3773434">&#9670;&nbsp;</a></span>IsMiddleMouseDown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual bool mingfx::GraphicsApp::IsMiddleMouseDown </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>True if the middle mouse button is currently held down. </p>
+
+</div>
+</div>
+<a id="a4aa30e3d33731178a9162454a81be08d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4aa30e3d33731178a9162454a81be08d">&#9670;&nbsp;</a></span>IsRightMouseDown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual bool mingfx::GraphicsApp::IsRightMouseDown </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>True if the right mouse button is currently held down. </p>
+
+</div>
+</div>
+<a id="a6141ec6adc29572ee99ca26cf90e6248"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6141ec6adc29572ee99ca26cf90e6248">&#9670;&nbsp;</a></span>NormalizedDeviceCoordsToPixels() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual <a class="el" href="classmingfx_1_1_point2.html">Point2</a> mingfx::GraphicsApp::NormalizedDeviceCoordsToPixels </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pointInNDC</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Transforms a point in normalized device coordinates (top left = (-1,1) bottom right (1,-1)) to pixels (top left = (0,0), bottom right = (window width-1, window height-1)) </p>
+
+</div>
+</div>
+<a id="a45596da36aa3905e7c752826a7fd9f93"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a45596da36aa3905e7c752826a7fd9f93">&#9670;&nbsp;</a></span>NormalizedDeviceCoordsToPixels() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::GraphicsApp::NormalizedDeviceCoordsToPixels </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pointInNDC</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Transforms a vector in normalized device coordinates (top left = (-1,1) bottom right (1,-1)) to pixels (top left = (0,0), bottom right = (window width-1, window height-1)) </p>
+
+</div>
+</div>
+<a id="a002560456139e537877d079978db4b01"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a002560456139e537877d079978db4b01">&#9670;&nbsp;</a></span>OnKeyDown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnKeyDown </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>modifiers</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Transforms a keyboard down event into the actual character typed. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>The character for the key that was pressed. </td></tr>
+ <tr><td class="paramname">modifiers</td><td>If any modifiers (Alt, Ctrl, Shift, etc.) were held at the same time, then these are encoded in this int. See the detailed description here: <a href="http://www.glfw.org/docs/latest/group__mods.html">http://www.glfw.org/docs/latest/group__mods.html</a> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00225">225</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a1d5831953b37fae615fbd1bf527214b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d5831953b37fae615fbd1bf527214b0">&#9670;&nbsp;</a></span>OnKeyRepeat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnKeyRepeat </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>modifiers</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Transforms a keyboard repeat event into the actual character typed. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>The character for the key that was pressed. </td></tr>
+ <tr><td class="paramname">modifiers</td><td>If any modifiers (Alt, Ctrl, Shift, etc.) were held at the same time, then these are encoded in this int. See the detailed description here: <a href="http://www.glfw.org/docs/latest/group__mods.html">http://www.glfw.org/docs/latest/group__mods.html</a> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00233">233</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a8376ef8eb0840b229a2301f995db3f6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8376ef8eb0840b229a2301f995db3f6c">&#9670;&nbsp;</a></span>OnKeyUp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnKeyUp </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>modifiers</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Transforms a keyboard up event into the actual character typed. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>The character for the key that was pressed. </td></tr>
+ <tr><td class="paramname">modifiers</td><td>If any modifiers (Alt, Ctrl, Shift, etc.) were held at the same time, then these are encoded in this int. See the detailed description here: <a href="http://www.glfw.org/docs/latest/group__mods.html">http://www.glfw.org/docs/latest/group__mods.html</a> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00241">241</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="ae12d9b192a2167a71e0c103405addb17"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae12d9b192a2167a71e0c103405addb17">&#9670;&nbsp;</a></span>OnLeftMouseDown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnLeftMouseDown </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pos</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>If the mouse button was pressed down since the last frame, then this function will be called to notify you. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">pos</td><td>This is the current position of the mouse in pixels, where (0,0) is at the top left corner of the screen and (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>) is the bottom right corner. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00174">174</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a56d350a8b030998709a51630753d509b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a56d350a8b030998709a51630753d509b">&#9670;&nbsp;</a></span>OnLeftMouseDrag()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnLeftMouseDrag </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pos</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>delta</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>If the mouse button is held down and the mouse has moved in the past frame then this function will be called to tell you that a "dragging" operation is happening. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">pos</td><td>This is the current position of the mouse in pixels, where (0,0) is at the top left corner of the screen and (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>) is the bottom right corner.</td></tr>
+ <tr><td class="paramname">delta</td><td>This is the change in the position of the mouse in pixels since the last frame. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00187">187</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a536dbadf0b8a11ef59d7e855ca43f613"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a536dbadf0b8a11ef59d7e855ca43f613">&#9670;&nbsp;</a></span>OnLeftMouseUp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnLeftMouseUp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pos</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>If the mouse button was released since the last frame, then this function will be called to notify you. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">pos</td><td>This is the current position of the mouse in pixels, where (0,0) is at the top left corner of the screen and (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>-1, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>-1) is the bottom right corner. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00196">196</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a588315d5c45490b440a764af2bc5bd48"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a588315d5c45490b440a764af2bc5bd48">&#9670;&nbsp;</a></span>OnMiddleMouseDown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnMiddleMouseDown </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pos</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>If the mouse button was pressed down since the last frame, then this function will be called to notify you. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">pos</td><td>This is the current position of the mouse in pixels, where (0,0) is at the top left corner of the screen and (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>) is the bottom right corner. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00200">200</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="ac7628fece754c0ac4875791e19712dc6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac7628fece754c0ac4875791e19712dc6">&#9670;&nbsp;</a></span>OnMiddleMouseDrag()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnMiddleMouseDrag </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pos</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>delta</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>If the mouse button is held down and the mouse has moved in the past frame then this function will be called to tell you that a "dragging" operation is happening. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">pos</td><td>This is the current position of the mouse in pixels, where (0,0) is at the top left corner of the screen and (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>) is the bottom right corner.</td></tr>
+ <tr><td class="paramname">delta</td><td>This is the change in the position of the mouse in pixels since the last frame. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00203">203</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a378b8a102775eeb01a6da9dd68482d08"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a378b8a102775eeb01a6da9dd68482d08">&#9670;&nbsp;</a></span>OnMiddleMouseUp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnMiddleMouseUp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pos</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>If the mouse button was released since the last frame, then this function will be called to notify you. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">pos</td><td>This is the current position of the mouse in pixels, where (0,0) is at the top left corner of the screen and (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>-1, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>-1) is the bottom right corner. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00206">206</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a23a780feda9b52eea7319a53b204ce8f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a23a780feda9b52eea7319a53b204ce8f">&#9670;&nbsp;</a></span>OnMouseMove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnMouseMove </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pos</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>delta</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>If the mouse has moved in the past frame and no mouse buttons are currently pressed, then this callback function will be called to report the new position of the mouse to you. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">pos</td><td>This is the current position of the mouse in pixels, where (0,0) is at the top left corner of the screen and (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>) is the bottom right corner.</td></tr>
+ <tr><td class="paramname">delta</td><td>This is the change in the position of the mouse in pixels since the last frame. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00165">165</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a903f94b82cc10f32039ff3f2ba368a9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a903f94b82cc10f32039ff3f2ba368a9c">&#9670;&nbsp;</a></span>OnRightMouseDown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnRightMouseDown </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pos</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>If the mouse button was pressed down since the last frame, then this function will be called to notify you. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">pos</td><td>This is the current position of the mouse in pixels, where (0,0) is at the top left corner of the screen and (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>) is the bottom right corner. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00210">210</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a00ad5039af2f428a08fe45751a9731c7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a00ad5039af2f428a08fe45751a9731c7">&#9670;&nbsp;</a></span>OnRightMouseDrag()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnRightMouseDrag </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pos</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>delta</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>If the mouse button is held down and the mouse has moved in the past frame then this function will be called to tell you that a "dragging" operation is happening. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">pos</td><td>This is the current position of the mouse in pixels, where (0,0) is at the top left corner of the screen and (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>) is the bottom right corner.</td></tr>
+ <tr><td class="paramname">delta</td><td>This is the change in the position of the mouse in pixels since the last frame. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00213">213</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="ad7c33791c44afc87ce789874f3002ca3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad7c33791c44afc87ce789874f3002ca3">&#9670;&nbsp;</a></span>OnRightMouseUp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnRightMouseUp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pos</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>If the mouse button was released since the last frame, then this function will be called to notify you. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">pos</td><td>This is the current position of the mouse in pixels, where (0,0) is at the top left corner of the screen and (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>-1, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>-1) is the bottom right corner. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00216">216</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="abcf1935e92550bcda311cac62f312952"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abcf1935e92550bcda311cac62f312952">&#9670;&nbsp;</a></span>OnSpecialKeyDown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnSpecialKeyDown </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>scancode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>modifiers</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>The values for key, scancode, and modifiers are documented here: <a href="http://www.glfw.org/docs/latest/group__keys.html">http://www.glfw.org/docs/latest/group__keys.html</a>. </p>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00247">247</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a8362762489e287edfa59617a6602db22"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8362762489e287edfa59617a6602db22">&#9670;&nbsp;</a></span>OnSpecialKeyRepeat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnSpecialKeyRepeat </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>scancode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>modifiers</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>The values for key, scancode, and modifiers are documented here: <a href="http://www.glfw.org/docs/latest/group__keys.html">http://www.glfw.org/docs/latest/group__keys.html</a>. </p>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00251">251</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a0deb6da45fc0d3980e44556a861c7a14"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0deb6da45fc0d3980e44556a861c7a14">&#9670;&nbsp;</a></span>OnSpecialKeyUp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnSpecialKeyUp </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>scancode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>modifiers</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>The values for key, scancode, and modifiers are documented here: <a href="http://www.glfw.org/docs/latest/group__keys.html">http://www.glfw.org/docs/latest/group__keys.html</a>. </p>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00255">255</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="adafdc4631db256fefce3c4ffdfd5086a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adafdc4631db256fefce3c4ffdfd5086a">&#9670;&nbsp;</a></span>OnWindowResize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::OnWindowResize </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>new_width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>new_height</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Override this to respond when the graphics window and/or framebuffer are resized, either by the user dragging the window or through a call to <a class="el" href="classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5" title="Cause the graphics windows to resize programmatically rather than by dragging on the corner manually.">ResizeWindow()</a>. </p>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00261">261</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="a94b19404e61411ef64c0ddde8ad6c07a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a94b19404e61411ef64c0ddde8ad6c07a">&#9670;&nbsp;</a></span>PixelsToNormalizedDeviceCoords() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual <a class="el" href="classmingfx_1_1_point2.html">Point2</a> mingfx::GraphicsApp::PixelsToNormalizedDeviceCoords </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pointInPixels</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Transforms a point in viewport coordinates (pixels where top left = (0,0) and bottom right = (<a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0" title="Returns the current width of the client area of the window in pixels.">window_width()</a>-1, <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016" title="Returns the current height of the client area of the window in pixels.">window_height()</a>-1)) to normalized device coordinates, (top left = (-1,1) bottom right (1,-1)). </p>
+
+</div>
+</div>
+<a id="a4e8ac965474de9046448b8811bf25dd1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e8ac965474de9046448b8811bf25dd1">&#9670;&nbsp;</a></span>PixelsToNormalizedDeviceCoords() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::GraphicsApp::PixelsToNormalizedDeviceCoords </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>vectorInPixels</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Transforms a vector in viewport coordinates (pixels where top left = (0,0) and bottom right = (window width-1, window height-1)) to normalized device coordinates, (top left = (-1,1) bottom right (1,-1)). </p>
+
+</div>
+</div>
+<a id="a471951dbf45ffa88027cb92707443646"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a471951dbf45ffa88027cb92707443646">&#9670;&nbsp;</a></span>ReadZValueAtPixel()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual float mingfx::GraphicsApp::ReadZValueAtPixel </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>pointInPixels</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned int&#160;</td>
+ <td class="paramname"><em>whichBuffer</em> = <code>GL_BACK</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the z buffer value under the specified pixel. z will be 0 at the near plane and +1 at the far plane. </p>
+
+</div>
+</div>
+<a id="a0db71b2465e12a8aef4eefbe8b9fcee5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0db71b2465e12a8aef4eefbe8b9fcee5">&#9670;&nbsp;</a></span>ResizeWindow()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::ResizeWindow </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>new_width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>new_height</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Cause the graphics windows to resize programmatically rather than by dragging on the corner manually. </p>
+
+</div>
+</div>
+<a id="a5ee9ae3d14e76c949979a8008687d6c9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ee9ae3d14e76c949979a8008687d6c9">&#9670;&nbsp;</a></span>Run()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::Run </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>After creating a new <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, call this to start the app's mainloop. </p>
+<p>Each time through the mainloop the app will: 1. respond any user input events by calling the On*() callback methods, 2. call <a class="el" href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa" title="Called once per frame.">UpdateSimulation()</a>, and 3. call the two Draw*() methods. Note that <a class="el" href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9" title="After creating a new GraphicsApp, call this to start the app&#39;s mainloop.">Run()</a> does not return until the user closes the app and the program is ready to shutdown. </p>
+
+</div>
+</div>
+<a id="adc68196c3f03bd0608c41f6e4d7dad16"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adc68196c3f03bd0608c41f6e4d7dad16">&#9670;&nbsp;</a></span>screen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual nanogui::Screen* mingfx::GraphicsApp::screen </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Access to the underlying NanoGUI Screen object. </p>
+
+</div>
+</div>
+<a id="a9e2b4cd7eeabe1ace9d5e9220349fbaa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9e2b4cd7eeabe1ace9d5e9220349fbaa">&#9670;&nbsp;</a></span>UpdateSimulation()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void mingfx::GraphicsApp::UpdateSimulation </td>
+ <td>(</td>
+ <td class="paramtype">double&#160;</td>
+ <td class="paramname"><em>dt</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Called once per frame. </p>
+<p>Override this and fill it in to update your simulation code or any other updates you need to make to your model that are timed rather than in response to user input.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">dt</td><td>is the elapsed time since the last call. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p class="definition">Definition at line <a class="el" href="graphics__app_8h_source.html#l00306">306</a> of file <a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>.</p>
+
+</div>
+</div>
+<a id="abd0ee14f7e12146000cdb3532d54ba94"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd0ee14f7e12146000cdb3532d54ba94">&#9670;&nbsp;</a></span>window()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual GLFWwindow* mingfx::GraphicsApp::window </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Access to the underlying GLFWwindow object. </p>
+
+</div>
+</div>
+<a id="ad7a641f7ccf174cd0a059347b623e016"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad7a641f7ccf174cd0a059347b623e016">&#9670;&nbsp;</a></span>window_height()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual int mingfx::GraphicsApp::window_height </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the current height of the client area of the window in pixels. </p>
+
+</div>
+</div>
+<a id="a1c682fa2dd0bce855e1e32ffeac532b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1c682fa2dd0bce855e1e32ffeac532b0">&#9670;&nbsp;</a></span>window_width()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual int mingfx::GraphicsApp::window_width </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the current width of the client area of the window in pixels. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="graphics__app_8h_source.html">graphics_app.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_matrix4-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_matrix4-members.html
new file mode 100644
index 0000000..4b96bca
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_matrix4-members.html
@@ -0,0 +1,127 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::Matrix4 Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d">Align</a>(const Point3 &amp;a_p, const Vector3 &amp;a_v1, const Vector3 &amp;a_v2, const Point3 &amp;b_p, const Vector3 &amp;b_v1, const Vector3 &amp;b_v2)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a0d88ba8e15325d135157d115f2412e91">Cofactor</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#ae991be2b3bca290b44e676a9f8dc13bd">ColumnToPoint3</a>(int c) const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a7396dbff36cb732e1bd878020f52bbc3">ColumnToVector3</a>(int c) const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a0127ebae92b50e4f10ebee8565b0248c">Determinant</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#add98bfa1cf6a10dbae0e8ae8defe728b">FromRowMajorElements</a>(const float r1c1, const float r1c2, const float r1c3, const float r1c4, const float r2c1, const float r2c2, const float r2c3, const float r2c4, const float r3c1, const float r3c2, const float r3c3, const float r3c4, const float r4c1, const float r4c2, const float r4c3, const float r4c4)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a8e2f7b50cd2c8853e007829df9863722">Frustum</a>(float left, float right, float bottom, float top, float near_plane_dist, float far_plane_dist)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#ab3f360906e15730eee621826b5f0bbc5">Inverse</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">LookAt</a>(Point3 eye, Point3 target, Vector3 up)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">Matrix4</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a09a366a3ef940ff355f8d5c521baa57d">Matrix4</a>(const float *a)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a0abaeb690794c4a55e74c9b5fd82d138">Matrix4</a>(const std::vector&lt; float &gt; &amp;a)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a4bcf311614006c551f57d2b0dcd32d87">Matrix4</a>(const Matrix4 &amp;m2)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#ab186b0ae1ae669346c0718c2489cd71b">operator!=</a>(const Matrix4 &amp;m2) const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#aa324d0cec02c452fb938af28725d5df9">operator()</a>(const int row, const int col) const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a470bba77b8e3c47de7adaa18046e6096">operator()</a>(const int row, const int col)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a9ad8a8bc180ce213956d6d7d3fa19770">operator=</a>(const Matrix4 &amp;m2)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a9ec2ee167a450cd7b992384e4cc5bb73">operator==</a>(const Matrix4 &amp;m2) const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#acd64f0db45e255d61dde4f6fa10a4127">operator[]</a>(const int i) const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#af9b02807d81eac55d66238f246c53656">operator[]</a>(const int i)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a9ad5c85784e84fa0a941361eaaae0250">Orthonormal</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">Perspective</a>(float fov_y_in_degrees, float aspect_ratio, float near_plane_dist, float far_plane_dist)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#acf4abaf4a45826f14b435edf80a8d0e0">Rotation</a>(const Point3 &amp;p, const Vector3 &amp;v, const float a)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a48615deb30590055c0aa9f207eee7f08">RotationX</a>(const float radians)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#aef94f0e9d298a7ba57e0119ef09b71b6">RotationY</a>(const float radians)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a4bf1dced8875fdc5827b5b8869e9de93">RotationZ</a>(const float radians)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e">Scale</a>(const Vector3 &amp;v)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a3d9898bfac2510a695df6b033054e481">SubDeterminant</a>(int exclude_row, int exclude_col) const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a4e9433f0482b5e9688c12398900608db">ToVector</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">Translation</a>(const Vector3 &amp;v)</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#afd1030205567d23d4a2d1240d8214850">Transpose</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a2b7b30f23f08d70e83c7b7e01945dd3c">value_ptr</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html#a8853a6b3fd0d08f1def5c9921bd47933">~Matrix4</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_matrix4.html b/dev/MinGfx/docs/html/classmingfx_1_1_matrix4.html
new file mode 100644
index 0000000..f687d82
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_matrix4.html
@@ -0,0 +1,1240 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::Matrix4 Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_matrix4-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::Matrix4 Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be compatible with OpenGL. </p>
+<p>Examples: </p><div class="fragment"><div class="line"><span class="comment">// constructing various matrices:</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">Matrix4</a> T = <a class="code" href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">Matrix4::Translation</a>(Vector3(1,0,0));</div>
+<div class="line"><a class="code" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">Matrix4</a> S = <a class="code" href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e">Matrix4::Scale</a>(Vector3(2,2,2));</div>
+<div class="line"><a class="code" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">Matrix4</a> R = Matrix4::RotateX(GfxMath::toRadians(45.0));</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// compose matrices together by multiplication</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">Matrix4</a> M = T * R * S;</div>
+<div class="line"><a class="code" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">Matrix4</a> Minv = M.Inverse();</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// transforming points, vectors, etc.</span></div>
+<div class="line">Point3 p1(1,1,1);</div>
+<div class="line">Point3 p2 = M * p1;</div>
+<div class="line"> </div>
+<div class="line">Vector3 v1(1,1,1);</div>
+<div class="line">Vector3 v2 = M * v1;</div>
+<div class="line"> </div>
+<div class="line">Ray r1(p1, v1);</div>
+<div class="line">Ray r2 = M * r1;</div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0232a58d20b1da5374cf8c72fb113a4e"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e">mingfx::Matrix4::Scale</a></div><div class="ttdeci">static Matrix4 Scale(const Vector3 &amp;v)</div><div class="ttdoc">Returns the scale matrix described by the vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a50990f00b756d640670a0b02129afd22"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">mingfx::Matrix4::Matrix4</a></div><div class="ttdeci">Matrix4()</div><div class="ttdoc">The default constructor creates an identity matrix:</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_ae82bab81df82dc03f5eb11e74ba1dd84"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">mingfx::Matrix4::Translation</a></div><div class="ttdeci">static Matrix4 Translation(const Vector3 &amp;v)</div><div class="ttdoc">Returns the translation matrix described by the vector.</div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="matrix4_8h_source.html#l00050">50</a> of file <a class="el" href="matrix4_8h_source.html">matrix4.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="matrix4_8h_source.html">matrix4.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a50990f00b756d640670a0b02129afd22"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">Matrix4</a> ()</td></tr>
+<tr class="memdesc:a50990f00b756d640670a0b02129afd22"><td class="mdescLeft">&#160;</td><td class="mdescRight">The default constructor creates an identity matrix: <a href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">More...</a><br /></td></tr>
+<tr class="separator:a50990f00b756d640670a0b02129afd22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09a366a3ef940ff355f8d5c521baa57d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a09a366a3ef940ff355f8d5c521baa57d">Matrix4</a> (const float *a)</td></tr>
+<tr class="memdesc:a09a366a3ef940ff355f8d5c521baa57d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a matrix given from an array of 16 floats in OpenGL matrix format (i.e., column major). <a href="classmingfx_1_1_matrix4.html#a09a366a3ef940ff355f8d5c521baa57d">More...</a><br /></td></tr>
+<tr class="separator:a09a366a3ef940ff355f8d5c521baa57d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0abaeb690794c4a55e74c9b5fd82d138"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a0abaeb690794c4a55e74c9b5fd82d138">Matrix4</a> (const std::vector&lt; float &gt; &amp;a)</td></tr>
+<tr class="memdesc:a0abaeb690794c4a55e74c9b5fd82d138"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a matrix given from a vector of 16 floats in OpenGL matrix format (i.e., column major). <a href="classmingfx_1_1_matrix4.html#a0abaeb690794c4a55e74c9b5fd82d138">More...</a><br /></td></tr>
+<tr class="separator:a0abaeb690794c4a55e74c9b5fd82d138"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4bcf311614006c551f57d2b0dcd32d87"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a4bcf311614006c551f57d2b0dcd32d87">Matrix4</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m2)</td></tr>
+<tr class="memdesc:a4bcf311614006c551f57d2b0dcd32d87"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy constructor. <a href="classmingfx_1_1_matrix4.html#a4bcf311614006c551f57d2b0dcd32d87">More...</a><br /></td></tr>
+<tr class="separator:a4bcf311614006c551f57d2b0dcd32d87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8853a6b3fd0d08f1def5c9921bd47933"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a8853a6b3fd0d08f1def5c9921bd47933">~Matrix4</a> ()</td></tr>
+<tr class="memdesc:a8853a6b3fd0d08f1def5c9921bd47933"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destructor. <a href="classmingfx_1_1_matrix4.html#a8853a6b3fd0d08f1def5c9921bd47933">More...</a><br /></td></tr>
+<tr class="separator:a8853a6b3fd0d08f1def5c9921bd47933"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ec2ee167a450cd7b992384e4cc5bb73"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a9ec2ee167a450cd7b992384e4cc5bb73">operator==</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m2) const</td></tr>
+<tr class="memdesc:a9ec2ee167a450cd7b992384e4cc5bb73"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "equality", taking floating point imprecision into account. <a href="classmingfx_1_1_matrix4.html#a9ec2ee167a450cd7b992384e4cc5bb73">More...</a><br /></td></tr>
+<tr class="separator:a9ec2ee167a450cd7b992384e4cc5bb73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab186b0ae1ae669346c0718c2489cd71b"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#ab186b0ae1ae669346c0718c2489cd71b">operator!=</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m2) const</td></tr>
+<tr class="memdesc:ab186b0ae1ae669346c0718c2489cd71b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "inequality", taking floating point imprecision into account. <a href="classmingfx_1_1_matrix4.html#ab186b0ae1ae669346c0718c2489cd71b">More...</a><br /></td></tr>
+<tr class="separator:ab186b0ae1ae669346c0718c2489cd71b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ad8a8bc180ce213956d6d7d3fa19770"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a9ad8a8bc180ce213956d6d7d3fa19770">operator=</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m2)</td></tr>
+<tr class="memdesc:a9ad8a8bc180ce213956d6d7d3fa19770"><td class="mdescLeft">&#160;</td><td class="mdescRight">Matrix assignment operator. <a href="classmingfx_1_1_matrix4.html#a9ad8a8bc180ce213956d6d7d3fa19770">More...</a><br /></td></tr>
+<tr class="separator:a9ad8a8bc180ce213956d6d7d3fa19770"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b7b30f23f08d70e83c7b7e01945dd3c"><td class="memItemLeft" align="right" valign="top">const float *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a2b7b30f23f08d70e83c7b7e01945dd3c">value_ptr</a> () const</td></tr>
+<tr class="memdesc:a2b7b30f23f08d70e83c7b7e01945dd3c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a pointer to the raw data array used to store the matrix. This is a 1D array of 16-elements stored in column-major order. <a href="classmingfx_1_1_matrix4.html#a2b7b30f23f08d70e83c7b7e01945dd3c">More...</a><br /></td></tr>
+<tr class="separator:a2b7b30f23f08d70e83c7b7e01945dd3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd64f0db45e255d61dde4f6fa10a4127"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#acd64f0db45e255d61dde4f6fa10a4127">operator[]</a> (const int i) const</td></tr>
+<tr class="memdesc:acd64f0db45e255d61dde4f6fa10a4127"><td class="mdescLeft">&#160;</td><td class="mdescRight">Accesses the ith element of the raw data array used to store the matrix. This is a 1D array of 16-elements stored in column-major order. <a href="classmingfx_1_1_matrix4.html#acd64f0db45e255d61dde4f6fa10a4127">More...</a><br /></td></tr>
+<tr class="separator:acd64f0db45e255d61dde4f6fa10a4127"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af9b02807d81eac55d66238f246c53656"><td class="memItemLeft" align="right" valign="top">float &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#af9b02807d81eac55d66238f246c53656">operator[]</a> (const int i)</td></tr>
+<tr class="memdesc:af9b02807d81eac55d66238f246c53656"><td class="mdescLeft">&#160;</td><td class="mdescRight">Accesses the ith element of the raw data array used to store the matrix. This is a 1D array of 16-elements stored in column-major order. <a href="classmingfx_1_1_matrix4.html#af9b02807d81eac55d66238f246c53656">More...</a><br /></td></tr>
+<tr class="separator:af9b02807d81eac55d66238f246c53656"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa324d0cec02c452fb938af28725d5df9"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#aa324d0cec02c452fb938af28725d5df9">operator()</a> (const int row, const int col) const</td></tr>
+<tr class="memdesc:aa324d0cec02c452fb938af28725d5df9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Access an individual element of the array using the syntax: <a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a> mat; float row1col2 = mat(1,2);. <a href="classmingfx_1_1_matrix4.html#aa324d0cec02c452fb938af28725d5df9">More...</a><br /></td></tr>
+<tr class="separator:aa324d0cec02c452fb938af28725d5df9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a470bba77b8e3c47de7adaa18046e6096"><td class="memItemLeft" align="right" valign="top">float &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a470bba77b8e3c47de7adaa18046e6096">operator()</a> (const int row, const int col)</td></tr>
+<tr class="memdesc:a470bba77b8e3c47de7adaa18046e6096"><td class="mdescLeft">&#160;</td><td class="mdescRight">Access an individual element of the array using the syntax: <a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a> mat; mat(1,2) = 1.0;. <a href="classmingfx_1_1_matrix4.html#a470bba77b8e3c47de7adaa18046e6096">More...</a><br /></td></tr>
+<tr class="separator:a470bba77b8e3c47de7adaa18046e6096"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7396dbff36cb732e1bd878020f52bbc3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a7396dbff36cb732e1bd878020f52bbc3">ColumnToVector3</a> (int c) const</td></tr>
+<tr class="memdesc:a7396dbff36cb732e1bd878020f52bbc3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the c-th column of the matrix as a Vector type, e.g.,: <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> xAxis = mat.getColumnAsVector3(0); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> yAxis = mat.getColumnAsVector3(1); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> zAxis = mat.getColumnAsVector3(2);. <a href="classmingfx_1_1_matrix4.html#a7396dbff36cb732e1bd878020f52bbc3">More...</a><br /></td></tr>
+<tr class="separator:a7396dbff36cb732e1bd878020f52bbc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae991be2b3bca290b44e676a9f8dc13bd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#ae991be2b3bca290b44e676a9f8dc13bd">ColumnToPoint3</a> (int c) const</td></tr>
+<tr class="memdesc:ae991be2b3bca290b44e676a9f8dc13bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the c-th column of the matrix as a Vector type, e.g.,: <a class="el" href="classmingfx_1_1_point3.html" title="A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...">Point3</a> pos = mat.getColumnAsPoint3(3);. <a href="classmingfx_1_1_matrix4.html#ae991be2b3bca290b44e676a9f8dc13bd">More...</a><br /></td></tr>
+<tr class="separator:ae991be2b3bca290b44e676a9f8dc13bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e9433f0482b5e9688c12398900608db"><td class="memItemLeft" align="right" valign="top">std::vector&lt; float &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a4e9433f0482b5e9688c12398900608db">ToVector</a> () const</td></tr>
+<tr class="separator:a4e9433f0482b5e9688c12398900608db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3f360906e15730eee621826b5f0bbc5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#ab3f360906e15730eee621826b5f0bbc5">Inverse</a> () const</td></tr>
+<tr class="memdesc:ab3f360906e15730eee621826b5f0bbc5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the inverse of the 4x4 matrix if it is nonsingular. If it is singular, then returns the identity matrix. <a href="classmingfx_1_1_matrix4.html#ab3f360906e15730eee621826b5f0bbc5">More...</a><br /></td></tr>
+<tr class="separator:ab3f360906e15730eee621826b5f0bbc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ad5c85784e84fa0a941361eaaae0250"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a9ad5c85784e84fa0a941361eaaae0250">Orthonormal</a> () const</td></tr>
+<tr class="memdesc:a9ad5c85784e84fa0a941361eaaae0250"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns an orthonormal version of the matrix, i.e., guarantees that the rotational component of the matrix is built from column vectors that are all unit vectors and orthogonal to each other. <a href="classmingfx_1_1_matrix4.html#a9ad5c85784e84fa0a941361eaaae0250">More...</a><br /></td></tr>
+<tr class="separator:a9ad5c85784e84fa0a941361eaaae0250"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd1030205567d23d4a2d1240d8214850"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#afd1030205567d23d4a2d1240d8214850">Transpose</a> () const</td></tr>
+<tr class="memdesc:afd1030205567d23d4a2d1240d8214850"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the transpose of the matrix. <a href="classmingfx_1_1_matrix4.html#afd1030205567d23d4a2d1240d8214850">More...</a><br /></td></tr>
+<tr class="separator:afd1030205567d23d4a2d1240d8214850"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d9898bfac2510a695df6b033054e481"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a3d9898bfac2510a695df6b033054e481">SubDeterminant</a> (int exclude_row, int exclude_col) const</td></tr>
+<tr class="memdesc:a3d9898bfac2510a695df6b033054e481"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the determinant of the 3x3 matrix formed by excluding the specified row and column from the 4x4 matrix. <a href="classmingfx_1_1_matrix4.html#a3d9898bfac2510a695df6b033054e481">More...</a><br /></td></tr>
+<tr class="separator:a3d9898bfac2510a695df6b033054e481"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d88ba8e15325d135157d115f2412e91"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a0d88ba8e15325d135157d115f2412e91">Cofactor</a> () const</td></tr>
+<tr class="memdesc:a0d88ba8e15325d135157d115f2412e91"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the cofactor matrix. <a href="classmingfx_1_1_matrix4.html#a0d88ba8e15325d135157d115f2412e91">More...</a><br /></td></tr>
+<tr class="separator:a0d88ba8e15325d135157d115f2412e91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0127ebae92b50e4f10ebee8565b0248c"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a0127ebae92b50e4f10ebee8565b0248c">Determinant</a> () const</td></tr>
+<tr class="memdesc:a0127ebae92b50e4f10ebee8565b0248c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the determinant of the 4x4 matrix. <a href="classmingfx_1_1_matrix4.html#a0127ebae92b50e4f10ebee8565b0248c">More...</a><br /></td></tr>
+<tr class="separator:a0127ebae92b50e4f10ebee8565b0248c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:add98bfa1cf6a10dbae0e8ae8defe728b"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#add98bfa1cf6a10dbae0e8ae8defe728b">FromRowMajorElements</a> (const float r1c1, const float r1c2, const float r1c3, const float r1c4, const float r2c1, const float r2c2, const float r2c3, const float r2c4, const float r3c1, const float r3c2, const float r3c3, const float r3c4, const float r4c1, const float r4c2, const float r4c3, const float r4c4)</td></tr>
+<tr class="memdesc:add98bfa1cf6a10dbae0e8ae8defe728b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a matrix constructed from individual elements passed in row major order so that the matrix looks "correct" on the screen as you write this constructor on 4 lines of code as below. <a href="classmingfx_1_1_matrix4.html#add98bfa1cf6a10dbae0e8ae8defe728b">More...</a><br /></td></tr>
+<tr class="separator:add98bfa1cf6a10dbae0e8ae8defe728b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0232a58d20b1da5374cf8c72fb113a4e"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e">Scale</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="memdesc:a0232a58d20b1da5374cf8c72fb113a4e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the scale matrix described by the vector. <a href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e">More...</a><br /></td></tr>
+<tr class="separator:a0232a58d20b1da5374cf8c72fb113a4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae82bab81df82dc03f5eb11e74ba1dd84"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">Translation</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="memdesc:ae82bab81df82dc03f5eb11e74ba1dd84"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the translation matrix described by the vector. <a href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">More...</a><br /></td></tr>
+<tr class="separator:ae82bab81df82dc03f5eb11e74ba1dd84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a48615deb30590055c0aa9f207eee7f08"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a48615deb30590055c0aa9f207eee7f08">RotationX</a> (const float radians)</td></tr>
+<tr class="memdesc:a48615deb30590055c0aa9f207eee7f08"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the rotation matrix about the x axis by the specified angle. <a href="classmingfx_1_1_matrix4.html#a48615deb30590055c0aa9f207eee7f08">More...</a><br /></td></tr>
+<tr class="separator:a48615deb30590055c0aa9f207eee7f08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef94f0e9d298a7ba57e0119ef09b71b6"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#aef94f0e9d298a7ba57e0119ef09b71b6">RotationY</a> (const float radians)</td></tr>
+<tr class="memdesc:aef94f0e9d298a7ba57e0119ef09b71b6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the rotation matrix about the y axis by the specified angle. <a href="classmingfx_1_1_matrix4.html#aef94f0e9d298a7ba57e0119ef09b71b6">More...</a><br /></td></tr>
+<tr class="separator:aef94f0e9d298a7ba57e0119ef09b71b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4bf1dced8875fdc5827b5b8869e9de93"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a4bf1dced8875fdc5827b5b8869e9de93">RotationZ</a> (const float radians)</td></tr>
+<tr class="memdesc:a4bf1dced8875fdc5827b5b8869e9de93"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the rotation matrix about the z axis by the specified angle. <a href="classmingfx_1_1_matrix4.html#a4bf1dced8875fdc5827b5b8869e9de93">More...</a><br /></td></tr>
+<tr class="separator:a4bf1dced8875fdc5827b5b8869e9de93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acf4abaf4a45826f14b435edf80a8d0e0"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#acf4abaf4a45826f14b435edf80a8d0e0">Rotation</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v, const float a)</td></tr>
+<tr class="memdesc:acf4abaf4a45826f14b435edf80a8d0e0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the rotation matrix around the vector v placed at point p, rotate by angle a. <a href="classmingfx_1_1_matrix4.html#acf4abaf4a45826f14b435edf80a8d0e0">More...</a><br /></td></tr>
+<tr class="separator:acf4abaf4a45826f14b435edf80a8d0e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae61cdabb318a03cd4dae8a1c8ecafa4d"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d">Align</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;a_p, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;a_v1, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;a_v2, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;b_p, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;b_v1, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;b_v2)</td></tr>
+<tr class="memdesc:ae61cdabb318a03cd4dae8a1c8ecafa4d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a transformation matrix that maps a coordinate space, <em>a</em>, defined one point, <em>a_p</em>, and two vectors, <em>a_v1</em> and <em>a_v2</em>, to a new coordinate space, <em>b</em>, also defined by one point, <em>b_p</em>, and two vectors, <em>b_v1</em> and <em>b_v2</em>. The transformation will thus include both some rotation and some translation. Pseudocode example of aligning a billboard defined in the XY plane with a normal in the +Z direction and that rotates around the Y axis with a camera: <a href="classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d">More...</a><br /></td></tr>
+<tr class="separator:ae61cdabb318a03cd4dae8a1c8ecafa4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4543695a6dfc996d0312b70c2eaa00de"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">LookAt</a> (<a class="el" href="classmingfx_1_1_point3.html">Point3</a> eye, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> target, <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> up)</td></tr>
+<tr class="memdesc:a4543695a6dfc996d0312b70c2eaa00de"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a view matrix that centers the camera at the 'eye' position and orients it to look at the desired 'target' point with the top of the screen pointed as closely as possible in the direction of the 'up' vector. <a href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">More...</a><br /></td></tr>
+<tr class="separator:a4543695a6dfc996d0312b70c2eaa00de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e34aee86758a0397074590b87712c5e"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">Perspective</a> (float fov_y_in_degrees, float aspect_ratio, float near_plane_dist, float far_plane_dist)</td></tr>
+<tr class="memdesc:a0e34aee86758a0397074590b87712c5e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a perspective projection matrix equivalent to the one gluPerspective creates. <a href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">More...</a><br /></td></tr>
+<tr class="separator:a0e34aee86758a0397074590b87712c5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8e2f7b50cd2c8853e007829df9863722"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html#a8e2f7b50cd2c8853e007829df9863722">Frustum</a> (float left, float right, float bottom, float top, float near_plane_dist, float far_plane_dist)</td></tr>
+<tr class="memdesc:a8e2f7b50cd2c8853e007829df9863722"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a projection matrix equivalent the one glFrustum creates. <a href="classmingfx_1_1_matrix4.html#a8e2f7b50cd2c8853e007829df9863722">More...</a><br /></td></tr>
+<tr class="separator:a8e2f7b50cd2c8853e007829df9863722"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a50990f00b756d640670a0b02129afd22"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a50990f00b756d640670a0b02129afd22">&#9670;&nbsp;</a></span>Matrix4() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Matrix4::Matrix4 </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>The default constructor creates an identity matrix: </p>
+
+</div>
+</div>
+<a id="a09a366a3ef940ff355f8d5c521baa57d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a09a366a3ef940ff355f8d5c521baa57d">&#9670;&nbsp;</a></span>Matrix4() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Matrix4::Matrix4 </td>
+ <td>(</td>
+ <td class="paramtype">const float *&#160;</td>
+ <td class="paramname"><em>a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a matrix given from an array of 16 floats in OpenGL matrix format (i.e., column major). </p>
+
+</div>
+</div>
+<a id="a0abaeb690794c4a55e74c9b5fd82d138"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0abaeb690794c4a55e74c9b5fd82d138">&#9670;&nbsp;</a></span>Matrix4() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Matrix4::Matrix4 </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; float &gt; &amp;&#160;</td>
+ <td class="paramname"><em>a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a matrix given from a vector of 16 floats in OpenGL matrix format (i.e., column major). </p>
+
+</div>
+</div>
+<a id="a4bcf311614006c551f57d2b0dcd32d87"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4bcf311614006c551f57d2b0dcd32d87">&#9670;&nbsp;</a></span>Matrix4() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Matrix4::Matrix4 </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m2</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy constructor. </p>
+
+</div>
+</div>
+<a id="a8853a6b3fd0d08f1def5c9921bd47933"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8853a6b3fd0d08f1def5c9921bd47933">&#9670;&nbsp;</a></span>~Matrix4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::Matrix4::~Matrix4 </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Destructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="ae61cdabb318a03cd4dae8a1c8ecafa4d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae61cdabb318a03cd4dae8a1c8ecafa4d">&#9670;&nbsp;</a></span>Align()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::Align </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>a_p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>a_v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>a_v2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>b_p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>b_v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>b_v2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Creates a transformation matrix that maps a coordinate space, <em>a</em>, defined one point, <em>a_p</em>, and two vectors, <em>a_v1</em> and <em>a_v2</em>, to a new coordinate space, <em>b</em>, also defined by one point, <em>b_p</em>, and two vectors, <em>b_v1</em> and <em>b_v2</em>. The transformation will thus include both some rotation and some translation. Pseudocode example of aligning a billboard defined in the XY plane with a normal in the +Z direction and that rotates around the Y axis with a camera: </p>
+<div class="fragment"><div class="line"><span class="comment">// define a coordiante space for a canonical billboard geometry defined</span></div>
+<div class="line"><span class="comment">// right at the origin.</span></div>
+<div class="line">Point3 a_p = Point3(0,0,0); <span class="comment">// billboard&#39;s initial base position</span></div>
+<div class="line">Vector3 a_v1 = Vector3(0,1,0); <span class="comment">// billboard&#39;s initial up direction</span></div>
+<div class="line">Vector3 a_v2 = Vector3(0,0,1); <span class="comment">// billboard&#39;s initial normal direction</span></div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// define a coordinate space for where we want this billboard to go and</span></div>
+<div class="line"><span class="comment">// the direction it should be facing</span></div>
+<div class="line">Point3 b_p = desired_base_pos; <span class="comment">// new position for the billboard</span></div>
+<div class="line">Vector3 b_v1 = Vector3(0,1,0); <span class="comment">// +Y is still up, doesn&#39;t change</span></div>
+<div class="line">Vector3 b_v2 = (camera.eye() - desired_base_pos); <span class="comment">// the normal should point toward the camera</span></div>
+<div class="line">b_v2[1] = 0.0; <span class="comment">// with 0 change in Y so the billboard does not tilt</span></div>
+<div class="line">b_v2.Normalize(); <span class="comment">// convert to a unit vector</span></div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">Matrix4</a> billboard_model_matrix = <a class="code" href="classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d">Matrix4::Align</a>(a_p, a_v1, a_v2, b_p, b_v1, b_v2);</div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_ae61cdabb318a03cd4dae8a1c8ecafa4d"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d">mingfx::Matrix4::Align</a></div><div class="ttdeci">static Matrix4 Align(const Point3 &amp;a_p, const Vector3 &amp;a_v1, const Vector3 &amp;a_v2, const Point3 &amp;b_p, const Vector3 &amp;b_v1, const Vector3 &amp;b_v2)</div><div class="ttdoc">Creates a transformation matrix that maps a coordinate space, a, defined one point,...</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="a0d88ba8e15325d135157d115f2412e91"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0d88ba8e15325d135157d115f2412e91">&#9670;&nbsp;</a></span>Cofactor()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::Cofactor </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the cofactor matrix. </p>
+
+</div>
+</div>
+<a id="ae991be2b3bca290b44e676a9f8dc13bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae991be2b3bca290b44e676a9f8dc13bd">&#9670;&nbsp;</a></span>ColumnToPoint3()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::Matrix4::ColumnToPoint3 </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the c-th column of the matrix as a Vector type, e.g.,: <a class="el" href="classmingfx_1_1_point3.html" title="A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...">Point3</a> pos = mat.getColumnAsPoint3(3);. </p>
+
+</div>
+</div>
+<a id="a7396dbff36cb732e1bd878020f52bbc3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7396dbff36cb732e1bd878020f52bbc3">&#9670;&nbsp;</a></span>ColumnToVector3()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::Matrix4::ColumnToVector3 </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the c-th column of the matrix as a Vector type, e.g.,: <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> xAxis = mat.getColumnAsVector3(0); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> yAxis = mat.getColumnAsVector3(1); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> zAxis = mat.getColumnAsVector3(2);. </p>
+
+</div>
+</div>
+<a id="a0127ebae92b50e4f10ebee8565b0248c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0127ebae92b50e4f10ebee8565b0248c">&#9670;&nbsp;</a></span>Determinant()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Matrix4::Determinant </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the determinant of the 4x4 matrix. </p>
+
+</div>
+</div>
+<a id="add98bfa1cf6a10dbae0e8ae8defe728b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#add98bfa1cf6a10dbae0e8ae8defe728b">&#9670;&nbsp;</a></span>FromRowMajorElements()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::FromRowMajorElements </td>
+ <td>(</td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r1c1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r1c2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r1c3</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r1c4</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r2c1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r2c2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r2c3</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r2c4</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r3c1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r3c2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r3c3</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r3c4</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r4c1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r4c2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r4c3</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>r4c4</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns a matrix constructed from individual elements passed in row major order so that the matrix looks "correct" on the screen as you write this constructor on 4 lines of code as below. </p>
+<p>Note the that internally the matrix constructed will be stored in a 16 element column major array to be consistent with OpenGL. </p>
+
+</div>
+</div>
+<a id="a8e2f7b50cd2c8853e007829df9863722"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8e2f7b50cd2c8853e007829df9863722">&#9670;&nbsp;</a></span>Frustum()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::Frustum </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>right</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>bottom</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>top</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>near_plane_dist</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>far_plane_dist</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns a projection matrix equivalent the one glFrustum creates. </p>
+
+</div>
+</div>
+<a id="ab3f360906e15730eee621826b5f0bbc5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3f360906e15730eee621826b5f0bbc5">&#9670;&nbsp;</a></span>Inverse()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::Inverse </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the inverse of the 4x4 matrix if it is nonsingular. If it is singular, then returns the identity matrix. </p>
+
+</div>
+</div>
+<a id="a4543695a6dfc996d0312b70c2eaa00de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4543695a6dfc996d0312b70c2eaa00de">&#9670;&nbsp;</a></span>LookAt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::LookAt </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td>
+ <td class="paramname"><em>eye</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td>
+ <td class="paramname"><em>target</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td>
+ <td class="paramname"><em>up</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns a view matrix that centers the camera at the 'eye' position and orients it to look at the desired 'target' point with the top of the screen pointed as closely as possible in the direction of the 'up' vector. </p>
+
+</div>
+</div>
+<a id="ab186b0ae1ae669346c0718c2489cd71b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab186b0ae1ae669346c0718c2489cd71b">&#9670;&nbsp;</a></span>operator!=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Matrix4::operator!= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m2</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "inequality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="a470bba77b8e3c47de7adaa18046e6096"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a470bba77b8e3c47de7adaa18046e6096">&#9670;&nbsp;</a></span>operator()() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float&amp; mingfx::Matrix4::operator() </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>row</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>col</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Access an individual element of the array using the syntax: <a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a> mat; mat(1,2) = 1.0;. </p>
+
+</div>
+</div>
+<a id="aa324d0cec02c452fb938af28725d5df9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa324d0cec02c452fb938af28725d5df9">&#9670;&nbsp;</a></span>operator()() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Matrix4::operator() </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>row</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>col</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Access an individual element of the array using the syntax: <a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a> mat; float row1col2 = mat(1,2);. </p>
+
+</div>
+</div>
+<a id="a9ad8a8bc180ce213956d6d7d3fa19770"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ad8a8bc180ce213956d6d7d3fa19770">&#9670;&nbsp;</a></span>operator=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; mingfx::Matrix4::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m2</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Matrix assignment operator. </p>
+
+</div>
+</div>
+<a id="a9ec2ee167a450cd7b992384e4cc5bb73"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ec2ee167a450cd7b992384e4cc5bb73">&#9670;&nbsp;</a></span>operator==()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Matrix4::operator== </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m2</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "equality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="af9b02807d81eac55d66238f246c53656"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af9b02807d81eac55d66238f246c53656">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float&amp; mingfx::Matrix4::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Accesses the ith element of the raw data array used to store the matrix. This is a 1D array of 16-elements stored in column-major order. </p>
+
+</div>
+</div>
+<a id="acd64f0db45e255d61dde4f6fa10a4127"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd64f0db45e255d61dde4f6fa10a4127">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Matrix4::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Accesses the ith element of the raw data array used to store the matrix. This is a 1D array of 16-elements stored in column-major order. </p>
+
+</div>
+</div>
+<a id="a9ad5c85784e84fa0a941361eaaae0250"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ad5c85784e84fa0a941361eaaae0250">&#9670;&nbsp;</a></span>Orthonormal()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::Orthonormal </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns an orthonormal version of the matrix, i.e., guarantees that the rotational component of the matrix is built from column vectors that are all unit vectors and orthogonal to each other. </p>
+
+</div>
+</div>
+<a id="a0e34aee86758a0397074590b87712c5e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0e34aee86758a0397074590b87712c5e">&#9670;&nbsp;</a></span>Perspective()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::Perspective </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>fov_y_in_degrees</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>aspect_ratio</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>near_plane_dist</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>far_plane_dist</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns a perspective projection matrix equivalent to the one gluPerspective creates. </p>
+
+</div>
+</div>
+<a id="acf4abaf4a45826f14b435edf80a8d0e0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acf4abaf4a45826f14b435edf80a8d0e0">&#9670;&nbsp;</a></span>Rotation()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::Rotation </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>a</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the rotation matrix around the vector v placed at point p, rotate by angle a. </p>
+
+</div>
+</div>
+<a id="a48615deb30590055c0aa9f207eee7f08"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a48615deb30590055c0aa9f207eee7f08">&#9670;&nbsp;</a></span>RotationX()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::RotationX </td>
+ <td>(</td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>radians</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the rotation matrix about the x axis by the specified angle. </p>
+
+</div>
+</div>
+<a id="aef94f0e9d298a7ba57e0119ef09b71b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aef94f0e9d298a7ba57e0119ef09b71b6">&#9670;&nbsp;</a></span>RotationY()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::RotationY </td>
+ <td>(</td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>radians</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the rotation matrix about the y axis by the specified angle. </p>
+
+</div>
+</div>
+<a id="a4bf1dced8875fdc5827b5b8869e9de93"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4bf1dced8875fdc5827b5b8869e9de93">&#9670;&nbsp;</a></span>RotationZ()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::RotationZ </td>
+ <td>(</td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>radians</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the rotation matrix about the z axis by the specified angle. </p>
+
+</div>
+</div>
+<a id="a0232a58d20b1da5374cf8c72fb113a4e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0232a58d20b1da5374cf8c72fb113a4e">&#9670;&nbsp;</a></span>Scale()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::Scale </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the scale matrix described by the vector. </p>
+
+</div>
+</div>
+<a id="a3d9898bfac2510a695df6b033054e481"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d9898bfac2510a695df6b033054e481">&#9670;&nbsp;</a></span>SubDeterminant()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Matrix4::SubDeterminant </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>exclude_row</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>exclude_col</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the determinant of the 3x3 matrix formed by excluding the specified row and column from the 4x4 matrix. </p>
+
+</div>
+</div>
+<a id="a4e9433f0482b5e9688c12398900608db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e9433f0482b5e9688c12398900608db">&#9670;&nbsp;</a></span>ToVector()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::vector&lt;float&gt; mingfx::Matrix4::ToVector </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ae82bab81df82dc03f5eb11e74ba1dd84"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae82bab81df82dc03f5eb11e74ba1dd84">&#9670;&nbsp;</a></span>Translation()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::Translation </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the translation matrix described by the vector. </p>
+
+</div>
+</div>
+<a id="afd1030205567d23d4a2d1240d8214850"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd1030205567d23d4a2d1240d8214850">&#9670;&nbsp;</a></span>Transpose()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::Matrix4::Transpose </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the transpose of the matrix. </p>
+
+</div>
+</div>
+<a id="a2b7b30f23f08d70e83c7b7e01945dd3c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b7b30f23f08d70e83c7b7e01945dd3c">&#9670;&nbsp;</a></span>value_ptr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const float* mingfx::Matrix4::value_ptr </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a pointer to the raw data array used to store the matrix. This is a 1D array of 16-elements stored in column-major order. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="matrix4_8h_source.html">matrix4.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_mesh-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_mesh-members.html
new file mode 100644
index 0000000..614b6dc
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_mesh-members.html
@@ -0,0 +1,127 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_mesh.html">Mesh</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::Mesh Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a29eeb2e778704350789033ec4940d55a">AddTriangle</a>(Point3 v1, Point3 v2, Point3 v3)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a8d96c1b5985cd836f2aa2b2994af64c1">BuildBVH</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a978b1341d5613d399a68e40c61c57ba4">bvh_ptr</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a1a5cea9cfdf4c672ba0c781ee54718f7">CalcPerFaceNormals</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#acc7df547b0a2175287cc9f509c04e93c">CalcPerVertexNormals</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c">Draw</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a8d05faf18ef8d170fc3c2a343075823f">LoadFromOBJ</a>(const std::string &amp;filename)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9">Mesh</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a76b4977f0a7f156aa8a0027f10dcbdc1">Mesh</a>(const Mesh &amp;other)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#ab3f3779506e15e3888ccbb8b9b572b8f">num_triangles</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d">num_vertices</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#ac5fc517fd8ea4cea8459d3f4d5d6ced3">read_color_data</a>(int vertex_id) const</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a439361e454ca63c35f564aed5cd0de65">read_normal_data</a>(int vertex_id) const</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a51aaa8d6a80af46f22ea9dfecd2f0b31">read_tex_coords_data</a>(int texture_unit, int vertex_id) const</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a15d79cbc48a6ef72ef1208d734cc2f8a">read_triangle_indices_data</a>(int triangle_id) const</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#ada9371e85aa0b61df79b26fc880b1863">read_vertex_data</a>(int vertex_id) const</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f">SetColors</a>(int triangle_id, Color c1, Color c2, Color c3)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#ab9b05a77591a9adad12032d513256dae">SetColors</a>(const std::vector&lt; Color &gt; &amp;colors)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#aed172bdd77858f3b59978cb8527e19ae">SetColors</a>(float *colors_array, int num_colors)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a1f94c9ca7867b65e04f7e02813a06581">SetIndices</a>(const std::vector&lt; unsigned int &gt; index_array)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a84711746b8d37c8d9b12ae748a4c5b8c">SetIndices</a>(unsigned int *index_array, int num_indices)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a7175238f5874929e2258458b98421d87">SetInstanceTransforms</a>(const std::vector&lt; Matrix4 &gt; &amp;xforms)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903">SetNormals</a>(int triangle_id, Vector3 n1, Vector3 n2, Vector3 n3)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#ad28dbd5b0ab77bec28f30f618dd9e57d">SetNormals</a>(const std::vector&lt; Vector3 &gt; &amp;norms)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a6ab1128fab6f969564d3a1329baeade6">SetNormals</a>(float *norms_array, int num_norms)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3">SetTexCoords</a>(int triangle_id, int texture_unit, Point2 uv1, Point2 uv2, Point2 uv3)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#aba2dfd0ade2d8a728897d411ef3fdaf1">SetTexCoords</a>(int texture_unit, const std::vector&lt; Point2 &gt; &amp;tex_coords)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#ac9cd4e8d67bb70295a48fcbc72ae32f9">SetTexCoords</a>(int texture_unit, float *tex_coords_array, int num_tex_coords)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6">SetVertices</a>(const std::vector&lt; Point3 &gt; &amp;verts)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a033076b9bf1714c9b9e0eeef11ebcd49">SetVertices</a>(float *verts_array, int num_verts)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#ac74345bf4b2994de4ee1c509bcc6840e">UpdateGPUMemory</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#a3e0ac86714f6b7c3f62761ef3952a044">UpdateTriangle</a>(int triangle_id, Point3 v1, Point3 v2, Point3 v3)</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html#ace7b23730dbcb581c4886cf2b9998327">~Mesh</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_mesh.html b/dev/MinGfx/docs/html/classmingfx_1_1_mesh.html
new file mode 100644
index 0000000..785bff3
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_mesh.html
@@ -0,0 +1,1131 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::Mesh Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_mesh.html">Mesh</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_mesh-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::Mesh Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A triangle mesh data structure that can be rendered with a <a class="el" href="classmingfx_1_1_shader_program.html" title="A wrapper around GLSL shader programs.">ShaderProgram</a> like <a class="el" href="classmingfx_1_1_default_shader.html" title="A simple GLSL shader for textured per-fragment Phong shading with multiple light sources.">DefaultShader</a>. </p>
+<p>The mesh can be created algorithmically by adding triangles one at a time or it can be loaded from an .obj file.</p>
+<p>Vertices are required &ndash; you cannot have a mesh without vertices, but other attributes (normals, colors, texture coordinates) are optional. When <a class="el" href="classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c" title="This sends the mesh vertices and attributes down the graphics pipe using glDrawArrays() for the non-i...">Draw()</a> is called the mesh will automatically set these other attributes if available.</p>
+<p>Example of loading from a file: </p><div class="fragment"><div class="line"><span class="comment">// during initialization</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9">Mesh</a> m;</div>
+<div class="line">m.LoadFromOBJ(<a class="code" href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b">Platform::FindMinGfxDataFile</a>(<span class="stringliteral">&quot;teapot.obj&quot;</span>));</div>
+<div class="line"><span class="comment">// also create a shader to draw it.</span></div>
+<div class="line">DefaultShader s;</div>
+<div class="line"> </div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// later to draw</span></div>
+<div class="line">Matrix4 M;</div>
+<div class="line">Matrix4 V = <a class="code" href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">Matrix4::LookAt</a>(Point3(0,0,3), Point3(0,0,0), Vector3(0,1,0));</div>
+<div class="line">Matrix4 P = <a class="code" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">Matrix4::Perspective</a>(60.0, aspect_ratio(), 0.1, 10.0);</div>
+<div class="line">s.Draw(M, V, P, m, DefaultShader::MaterialProperties());</div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0e34aee86758a0397074590b87712c5e"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">mingfx::Matrix4::Perspective</a></div><div class="ttdeci">static Matrix4 Perspective(float fov_y_in_degrees, float aspect_ratio, float near_plane_dist, float far_plane_dist)</div><div class="ttdoc">Returns a perspective projection matrix equivalent to the one gluPerspective creates.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a4543695a6dfc996d0312b70c2eaa00de"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">mingfx::Matrix4::LookAt</a></div><div class="ttdeci">static Matrix4 LookAt(Point3 eye, Point3 target, Vector3 up)</div><div class="ttdoc">Returns a view matrix that centers the camera at the 'eye' position and orients it to look at the des...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a69613870d54989f4226e50caf4ca9fb9"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9">mingfx::Mesh::Mesh</a></div><div class="ttdeci">Mesh()</div><div class="ttdoc">Creates an empty mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_platform_html_a2c36ca57a246efa218a49a942c8c4a3b"><div class="ttname"><a href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b">mingfx::Platform::FindMinGfxDataFile</a></div><div class="ttdeci">static std::string FindMinGfxDataFile(const std::string &amp;basename)</div><div class="ttdoc">Searches for a data file that ships with MinGfx.</div></div>
+</div><!-- fragment --><p>Example of creating a mesh algorithmically: </p><div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9">Mesh</a> mesh1;</div>
+<div class="line"><span class="keywordtype">int</span> tri_id;</div>
+<div class="line"><span class="comment">// add a first triangle</span></div>
+<div class="line">tri_id = mesh1.AddTriangle(Point3(0,0,0), Point3(1,0,0), Point3(1,1,0));</div>
+<div class="line"><span class="comment">// set attributes for the vertices</span></div>
+<div class="line">mesh1.SetNormals(tri_id, Vector3(0,0,1), Vector3(0,0,1), Vector3(0,0,1));</div>
+<div class="line">mesh1.SetTexCoords(tri_id, 0, Point2(0,1), Point2(1,1), Point2(1,0));</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// add a second triangle and attributes</span></div>
+<div class="line">tri_id = mesh1.AddTriangle(Point3(0,0,0), Point3(1,1,0), Point3(0,1,0));</div>
+<div class="line">mesh1.SetNormals(tri_id, Vector3(0,0,1), Vector3(0,0,1), Vector3(0,0,1));</div>
+<div class="line">mesh1.SetTexCoords(tri_id, 0, Point2(0,1), Point2(1,0), Point2(0,0));</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// call this when done to save to the GPU</span></div>
+<div class="line">mesh1.UpdateGPUMemory();</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// then you can draw the same way as in the previous example.</span></div>
+</div><!-- fragment --><p> In the mode used above where you add one triangle at a time there is no way to reuse vertices in multiple triangles. If you need to do this for efficiency or other reasons, then you can use an indexed faces mode where you set the mesh data structures directly.</p>
+<p>Example of creating a mesh that renders in an indexed faces mode: </p><div class="fragment"><div class="line">std::vector&lt;unsigned int&gt; indices;</div>
+<div class="line">std::vector&lt;Point3&gt; vertices;</div>
+<div class="line">std::vector&lt;Vector3&gt; normals;</div>
+<div class="line">std::vector&lt;Point2&gt; texcoords;</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// four vertices, each requires 3 floats: (x,y,z)</span></div>
+<div class="line">vertices.push_back(Point3(0,0,0));</div>
+<div class="line">vertices.push_back(Point3(1,0,0));</div>
+<div class="line">vertices.push_back(Point3(1,1,0));</div>
+<div class="line">vertices.push_back(Point3(0,1,0));</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// four normals, each requires 3 floats: (x,y,z)</span></div>
+<div class="line">normals.push_back(Vector3(0,0,1));</div>
+<div class="line">normals.push_back(Vector3(0,0,1));</div>
+<div class="line">normals.push_back(Vector3(0,0,1));</div>
+<div class="line">normals.push_back(Vector3(0,0,1));</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// four texture coords, each requires 2 floats: (u,v)</span></div>
+<div class="line">texcoords.push_back(Point2(0,1));</div>
+<div class="line">texcoords.push_back(Point2(1,1));</div>
+<div class="line">texcoords.push_back(Point2(1,0));</div>
+<div class="line">texcoords.push_back(Point2(0,0));</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// indices into the arrays above for the first triangle</span></div>
+<div class="line">indices.push_back(0); </div>
+<div class="line">indices.push_back(1); </div>
+<div class="line">indices.push_back(2);</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// indices for the second triangle, note some are reused</span></div>
+<div class="line">indices.push_back(0); </div>
+<div class="line">indices.push_back(2); </div>
+<div class="line">indices.push_back(3);</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9">Mesh</a> mesh1;</div>
+<div class="line">mesh1.SetVertices(vertices);</div>
+<div class="line">mesh1.SetNormals(normals);</div>
+<div class="line">mesh1.SetTexCoords(0, texcoords);</div>
+<div class="line">mesh1.SetIndices(indices);</div>
+<div class="line">mesh1.UpdateGPUMemory();</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// then you can draw the same way as in the previous example.</span></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="mesh_8h_source.html#l00127">127</a> of file <a class="el" href="mesh_8h_source.html">mesh.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="mesh_8h_source.html">mesh.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a69613870d54989f4226e50caf4ca9fb9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9">Mesh</a> ()</td></tr>
+<tr class="memdesc:a69613870d54989f4226e50caf4ca9fb9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates an empty mesh. <a href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9">More...</a><br /></td></tr>
+<tr class="separator:a69613870d54989f4226e50caf4ca9fb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a76b4977f0a7f156aa8a0027f10dcbdc1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a76b4977f0a7f156aa8a0027f10dcbdc1">Mesh</a> (const <a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;other)</td></tr>
+<tr class="memdesc:a76b4977f0a7f156aa8a0027f10dcbdc1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copies all data and sets GPU dirty bit for the new mesh. <a href="classmingfx_1_1_mesh.html#a76b4977f0a7f156aa8a0027f10dcbdc1">More...</a><br /></td></tr>
+<tr class="separator:a76b4977f0a7f156aa8a0027f10dcbdc1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace7b23730dbcb581c4886cf2b9998327"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#ace7b23730dbcb581c4886cf2b9998327">~Mesh</a> ()</td></tr>
+<tr class="separator:ace7b23730dbcb581c4886cf2b9998327"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d05faf18ef8d170fc3c2a343075823f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a8d05faf18ef8d170fc3c2a343075823f">LoadFromOBJ</a> (const std::string &amp;filename)</td></tr>
+<tr class="memdesc:a8d05faf18ef8d170fc3c2a343075823f"><td class="mdescLeft">&#160;</td><td class="mdescRight">This reads a mesh stored in the common Wavefront Obj file format. <a href="classmingfx_1_1_mesh.html#a8d05faf18ef8d170fc3c2a343075823f">More...</a><br /></td></tr>
+<tr class="separator:a8d05faf18ef8d170fc3c2a343075823f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29eeb2e778704350789033ec4940d55a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a29eeb2e778704350789033ec4940d55a">AddTriangle</a> (<a class="el" href="classmingfx_1_1_point3.html">Point3</a> v1, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> v2, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> v3)</td></tr>
+<tr class="memdesc:a29eeb2e778704350789033ec4940d55a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a triangle to the mesh datastructure and returns a triangle ID. <a href="classmingfx_1_1_mesh.html#a29eeb2e778704350789033ec4940d55a">More...</a><br /></td></tr>
+<tr class="separator:a29eeb2e778704350789033ec4940d55a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e0ac86714f6b7c3f62761ef3952a044"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a3e0ac86714f6b7c3f62761ef3952a044">UpdateTriangle</a> (int triangle_id, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> v1, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> v2, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> v3)</td></tr>
+<tr class="memdesc:a3e0ac86714f6b7c3f62761ef3952a044"><td class="mdescLeft">&#160;</td><td class="mdescRight">Updates the vertex positions for a triangle that has already been added to the mesh. <a href="classmingfx_1_1_mesh.html#a3e0ac86714f6b7c3f62761ef3952a044">More...</a><br /></td></tr>
+<tr class="separator:a3e0ac86714f6b7c3f62761ef3952a044"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43d5a5cc3ef742a8c2b5e3f1b4da0903"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903">SetNormals</a> (int triangle_id, <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> n1, <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> n2, <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> n3)</td></tr>
+<tr class="memdesc:a43d5a5cc3ef742a8c2b5e3f1b4da0903"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the normals for the three vertices of a triangle that has already been added to the mesh. <a href="classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903">More...</a><br /></td></tr>
+<tr class="separator:a43d5a5cc3ef742a8c2b5e3f1b4da0903"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f59e19b74f4f9dc2ad580756f8b319f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f">SetColors</a> (int triangle_id, <a class="el" href="classmingfx_1_1_color.html">Color</a> c1, <a class="el" href="classmingfx_1_1_color.html">Color</a> c2, <a class="el" href="classmingfx_1_1_color.html">Color</a> c3)</td></tr>
+<tr class="memdesc:a0f59e19b74f4f9dc2ad580756f8b319f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets per-vertex colors for the three vertices of a triangle that has already been added to the mesh. <a href="classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f">More...</a><br /></td></tr>
+<tr class="separator:a0f59e19b74f4f9dc2ad580756f8b319f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a17cb896939007357014c74a1ece6f1f3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3">SetTexCoords</a> (int triangle_id, int texture_unit, <a class="el" href="classmingfx_1_1_point2.html">Point2</a> uv1, <a class="el" href="classmingfx_1_1_point2.html">Point2</a> uv2, <a class="el" href="classmingfx_1_1_point2.html">Point2</a> uv3)</td></tr>
+<tr class="memdesc:a17cb896939007357014c74a1ece6f1f3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the texture coordinates for the three vertices of a triangle that has already been added to the mesh. <a href="classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3">More...</a><br /></td></tr>
+<tr class="separator:a17cb896939007357014c74a1ece6f1f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1dd243b53826765ba468f505645102a6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6">SetVertices</a> (const std::vector&lt; <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &gt; &amp;verts)</td></tr>
+<tr class="memdesc:a1dd243b53826765ba468f505645102a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the vertex array for the mesh directly. <a href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6">More...</a><br /></td></tr>
+<tr class="separator:a1dd243b53826765ba468f505645102a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad28dbd5b0ab77bec28f30f618dd9e57d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#ad28dbd5b0ab77bec28f30f618dd9e57d">SetNormals</a> (const std::vector&lt; <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &gt; &amp;norms)</td></tr>
+<tr class="memdesc:ad28dbd5b0ab77bec28f30f618dd9e57d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the normal array for the mesh directly. <a href="classmingfx_1_1_mesh.html#ad28dbd5b0ab77bec28f30f618dd9e57d">More...</a><br /></td></tr>
+<tr class="separator:ad28dbd5b0ab77bec28f30f618dd9e57d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab9b05a77591a9adad12032d513256dae"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#ab9b05a77591a9adad12032d513256dae">SetColors</a> (const std::vector&lt; <a class="el" href="classmingfx_1_1_color.html">Color</a> &gt; &amp;colors)</td></tr>
+<tr class="memdesc:ab9b05a77591a9adad12032d513256dae"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the per-vertex colors array for the mesh directly. <a href="classmingfx_1_1_mesh.html#ab9b05a77591a9adad12032d513256dae">More...</a><br /></td></tr>
+<tr class="separator:ab9b05a77591a9adad12032d513256dae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba2dfd0ade2d8a728897d411ef3fdaf1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#aba2dfd0ade2d8a728897d411ef3fdaf1">SetTexCoords</a> (int texture_unit, const std::vector&lt; <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &gt; &amp;tex_coords)</td></tr>
+<tr class="memdesc:aba2dfd0ade2d8a728897d411ef3fdaf1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets a texture coordinates array for the mesh directly. <a href="classmingfx_1_1_mesh.html#aba2dfd0ade2d8a728897d411ef3fdaf1">More...</a><br /></td></tr>
+<tr class="separator:aba2dfd0ade2d8a728897d411ef3fdaf1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f94c9ca7867b65e04f7e02813a06581"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a1f94c9ca7867b65e04f7e02813a06581">SetIndices</a> (const std::vector&lt; unsigned int &gt; index_array)</td></tr>
+<tr class="memdesc:a1f94c9ca7867b65e04f7e02813a06581"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the indices into the vertex array to use to create the triangles. Each consecutive set of 3 indices forms one triangle: (v1,v2,v3), (v1,v2,v3), (v1,v2,v3), ... <a href="classmingfx_1_1_mesh.html#a1f94c9ca7867b65e04f7e02813a06581">More...</a><br /></td></tr>
+<tr class="separator:a1f94c9ca7867b65e04f7e02813a06581"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7175238f5874929e2258458b98421d87"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a7175238f5874929e2258458b98421d87">SetInstanceTransforms</a> (const std::vector&lt; <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &gt; &amp;xforms)</td></tr>
+<tr class="separator:a7175238f5874929e2258458b98421d87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a033076b9bf1714c9b9e0eeef11ebcd49"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a033076b9bf1714c9b9e0eeef11ebcd49">SetVertices</a> (float *verts_array, int num_verts)</td></tr>
+<tr class="memdesc:a033076b9bf1714c9b9e0eeef11ebcd49"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the vertex array for the mesh directly. Vertices are stored as (x,y,z), (x,y,z), (x,y,z), ... This version of the function accepts a C-style array rather than std::vector&lt;&gt; <a href="classmingfx_1_1_mesh.html#a033076b9bf1714c9b9e0eeef11ebcd49">More...</a><br /></td></tr>
+<tr class="separator:a033076b9bf1714c9b9e0eeef11ebcd49"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6ab1128fab6f969564d3a1329baeade6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a6ab1128fab6f969564d3a1329baeade6">SetNormals</a> (float *norms_array, int num_norms)</td></tr>
+<tr class="memdesc:a6ab1128fab6f969564d3a1329baeade6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the normal array for the mesh directly. Normals are stored as (x,y,z), (x,y,z), (x,y,z), ... following the same ordering as was used for <a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6" title="Sets the vertex array for the mesh directly.">SetVertices()</a>. This version of the function accepts a C-style array rather than std::vector&lt;&gt; <a href="classmingfx_1_1_mesh.html#a6ab1128fab6f969564d3a1329baeade6">More...</a><br /></td></tr>
+<tr class="separator:a6ab1128fab6f969564d3a1329baeade6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aed172bdd77858f3b59978cb8527e19ae"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#aed172bdd77858f3b59978cb8527e19ae">SetColors</a> (float *colors_array, int num_colors)</td></tr>
+<tr class="memdesc:aed172bdd77858f3b59978cb8527e19ae"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the per-vertex colors array for the mesh directly. Colors are stored as (r,g,b,a), (r,g,b,a), (r,g,b,a), ... following the same ordering as was used for <a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6" title="Sets the vertex array for the mesh directly.">SetVertices()</a>. This version of the function accepts a C-style array rather than std::vector&lt;&gt; <a href="classmingfx_1_1_mesh.html#aed172bdd77858f3b59978cb8527e19ae">More...</a><br /></td></tr>
+<tr class="separator:aed172bdd77858f3b59978cb8527e19ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac9cd4e8d67bb70295a48fcbc72ae32f9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#ac9cd4e8d67bb70295a48fcbc72ae32f9">SetTexCoords</a> (int texture_unit, float *tex_coords_array, int num_tex_coords)</td></tr>
+<tr class="memdesc:ac9cd4e8d67bb70295a48fcbc72ae32f9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets a texture coordinates array for the mesh directly. Tex coords are stored as (u,v), (u,v), (u,v), ... following the same ordering as was used for <a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6" title="Sets the vertex array for the mesh directly.">SetVertices()</a>. This version of the function accepts a C-style array rather than std::vector&lt;&gt; <a href="classmingfx_1_1_mesh.html#ac9cd4e8d67bb70295a48fcbc72ae32f9">More...</a><br /></td></tr>
+<tr class="separator:ac9cd4e8d67bb70295a48fcbc72ae32f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84711746b8d37c8d9b12ae748a4c5b8c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a84711746b8d37c8d9b12ae748a4c5b8c">SetIndices</a> (unsigned int *index_array, int num_indices)</td></tr>
+<tr class="memdesc:a84711746b8d37c8d9b12ae748a4c5b8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the indices into the vertex array to use to create the triangles. Each consecutive set of 3 indices forms one triangle: (v1,v2,v3), (v1,v2,v3), (v1,v2,v3), ... This version of the function accepts a C-style array rather than std::vector&lt;&gt; <a href="classmingfx_1_1_mesh.html#a84711746b8d37c8d9b12ae748a4c5b8c">More...</a><br /></td></tr>
+<tr class="separator:a84711746b8d37c8d9b12ae748a4c5b8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac74345bf4b2994de4ee1c509bcc6840e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#ac74345bf4b2994de4ee1c509bcc6840e">UpdateGPUMemory</a> ()</td></tr>
+<tr class="memdesc:ac74345bf4b2994de4ee1c509bcc6840e"><td class="mdescLeft">&#160;</td><td class="mdescRight">This copies the entire mesh data structure to a vertex array in GPU memory, which must happen before you can draw the mesh. <a href="classmingfx_1_1_mesh.html#ac74345bf4b2994de4ee1c509bcc6840e">More...</a><br /></td></tr>
+<tr class="separator:ac74345bf4b2994de4ee1c509bcc6840e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75075d472938fd760477be42585aff5c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c">Draw</a> ()</td></tr>
+<tr class="memdesc:a75075d472938fd760477be42585aff5c"><td class="mdescLeft">&#160;</td><td class="mdescRight">This sends the mesh vertices and attributes down the graphics pipe using glDrawArrays() for the non-indexed mode and glDrawElements() for the indexed mode. <a href="classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c">More...</a><br /></td></tr>
+<tr class="separator:a75075d472938fd760477be42585aff5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a5cea9cfdf4c672ba0c781ee54718f7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a1a5cea9cfdf4c672ba0c781ee54718f7">CalcPerFaceNormals</a> ()</td></tr>
+<tr class="memdesc:a1a5cea9cfdf4c672ba0c781ee54718f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">This (re)calculates the normals for the mesh and stores them with the mesh data structure. <a href="classmingfx_1_1_mesh.html#a1a5cea9cfdf4c672ba0c781ee54718f7">More...</a><br /></td></tr>
+<tr class="separator:a1a5cea9cfdf4c672ba0c781ee54718f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc7df547b0a2175287cc9f509c04e93c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#acc7df547b0a2175287cc9f509c04e93c">CalcPerVertexNormals</a> ()</td></tr>
+<tr class="memdesc:acc7df547b0a2175287cc9f509c04e93c"><td class="mdescLeft">&#160;</td><td class="mdescRight">This (re)calculates the normals for the mesh and stores them with the mesh data structure. <a href="classmingfx_1_1_mesh.html#acc7df547b0a2175287cc9f509c04e93c">More...</a><br /></td></tr>
+<tr class="separator:acc7df547b0a2175287cc9f509c04e93c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d96c1b5985cd836f2aa2b2994af64c1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a8d96c1b5985cd836f2aa2b2994af64c1">BuildBVH</a> ()</td></tr>
+<tr class="memdesc:a8d96c1b5985cd836f2aa2b2994af64c1"><td class="mdescLeft">&#160;</td><td class="mdescRight">This (re)calculates a Bounding Volume Hierarchy for the mesh, which can be used together with <a class="el" href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc" title="Checks to see if the ray intersects a triangle mesh.">Ray::FastIntersectMesh()</a> to do faster ray-mesh intersection testing. <a href="classmingfx_1_1_mesh.html#a8d96c1b5985cd836f2aa2b2994af64c1">More...</a><br /></td></tr>
+<tr class="separator:a8d96c1b5985cd836f2aa2b2994af64c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a978b1341d5613d399a68e40c61c57ba4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_b_v_h.html">BVH</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a978b1341d5613d399a68e40c61c57ba4">bvh_ptr</a> ()</td></tr>
+<tr class="memdesc:a978b1341d5613d399a68e40c61c57ba4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a pointer to the underlying <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> data structure. <a href="classmingfx_1_1_mesh.html#a978b1341d5613d399a68e40c61c57ba4">More...</a><br /></td></tr>
+<tr class="separator:a978b1341d5613d399a68e40c61c57ba4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab8f6856429466f1b4600a6ec27b84d0d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d">num_vertices</a> () const</td></tr>
+<tr class="memdesc:ab8f6856429466f1b4600a6ec27b84d0d"><td class="mdescLeft">&#160;</td><td class="mdescRight">The total number of vertices in the mesh. <a href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d">More...</a><br /></td></tr>
+<tr class="separator:ab8f6856429466f1b4600a6ec27b84d0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ada9371e85aa0b61df79b26fc880b1863"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#ada9371e85aa0b61df79b26fc880b1863">read_vertex_data</a> (int vertex_id) const</td></tr>
+<tr class="memdesc:ada9371e85aa0b61df79b26fc880b1863"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the vertex position data. Data are returned as a <a class="el" href="classmingfx_1_1_point3.html" title="A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...">Point3</a>. Indexed by vertex number. Also see <a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d" title="The total number of vertices in the mesh.">num_vertices()</a>. Use the <a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6" title="Sets the vertex array for the mesh directly.">SetVertices()</a> function to set (or edit) vertex data. <a href="classmingfx_1_1_mesh.html#ada9371e85aa0b61df79b26fc880b1863">More...</a><br /></td></tr>
+<tr class="separator:ada9371e85aa0b61df79b26fc880b1863"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a439361e454ca63c35f564aed5cd0de65"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a439361e454ca63c35f564aed5cd0de65">read_normal_data</a> (int vertex_id) const</td></tr>
+<tr class="memdesc:a439361e454ca63c35f564aed5cd0de65"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to per-vertex normal data. Data are returned as a <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a>. Indexed by vertex number. Also see <a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d" title="The total number of vertices in the mesh.">num_vertices()</a>. Use the <a class="el" href="classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903" title="Sets the normals for the three vertices of a triangle that has already been added to the mesh.">SetNormals()</a> function to set (or edit) per-vertex normal data. <a href="classmingfx_1_1_mesh.html#a439361e454ca63c35f564aed5cd0de65">More...</a><br /></td></tr>
+<tr class="separator:a439361e454ca63c35f564aed5cd0de65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac5fc517fd8ea4cea8459d3f4d5d6ced3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#ac5fc517fd8ea4cea8459d3f4d5d6ced3">read_color_data</a> (int vertex_id) const</td></tr>
+<tr class="memdesc:ac5fc517fd8ea4cea8459d3f4d5d6ced3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to per-vertex color data. Data are returned as a <a class="el" href="classmingfx_1_1_color.html" title="Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with Op...">Color</a>. Indexed by vertex number. Also see <a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d" title="The total number of vertices in the mesh.">num_vertices()</a>. Use the <a class="el" href="classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f" title="Sets per-vertex colors for the three vertices of a triangle that has already been added to the mesh.">SetColors()</a> function to set (or edit) per-vertex color data. <a href="classmingfx_1_1_mesh.html#ac5fc517fd8ea4cea8459d3f4d5d6ced3">More...</a><br /></td></tr>
+<tr class="separator:ac5fc517fd8ea4cea8459d3f4d5d6ced3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51aaa8d6a80af46f22ea9dfecd2f0b31"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point2.html">Point2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a51aaa8d6a80af46f22ea9dfecd2f0b31">read_tex_coords_data</a> (int texture_unit, int vertex_id) const</td></tr>
+<tr class="memdesc:a51aaa8d6a80af46f22ea9dfecd2f0b31"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to per-vertex texture coordinates data. Data are returned as a <a class="el" href="classmingfx_1_1_point2.html" title="A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...">Point2</a>. Indexed by vertex number. Also see <a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d" title="The total number of vertices in the mesh.">num_vertices()</a>. Use the <a class="el" href="classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3" title="Sets the texture coordinates for the three vertices of a triangle that has already been added to the ...">SetTexCoords()</a> function to set (or edit) per-vertex tex coords. <a href="classmingfx_1_1_mesh.html#a51aaa8d6a80af46f22ea9dfecd2f0b31">More...</a><br /></td></tr>
+<tr class="separator:a51aaa8d6a80af46f22ea9dfecd2f0b31"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3f3779506e15e3888ccbb8b9b572b8f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#ab3f3779506e15e3888ccbb8b9b572b8f">num_triangles</a> () const</td></tr>
+<tr class="memdesc:ab3f3779506e15e3888ccbb8b9b572b8f"><td class="mdescLeft">&#160;</td><td class="mdescRight">The total number of triangles in the mesh. <a href="classmingfx_1_1_mesh.html#ab3f3779506e15e3888ccbb8b9b572b8f">More...</a><br /></td></tr>
+<tr class="separator:ab3f3779506e15e3888ccbb8b9b572b8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15d79cbc48a6ef72ef1208d734cc2f8a"><td class="memItemLeft" align="right" valign="top">std::vector&lt; unsigned int &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html#a15d79cbc48a6ef72ef1208d734cc2f8a">read_triangle_indices_data</a> (int triangle_id) const</td></tr>
+<tr class="memdesc:a15d79cbc48a6ef72ef1208d734cc2f8a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the indices that make up a particular triangle. Data are returned as a 3-element array. <a href="classmingfx_1_1_mesh.html#a15d79cbc48a6ef72ef1208d734cc2f8a">More...</a><br /></td></tr>
+<tr class="separator:a15d79cbc48a6ef72ef1208d734cc2f8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a69613870d54989f4226e50caf4ca9fb9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a69613870d54989f4226e50caf4ca9fb9">&#9670;&nbsp;</a></span>Mesh() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Mesh::Mesh </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates an empty mesh. </p>
+
+</div>
+</div>
+<a id="a76b4977f0a7f156aa8a0027f10dcbdc1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a76b4977f0a7f156aa8a0027f10dcbdc1">&#9670;&nbsp;</a></span>Mesh() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Mesh::Mesh </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;&#160;</td>
+ <td class="paramname"><em>other</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copies all data and sets GPU dirty bit for the new mesh. </p>
+
+</div>
+</div>
+<a id="ace7b23730dbcb581c4886cf2b9998327"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ace7b23730dbcb581c4886cf2b9998327">&#9670;&nbsp;</a></span>~Mesh()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::Mesh::~Mesh </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a29eeb2e778704350789033ec4940d55a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a29eeb2e778704350789033ec4940d55a">&#9670;&nbsp;</a></span>AddTriangle()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int mingfx::Mesh::AddTriangle </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td>
+ <td class="paramname"><em>v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td>
+ <td class="paramname"><em>v2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td>
+ <td class="paramname"><em>v3</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Adds a triangle to the mesh datastructure and returns a triangle ID. </p>
+<p>The ID should then be used as the first argument for follow-on calls to <a class="el" href="classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903" title="Sets the normals for the three vertices of a triangle that has already been added to the mesh.">SetNormals()</a>, <a class="el" href="classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f" title="Sets per-vertex colors for the three vertices of a triangle that has already been added to the mesh.">SetColors()</a>, and <a class="el" href="classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3" title="Sets the texture coordinates for the three vertices of a triangle that has already been added to the ...">SetTexCoords()</a>. The vertices must be specified in counter-clockwise order so that the normal of the triangle can be determined following the right-hand rule. </p>
+
+</div>
+</div>
+<a id="a8d96c1b5985cd836f2aa2b2994af64c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8d96c1b5985cd836f2aa2b2994af64c1">&#9670;&nbsp;</a></span>BuildBVH()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::BuildBVH </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This (re)calculates a Bounding Volume Hierarchy for the mesh, which can be used together with <a class="el" href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc" title="Checks to see if the ray intersects a triangle mesh.">Ray::FastIntersectMesh()</a> to do faster ray-mesh intersection testing. </p>
+
+</div>
+</div>
+<a id="a978b1341d5613d399a68e40c61c57ba4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a978b1341d5613d399a68e40c61c57ba4">&#9670;&nbsp;</a></span>bvh_ptr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_b_v_h.html">BVH</a>* mingfx::Mesh::bvh_ptr </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a pointer to the underlying <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> data structure. </p>
+<p>If the data struture has not yet been build or needs to be updated due to a change in the geometry of the mesh, then the <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> is recalculated before returning the pointer. </p>
+
+</div>
+</div>
+<a id="a1a5cea9cfdf4c672ba0c781ee54718f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1a5cea9cfdf4c672ba0c781ee54718f7">&#9670;&nbsp;</a></span>CalcPerFaceNormals()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::CalcPerFaceNormals </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This (re)calculates the normals for the mesh and stores them with the mesh data structure. </p>
+<p>It assumes a faceted mesh, like a cube, where each triangle has separate vertices. The normal is calculated for each triangle face and then the result is associated with each vertex that makes up the triangle. If you have a smooth mesh where vertices are shared between multiple faces then use <a class="el" href="classmingfx_1_1_mesh.html#acc7df547b0a2175287cc9f509c04e93c" title="This (re)calculates the normals for the mesh and stores them with the mesh data structure.">CalcPerVertexNormals()</a> instead. </p>
+
+</div>
+</div>
+<a id="acc7df547b0a2175287cc9f509c04e93c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acc7df547b0a2175287cc9f509c04e93c">&#9670;&nbsp;</a></span>CalcPerVertexNormals()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::CalcPerVertexNormals </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This (re)calculates the normals for the mesh and stores them with the mesh data structure. </p>
+<p>It assumes a smooth mesh, like a sphere, where each vertex belongs to one or more triangles. Each vertex normal is calculated as a weighted sum of the face normals for adjacent faces. The weighting is based upon the relative areas of the neighboring faces (i.e., a large neighboring triangle contributes more to the vertex normal than a small one). </p>
+
+</div>
+</div>
+<a id="a75075d472938fd760477be42585aff5c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a75075d472938fd760477be42585aff5c">&#9670;&nbsp;</a></span>Draw()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::Draw </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This sends the mesh vertices and attributes down the graphics pipe using glDrawArrays() for the non-indexed mode and glDrawElements() for the indexed mode. </p>
+<p>This is just the geometry &ndash; for anything to show up on the screen, you must already have a <a class="el" href="classmingfx_1_1_shader_program.html" title="A wrapper around GLSL shader programs.">ShaderProgram</a> enabled before calling this function. </p>
+
+</div>
+</div>
+<a id="a8d05faf18ef8d170fc3c2a343075823f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8d05faf18ef8d170fc3c2a343075823f">&#9670;&nbsp;</a></span>LoadFromOBJ()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::LoadFromOBJ </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>filename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This reads a mesh stored in the common Wavefront Obj file format. </p>
+<p>The loader here is simplistic and not guaranteed to work on all valid .obj files, but it should work on many simple ones. <a class="el" href="classmingfx_1_1_mesh.html#ac74345bf4b2994de4ee1c509bcc6840e" title="This copies the entire mesh data structure to a vertex array in GPU memory, which must happen before ...">UpdateGPUMemory()</a> is called automatically after the model is loaded. </p>
+
+</div>
+</div>
+<a id="ab3f3779506e15e3888ccbb8b9b572b8f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3f3779506e15e3888ccbb8b9b572b8f">&#9670;&nbsp;</a></span>num_triangles()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int mingfx::Mesh::num_triangles </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>The total number of triangles in the mesh. </p>
+
+</div>
+</div>
+<a id="ab8f6856429466f1b4600a6ec27b84d0d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab8f6856429466f1b4600a6ec27b84d0d">&#9670;&nbsp;</a></span>num_vertices()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int mingfx::Mesh::num_vertices </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>The total number of vertices in the mesh. </p>
+
+</div>
+</div>
+<a id="ac5fc517fd8ea4cea8459d3f4d5d6ced3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac5fc517fd8ea4cea8459d3f4d5d6ced3">&#9670;&nbsp;</a></span>read_color_data()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_color.html">Color</a> mingfx::Mesh::read_color_data </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>vertex_id</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read only access to per-vertex color data. Data are returned as a <a class="el" href="classmingfx_1_1_color.html" title="Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with Op...">Color</a>. Indexed by vertex number. Also see <a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d" title="The total number of vertices in the mesh.">num_vertices()</a>. Use the <a class="el" href="classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f" title="Sets per-vertex colors for the three vertices of a triangle that has already been added to the mesh.">SetColors()</a> function to set (or edit) per-vertex color data. </p>
+
+</div>
+</div>
+<a id="a439361e454ca63c35f564aed5cd0de65"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a439361e454ca63c35f564aed5cd0de65">&#9670;&nbsp;</a></span>read_normal_data()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::Mesh::read_normal_data </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>vertex_id</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read only access to per-vertex normal data. Data are returned as a <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a>. Indexed by vertex number. Also see <a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d" title="The total number of vertices in the mesh.">num_vertices()</a>. Use the <a class="el" href="classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903" title="Sets the normals for the three vertices of a triangle that has already been added to the mesh.">SetNormals()</a> function to set (or edit) per-vertex normal data. </p>
+
+</div>
+</div>
+<a id="a51aaa8d6a80af46f22ea9dfecd2f0b31"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51aaa8d6a80af46f22ea9dfecd2f0b31">&#9670;&nbsp;</a></span>read_tex_coords_data()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point2.html">Point2</a> mingfx::Mesh::read_tex_coords_data </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>texture_unit</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>vertex_id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read only access to per-vertex texture coordinates data. Data are returned as a <a class="el" href="classmingfx_1_1_point2.html" title="A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...">Point2</a>. Indexed by vertex number. Also see <a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d" title="The total number of vertices in the mesh.">num_vertices()</a>. Use the <a class="el" href="classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3" title="Sets the texture coordinates for the three vertices of a triangle that has already been added to the ...">SetTexCoords()</a> function to set (or edit) per-vertex tex coords. </p>
+
+</div>
+</div>
+<a id="a15d79cbc48a6ef72ef1208d734cc2f8a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a15d79cbc48a6ef72ef1208d734cc2f8a">&#9670;&nbsp;</a></span>read_triangle_indices_data()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::vector&lt;unsigned int&gt; mingfx::Mesh::read_triangle_indices_data </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>triangle_id</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read only access to the indices that make up a particular triangle. Data are returned as a 3-element array. </p>
+
+</div>
+</div>
+<a id="ada9371e85aa0b61df79b26fc880b1863"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ada9371e85aa0b61df79b26fc880b1863">&#9670;&nbsp;</a></span>read_vertex_data()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::Mesh::read_vertex_data </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>vertex_id</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read only access to the vertex position data. Data are returned as a <a class="el" href="classmingfx_1_1_point3.html" title="A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...">Point3</a>. Indexed by vertex number. Also see <a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d" title="The total number of vertices in the mesh.">num_vertices()</a>. Use the <a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6" title="Sets the vertex array for the mesh directly.">SetVertices()</a> function to set (or edit) vertex data. </p>
+
+</div>
+</div>
+<a id="ab9b05a77591a9adad12032d513256dae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab9b05a77591a9adad12032d513256dae">&#9670;&nbsp;</a></span>SetColors() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetColors </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="classmingfx_1_1_color.html">Color</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>colors</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the per-vertex colors array for the mesh directly. </p>
+
+</div>
+</div>
+<a id="aed172bdd77858f3b59978cb8527e19ae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aed172bdd77858f3b59978cb8527e19ae">&#9670;&nbsp;</a></span>SetColors() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetColors </td>
+ <td>(</td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>colors_array</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>num_colors</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the per-vertex colors array for the mesh directly. Colors are stored as (r,g,b,a), (r,g,b,a), (r,g,b,a), ... following the same ordering as was used for <a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6" title="Sets the vertex array for the mesh directly.">SetVertices()</a>. This version of the function accepts a C-style array rather than std::vector&lt;&gt; </p>
+
+</div>
+</div>
+<a id="a0f59e19b74f4f9dc2ad580756f8b319f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0f59e19b74f4f9dc2ad580756f8b319f">&#9670;&nbsp;</a></span>SetColors() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetColors </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>triangle_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td>
+ <td class="paramname"><em>c1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td>
+ <td class="paramname"><em>c2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td>
+ <td class="paramname"><em>c3</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets per-vertex colors for the three vertices of a triangle that has already been added to the mesh. </p>
+
+</div>
+</div>
+<a id="a1f94c9ca7867b65e04f7e02813a06581"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1f94c9ca7867b65e04f7e02813a06581">&#9670;&nbsp;</a></span>SetIndices() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetIndices </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; unsigned int &gt;&#160;</td>
+ <td class="paramname"><em>index_array</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the indices into the vertex array to use to create the triangles. Each consecutive set of 3 indices forms one triangle: (v1,v2,v3), (v1,v2,v3), (v1,v2,v3), ... </p>
+
+</div>
+</div>
+<a id="a84711746b8d37c8d9b12ae748a4c5b8c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84711746b8d37c8d9b12ae748a4c5b8c">&#9670;&nbsp;</a></span>SetIndices() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetIndices </td>
+ <td>(</td>
+ <td class="paramtype">unsigned int *&#160;</td>
+ <td class="paramname"><em>index_array</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>num_indices</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the indices into the vertex array to use to create the triangles. Each consecutive set of 3 indices forms one triangle: (v1,v2,v3), (v1,v2,v3), (v1,v2,v3), ... This version of the function accepts a C-style array rather than std::vector&lt;&gt; </p>
+
+</div>
+</div>
+<a id="a7175238f5874929e2258458b98421d87"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7175238f5874929e2258458b98421d87">&#9670;&nbsp;</a></span>SetInstanceTransforms()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetInstanceTransforms </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>xforms</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ad28dbd5b0ab77bec28f30f618dd9e57d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad28dbd5b0ab77bec28f30f618dd9e57d">&#9670;&nbsp;</a></span>SetNormals() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetNormals </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>norms</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the normal array for the mesh directly. </p>
+
+</div>
+</div>
+<a id="a6ab1128fab6f969564d3a1329baeade6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6ab1128fab6f969564d3a1329baeade6">&#9670;&nbsp;</a></span>SetNormals() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetNormals </td>
+ <td>(</td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>norms_array</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>num_norms</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the normal array for the mesh directly. Normals are stored as (x,y,z), (x,y,z), (x,y,z), ... following the same ordering as was used for <a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6" title="Sets the vertex array for the mesh directly.">SetVertices()</a>. This version of the function accepts a C-style array rather than std::vector&lt;&gt; </p>
+
+</div>
+</div>
+<a id="a43d5a5cc3ef742a8c2b5e3f1b4da0903"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a43d5a5cc3ef742a8c2b5e3f1b4da0903">&#9670;&nbsp;</a></span>SetNormals() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetNormals </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>triangle_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td>
+ <td class="paramname"><em>n1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td>
+ <td class="paramname"><em>n2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td>
+ <td class="paramname"><em>n3</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the normals for the three vertices of a triangle that has already been added to the mesh. </p>
+
+</div>
+</div>
+<a id="aba2dfd0ade2d8a728897d411ef3fdaf1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba2dfd0ade2d8a728897d411ef3fdaf1">&#9670;&nbsp;</a></span>SetTexCoords() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetTexCoords </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>texture_unit</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>tex_coords</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets a texture coordinates array for the mesh directly. </p>
+
+</div>
+</div>
+<a id="ac9cd4e8d67bb70295a48fcbc72ae32f9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac9cd4e8d67bb70295a48fcbc72ae32f9">&#9670;&nbsp;</a></span>SetTexCoords() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetTexCoords </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>texture_unit</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>tex_coords_array</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>num_tex_coords</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets a texture coordinates array for the mesh directly. Tex coords are stored as (u,v), (u,v), (u,v), ... following the same ordering as was used for <a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6" title="Sets the vertex array for the mesh directly.">SetVertices()</a>. This version of the function accepts a C-style array rather than std::vector&lt;&gt; </p>
+
+</div>
+</div>
+<a id="a17cb896939007357014c74a1ece6f1f3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a17cb896939007357014c74a1ece6f1f3">&#9670;&nbsp;</a></span>SetTexCoords() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetTexCoords </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>triangle_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>texture_unit</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point2.html">Point2</a>&#160;</td>
+ <td class="paramname"><em>uv1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point2.html">Point2</a>&#160;</td>
+ <td class="paramname"><em>uv2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point2.html">Point2</a>&#160;</td>
+ <td class="paramname"><em>uv3</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the texture coordinates for the three vertices of a triangle that has already been added to the mesh. </p>
+<p>The first textureUnit is 0, and you should always use 0 for this parameter unless you are doing multi-texturing. </p>
+
+</div>
+</div>
+<a id="a1dd243b53826765ba468f505645102a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1dd243b53826765ba468f505645102a6">&#9670;&nbsp;</a></span>SetVertices() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetVertices </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>verts</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the vertex array for the mesh directly. </p>
+
+</div>
+</div>
+<a id="a033076b9bf1714c9b9e0eeef11ebcd49"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a033076b9bf1714c9b9e0eeef11ebcd49">&#9670;&nbsp;</a></span>SetVertices() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::SetVertices </td>
+ <td>(</td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>verts_array</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>num_verts</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets the vertex array for the mesh directly. Vertices are stored as (x,y,z), (x,y,z), (x,y,z), ... This version of the function accepts a C-style array rather than std::vector&lt;&gt; </p>
+
+</div>
+</div>
+<a id="ac74345bf4b2994de4ee1c509bcc6840e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac74345bf4b2994de4ee1c509bcc6840e">&#9670;&nbsp;</a></span>UpdateGPUMemory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::UpdateGPUMemory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This copies the entire mesh data structure to a vertex array in GPU memory, which must happen before you can draw the mesh. </p>
+<p>For large meshes, this can take some time, so you may want to call this during initialization immediately after generating the mesh. If you do not, it will be called automatically for you the first time <a class="el" href="classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c" title="This sends the mesh vertices and attributes down the graphics pipe using glDrawArrays() for the non-i...">Draw()</a> is called. If the mesh contains normals, per- vertex colors and/or texture coordinates these are added as attributes within the vertex array. </p>
+
+</div>
+</div>
+<a id="a3e0ac86714f6b7c3f62761ef3952a044"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3e0ac86714f6b7c3f62761ef3952a044">&#9670;&nbsp;</a></span>UpdateTriangle()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Mesh::UpdateTriangle </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>triangle_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td>
+ <td class="paramname"><em>v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td>
+ <td class="paramname"><em>v2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td>
+ <td class="paramname"><em>v3</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Updates the vertex positions for a triangle that has already been added to the mesh. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="mesh_8h_source.html">mesh.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_platform-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_platform-members.html
new file mode 100644
index 0000000..8f34046
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_platform-members.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_platform.html">Platform</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::Platform Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_platform.html">mingfx::Platform</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_platform.html#a045007efda73123a7f4019837d83bc92">FileExists</a>(const std::string &amp;filename)</td><td class="entry"><a class="el" href="classmingfx_1_1_platform.html">mingfx::Platform</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1">FindFile</a>(const std::string &amp;basename, const std::vector&lt; std::string &gt; &amp;searchpath)</td><td class="entry"><a class="el" href="classmingfx_1_1_platform.html">mingfx::Platform</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_platform.html#a03ade910313dd9580c9e37a7b63f87b2">FindFile</a>(const std::string &amp;basename, const std::string &amp;searchpath)</td><td class="entry"><a class="el" href="classmingfx_1_1_platform.html">mingfx::Platform</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b">FindMinGfxDataFile</a>(const std::string &amp;basename)</td><td class="entry"><a class="el" href="classmingfx_1_1_platform.html">mingfx::Platform</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_platform.html#af12cd63e1ede33529d8c282d7d916169">FindMinGfxShaderFile</a>(const std::string &amp;basename)</td><td class="entry"><a class="el" href="classmingfx_1_1_platform.html">mingfx::Platform</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_platform.html b/dev/MinGfx/docs/html/classmingfx_1_1_platform.html
new file mode 100644
index 0000000..924da10
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_platform.html
@@ -0,0 +1,289 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::Platform Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_platform.html">Platform</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_platform-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::Platform Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Provides access to the underlying file system and other platform-specific routines. </p>
+
+<p class="definition">Definition at line <a class="el" href="platform_8h_source.html#l00026">26</a> of file <a class="el" href="platform_8h_source.html">platform.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="platform_8h_source.html">platform.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:a045007efda73123a7f4019837d83bc92"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_platform.html#a045007efda73123a7f4019837d83bc92">FileExists</a> (const std::string &amp;filename)</td></tr>
+<tr class="memdesc:a045007efda73123a7f4019837d83bc92"><td class="mdescLeft">&#160;</td><td class="mdescRight">True if filename is found and can be opened for reading on the system. <a href="classmingfx_1_1_platform.html#a045007efda73123a7f4019837d83bc92">More...</a><br /></td></tr>
+<tr class="separator:a045007efda73123a7f4019837d83bc92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32a392f4bac832c95fabc2d10bd03ad1"><td class="memItemLeft" align="right" valign="top">static std::string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1">FindFile</a> (const std::string &amp;basename, const std::vector&lt; std::string &gt; &amp;searchpath)</td></tr>
+<tr class="separator:a32a392f4bac832c95fabc2d10bd03ad1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03ade910313dd9580c9e37a7b63f87b2"><td class="memItemLeft" align="right" valign="top">static std::string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_platform.html#a03ade910313dd9580c9e37a7b63f87b2">FindFile</a> (const std::string &amp;basename, const std::string &amp;searchpath)</td></tr>
+<tr class="separator:a03ade910313dd9580c9e37a7b63f87b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c36ca57a246efa218a49a942c8c4a3b"><td class="memItemLeft" align="right" valign="top">static std::string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b">FindMinGfxDataFile</a> (const std::string &amp;basename)</td></tr>
+<tr class="memdesc:a2c36ca57a246efa218a49a942c8c4a3b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Searches for a data file that ships with MinGfx. <a href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b">More...</a><br /></td></tr>
+<tr class="separator:a2c36ca57a246efa218a49a942c8c4a3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af12cd63e1ede33529d8c282d7d916169"><td class="memItemLeft" align="right" valign="top">static std::string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_platform.html#af12cd63e1ede33529d8c282d7d916169">FindMinGfxShaderFile</a> (const std::string &amp;basename)</td></tr>
+<tr class="memdesc:af12cd63e1ede33529d8c282d7d916169"><td class="mdescLeft">&#160;</td><td class="mdescRight">Searches for a shader file that ships with MinGfx. <a href="classmingfx_1_1_platform.html#af12cd63e1ede33529d8c282d7d916169">More...</a><br /></td></tr>
+<tr class="separator:af12cd63e1ede33529d8c282d7d916169"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a045007efda73123a7f4019837d83bc92"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a045007efda73123a7f4019837d83bc92">&#9670;&nbsp;</a></span>FileExists()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static bool mingfx::Platform::FileExists </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>filename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>True if filename is found and can be opened for reading on the system. </p>
+
+</div>
+</div>
+<a id="a03ade910313dd9580c9e37a7b63f87b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a03ade910313dd9580c9e37a7b63f87b2">&#9670;&nbsp;</a></span>FindFile() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static std::string mingfx::Platform::FindFile </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>basename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>searchpath</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a32a392f4bac832c95fabc2d10bd03ad1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32a392f4bac832c95fabc2d10bd03ad1">&#9670;&nbsp;</a></span>FindFile() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static std::string mingfx::Platform::FindFile </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>basename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::vector&lt; std::string &gt; &amp;&#160;</td>
+ <td class="paramname"><em>searchpath</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a2c36ca57a246efa218a49a942c8c4a3b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c36ca57a246efa218a49a942c8c4a3b">&#9670;&nbsp;</a></span>FindMinGfxDataFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static std::string mingfx::Platform::FindMinGfxDataFile </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>basename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Searches for a data file that ships with MinGfx. </p>
+<p>This will look in the following locations in order:</p><ol type="1">
+<li>the current working directory.</li>
+<li>a subdirectory called data within the current working directory.</li>
+<li>the installed data directory INSTALL_PREFIX/share/MinGfx-1.0/data.</li>
+<li>the data directory in the MinGfx build tree. If the file is found, the full path is returned, else basename is returned. </li>
+</ol>
+
+</div>
+</div>
+<a id="af12cd63e1ede33529d8c282d7d916169"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af12cd63e1ede33529d8c282d7d916169">&#9670;&nbsp;</a></span>FindMinGfxShaderFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static std::string mingfx::Platform::FindMinGfxShaderFile </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>basename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Searches for a shader file that ships with MinGfx. </p>
+<p>This will look in the following locations in order:</p><ol type="1">
+<li>the current working directory.</li>
+<li>a subdirectory called shaders within the current working directory.</li>
+<li>the installed shaders directory INSTALL_PREFIX/share/MinGfx-1.0/shaders.</li>
+<li>the shaders directory in the MinGfx build tree. If the file is found, the full path is returned, else basename is returned. </li>
+</ol>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="platform_8h_source.html">platform.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_point2-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_point2-members.html
new file mode 100644
index 0000000..12e0b99
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_point2-members.html
@@ -0,0 +1,113 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_point2.html">Point2</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::Point2 Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a900567ad5e3c0e6de217b52167c49fd6">Lerp</a>(const Point2 &amp;b, float alpha) const</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a680648ae01c549c48f7a3d5d75d8791e">Lerp</a>(const Point2 &amp;a, const Point2 &amp;b, float alpha)</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a38149d8797bf7406fc34cab0ea5a3ac8">One</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a5b99fcf93a0c6d2b247290f5564f8a84">operator!=</a>(const Point2 &amp;p) const</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#afc68153cce7dc528e95cf5ad81c63902">operator=</a>(const Point2 &amp;p)</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#ae8729260293b993bbf3cb31c0a33edfa">operator==</a>(const Point2 &amp;p) const</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#af4c0cc334dfbfe8e8068156e6da16542">operator[]</a>(const int i) const</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a50f09df619fd226e6dc3ccff452abab3">operator[]</a>(const int i)</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a24d7a5121fceba01b46f3ba0f6525630">Origin</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1">Point2</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a716fcff21456f29561ec27118a646483">Point2</a>(float x, float y)</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a4ba487a2038ebc78b461b66f1987053f">Point2</a>(float *p)</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a97464af92444984e275dca38a3f4eef0">Point2</a>(const Point2 &amp;p)</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a027b2412f1c36242ccb06cf37c7e29bc">value_ptr</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#ab00e35eccdc4b7deae8172f5954a86e8">w</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa">x</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8">y</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a60a2b348deab631b51caca3eb715461f">Zero</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point2.html#a7e5b2dcd7e079bdd00354e7ccf9c5c2a">~Point2</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_point2.html b/dev/MinGfx/docs/html/classmingfx_1_1_point2.html
new file mode 100644
index 0000000..4d53aa7
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_point2.html
@@ -0,0 +1,650 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::Point2 Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_point2.html">Point2</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_point2-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::Point2 Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A 2D Point with floating point coordinates, used for storing 2D texture coordinates, screen-space graphics, and mouse input. </p>
+
+<p class="definition">Definition at line <a class="el" href="point2_8h_source.html#l00028">28</a> of file <a class="el" href="point2_8h_source.html">point2.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="point2_8h_source.html">point2.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a2e5869d810b52be4ba43c8a4f4e117a1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1">Point2</a> ()</td></tr>
+<tr class="memdesc:a2e5869d810b52be4ba43c8a4f4e117a1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default point at the origin. <a href="classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1">More...</a><br /></td></tr>
+<tr class="separator:a2e5869d810b52be4ba43c8a4f4e117a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a716fcff21456f29561ec27118a646483"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a716fcff21456f29561ec27118a646483">Point2</a> (float <a class="el" href="classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa">x</a>, float <a class="el" href="classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8">y</a>)</td></tr>
+<tr class="memdesc:a716fcff21456f29561ec27118a646483"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a point given (x,y,1), where the 1 comes from the use of homogeneous coordinates in computer graphics. <a href="classmingfx_1_1_point2.html#a716fcff21456f29561ec27118a646483">More...</a><br /></td></tr>
+<tr class="separator:a716fcff21456f29561ec27118a646483"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ba487a2038ebc78b461b66f1987053f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a4ba487a2038ebc78b461b66f1987053f">Point2</a> (float *p)</td></tr>
+<tr class="memdesc:a4ba487a2038ebc78b461b66f1987053f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a point given a pointer to x,y data. <a href="classmingfx_1_1_point2.html#a4ba487a2038ebc78b461b66f1987053f">More...</a><br /></td></tr>
+<tr class="separator:a4ba487a2038ebc78b461b66f1987053f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97464af92444984e275dca38a3f4eef0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a97464af92444984e275dca38a3f4eef0">Point2</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p)</td></tr>
+<tr class="memdesc:a97464af92444984e275dca38a3f4eef0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy constructor for point. <a href="classmingfx_1_1_point2.html#a97464af92444984e275dca38a3f4eef0">More...</a><br /></td></tr>
+<tr class="separator:a97464af92444984e275dca38a3f4eef0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e5b2dcd7e079bdd00354e7ccf9c5c2a"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a7e5b2dcd7e079bdd00354e7ccf9c5c2a">~Point2</a> ()</td></tr>
+<tr class="memdesc:a7e5b2dcd7e079bdd00354e7ccf9c5c2a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Point destructor. <a href="classmingfx_1_1_point2.html#a7e5b2dcd7e079bdd00354e7ccf9c5c2a">More...</a><br /></td></tr>
+<tr class="separator:a7e5b2dcd7e079bdd00354e7ccf9c5c2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8729260293b993bbf3cb31c0a33edfa"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#ae8729260293b993bbf3cb31c0a33edfa">operator==</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p) const</td></tr>
+<tr class="memdesc:ae8729260293b993bbf3cb31c0a33edfa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "equality", taking floating point imprecision into account. <a href="classmingfx_1_1_point2.html#ae8729260293b993bbf3cb31c0a33edfa">More...</a><br /></td></tr>
+<tr class="separator:ae8729260293b993bbf3cb31c0a33edfa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b99fcf93a0c6d2b247290f5564f8a84"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a5b99fcf93a0c6d2b247290f5564f8a84">operator!=</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p) const</td></tr>
+<tr class="memdesc:a5b99fcf93a0c6d2b247290f5564f8a84"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "inequality", taking floating point imprecision into account. <a href="classmingfx_1_1_point2.html#a5b99fcf93a0c6d2b247290f5564f8a84">More...</a><br /></td></tr>
+<tr class="separator:a5b99fcf93a0c6d2b247290f5564f8a84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc68153cce7dc528e95cf5ad81c63902"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#afc68153cce7dc528e95cf5ad81c63902">operator=</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p)</td></tr>
+<tr class="memdesc:afc68153cce7dc528e95cf5ad81c63902"><td class="mdescLeft">&#160;</td><td class="mdescRight">Assignment operator. <a href="classmingfx_1_1_point2.html#afc68153cce7dc528e95cf5ad81c63902">More...</a><br /></td></tr>
+<tr class="separator:afc68153cce7dc528e95cf5ad81c63902"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af4c0cc334dfbfe8e8068156e6da16542"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#af4c0cc334dfbfe8e8068156e6da16542">operator[]</a> (const int i) const</td></tr>
+<tr class="memdesc:af4c0cc334dfbfe8e8068156e6da16542"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the ith coordinate of the point. <a href="classmingfx_1_1_point2.html#af4c0cc334dfbfe8e8068156e6da16542">More...</a><br /></td></tr>
+<tr class="separator:af4c0cc334dfbfe8e8068156e6da16542"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a50f09df619fd226e6dc3ccff452abab3"><td class="memItemLeft" align="right" valign="top">float &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a50f09df619fd226e6dc3ccff452abab3">operator[]</a> (const int i)</td></tr>
+<tr class="memdesc:a50f09df619fd226e6dc3ccff452abab3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a reference to the ith coordinate of the point. Use this accessor if you wish to set the coordinate rather than just request its value. Example: <a href="classmingfx_1_1_point2.html#a50f09df619fd226e6dc3ccff452abab3">More...</a><br /></td></tr>
+<tr class="separator:a50f09df619fd226e6dc3ccff452abab3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a92447f64ca82f67e855da0c42db12ffa"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa">x</a> () const</td></tr>
+<tr class="memdesc:a92447f64ca82f67e855da0c42db12ffa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the x coordinate. Can also use my_point[0]. Use the my_point[0] = 1.0; form if you need to set the value. <a href="classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa">More...</a><br /></td></tr>
+<tr class="separator:a92447f64ca82f67e855da0c42db12ffa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4f97a7a75276a147ac06fc4dec810ec8"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8">y</a> () const</td></tr>
+<tr class="memdesc:a4f97a7a75276a147ac06fc4dec810ec8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the y coordinate. Can also use my_point[1]. Use the my_point[1] = 1.0; form if you need to set the value. <a href="classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8">More...</a><br /></td></tr>
+<tr class="separator:a4f97a7a75276a147ac06fc4dec810ec8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab00e35eccdc4b7deae8172f5954a86e8"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#ab00e35eccdc4b7deae8172f5954a86e8">w</a> () const</td></tr>
+<tr class="memdesc:ab00e35eccdc4b7deae8172f5954a86e8"><td class="mdescLeft">&#160;</td><td class="mdescRight">In homogeneous coordinates, the w coordinate for all points is 1.0. <a href="classmingfx_1_1_point2.html#ab00e35eccdc4b7deae8172f5954a86e8">More...</a><br /></td></tr>
+<tr class="separator:ab00e35eccdc4b7deae8172f5954a86e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a027b2412f1c36242ccb06cf37c7e29bc"><td class="memItemLeft" align="right" valign="top">const float *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a027b2412f1c36242ccb06cf37c7e29bc">value_ptr</a> () const</td></tr>
+<tr class="memdesc:a027b2412f1c36242ccb06cf37c7e29bc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a const pointer to the raw data array. <a href="classmingfx_1_1_point2.html#a027b2412f1c36242ccb06cf37c7e29bc">More...</a><br /></td></tr>
+<tr class="separator:a027b2412f1c36242ccb06cf37c7e29bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a900567ad5e3c0e6de217b52167c49fd6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point2.html">Point2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a900567ad5e3c0e6de217b52167c49fd6">Lerp</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;b, float alpha) const</td></tr>
+<tr class="memdesc:a900567ad5e3c0e6de217b52167c49fd6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Linear interpolation between this point and another. Alpha=0.0 returns this point, and alpha=1.0 returns the other point, other values blend between the two. <a href="classmingfx_1_1_point2.html#a900567ad5e3c0e6de217b52167c49fd6">More...</a><br /></td></tr>
+<tr class="separator:a900567ad5e3c0e6de217b52167c49fd6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:a24d7a5121fceba01b46f3ba0f6525630"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a24d7a5121fceba01b46f3ba0f6525630">Origin</a> ()</td></tr>
+<tr class="memdesc:a24d7a5121fceba01b46f3ba0f6525630"><td class="mdescLeft">&#160;</td><td class="mdescRight">(0,0) - a shortcut for a special point that is frequently needed <a href="classmingfx_1_1_point2.html#a24d7a5121fceba01b46f3ba0f6525630">More...</a><br /></td></tr>
+<tr class="separator:a24d7a5121fceba01b46f3ba0f6525630"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60a2b348deab631b51caca3eb715461f"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a60a2b348deab631b51caca3eb715461f">Zero</a> ()</td></tr>
+<tr class="memdesc:a60a2b348deab631b51caca3eb715461f"><td class="mdescLeft">&#160;</td><td class="mdescRight">(0,0) - a shortcut for a special point that is frequently needed <a href="classmingfx_1_1_point2.html#a60a2b348deab631b51caca3eb715461f">More...</a><br /></td></tr>
+<tr class="separator:a60a2b348deab631b51caca3eb715461f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38149d8797bf7406fc34cab0ea5a3ac8"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a38149d8797bf7406fc34cab0ea5a3ac8">One</a> ()</td></tr>
+<tr class="memdesc:a38149d8797bf7406fc34cab0ea5a3ac8"><td class="mdescLeft">&#160;</td><td class="mdescRight">(1,1) - a shortcut for a special point that is frequently needed <a href="classmingfx_1_1_point2.html#a38149d8797bf7406fc34cab0ea5a3ac8">More...</a><br /></td></tr>
+<tr class="separator:a38149d8797bf7406fc34cab0ea5a3ac8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a680648ae01c549c48f7a3d5d75d8791e"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_point2.html">Point2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html#a680648ae01c549c48f7a3d5d75d8791e">Lerp</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;a, const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;b, float alpha)</td></tr>
+<tr class="memdesc:a680648ae01c549c48f7a3d5d75d8791e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Linear interpolation between two points. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b', other values blend between the two. <a href="classmingfx_1_1_point2.html#a680648ae01c549c48f7a3d5d75d8791e">More...</a><br /></td></tr>
+<tr class="separator:a680648ae01c549c48f7a3d5d75d8791e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a2e5869d810b52be4ba43c8a4f4e117a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2e5869d810b52be4ba43c8a4f4e117a1">&#9670;&nbsp;</a></span>Point2() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Point2::Point2 </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Default point at the origin. </p>
+
+</div>
+</div>
+<a id="a716fcff21456f29561ec27118a646483"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a716fcff21456f29561ec27118a646483">&#9670;&nbsp;</a></span>Point2() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Point2::Point2 </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>y</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a point given (x,y,1), where the 1 comes from the use of homogeneous coordinates in computer graphics. </p>
+
+</div>
+</div>
+<a id="a4ba487a2038ebc78b461b66f1987053f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ba487a2038ebc78b461b66f1987053f">&#9670;&nbsp;</a></span>Point2() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Point2::Point2 </td>
+ <td>(</td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a point given a pointer to x,y data. </p>
+
+</div>
+</div>
+<a id="a97464af92444984e275dca38a3f4eef0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97464af92444984e275dca38a3f4eef0">&#9670;&nbsp;</a></span>Point2() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Point2::Point2 </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy constructor for point. </p>
+
+</div>
+</div>
+<a id="a7e5b2dcd7e079bdd00354e7ccf9c5c2a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e5b2dcd7e079bdd00354e7ccf9c5c2a">&#9670;&nbsp;</a></span>~Point2()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::Point2::~Point2 </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Point destructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a680648ae01c549c48f7a3d5d75d8791e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a680648ae01c549c48f7a3d5d75d8791e">&#9670;&nbsp;</a></span>Lerp() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_point2.html">Point2</a> mingfx::Point2::Lerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Linear interpolation between two points. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b', other values blend between the two. </p>
+
+</div>
+</div>
+<a id="a900567ad5e3c0e6de217b52167c49fd6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a900567ad5e3c0e6de217b52167c49fd6">&#9670;&nbsp;</a></span>Lerp() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point2.html">Point2</a> mingfx::Point2::Lerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Linear interpolation between this point and another. Alpha=0.0 returns this point, and alpha=1.0 returns the other point, other values blend between the two. </p>
+
+</div>
+</div>
+<a id="a38149d8797bf7406fc34cab0ea5a3ac8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a38149d8797bf7406fc34cab0ea5a3ac8">&#9670;&nbsp;</a></span>One()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_point2.html">Point2</a>&amp; mingfx::Point2::One </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(1,1) - a shortcut for a special point that is frequently needed </p>
+
+</div>
+</div>
+<a id="a5b99fcf93a0c6d2b247290f5564f8a84"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5b99fcf93a0c6d2b247290f5564f8a84">&#9670;&nbsp;</a></span>operator!=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Point2::operator!= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "inequality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="afc68153cce7dc528e95cf5ad81c63902"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc68153cce7dc528e95cf5ad81c63902">&#9670;&nbsp;</a></span>operator=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point2.html">Point2</a>&amp; mingfx::Point2::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Assignment operator. </p>
+
+</div>
+</div>
+<a id="ae8729260293b993bbf3cb31c0a33edfa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae8729260293b993bbf3cb31c0a33edfa">&#9670;&nbsp;</a></span>operator==()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Point2::operator== </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "equality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="a50f09df619fd226e6dc3ccff452abab3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a50f09df619fd226e6dc3ccff452abab3">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float&amp; mingfx::Point2::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a reference to the ith coordinate of the point. Use this accessor if you wish to set the coordinate rather than just request its value. Example: </p>
+<div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1">Point2</a> a;</div>
+<div class="line">a[0] = 5.0; <span class="comment">// set the x-coordinate of the point</span></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a2e5869d810b52be4ba43c8a4f4e117a1"><div class="ttname"><a href="classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1">mingfx::Point2::Point2</a></div><div class="ttdeci">Point2()</div><div class="ttdoc">Default point at the origin.</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="af4c0cc334dfbfe8e8068156e6da16542"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af4c0cc334dfbfe8e8068156e6da16542">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Point2::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read only access to the ith coordinate of the point. </p>
+
+</div>
+</div>
+<a id="a24d7a5121fceba01b46f3ba0f6525630"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a24d7a5121fceba01b46f3ba0f6525630">&#9670;&nbsp;</a></span>Origin()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_point2.html">Point2</a>&amp; mingfx::Point2::Origin </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(0,0) - a shortcut for a special point that is frequently needed </p>
+
+</div>
+</div>
+<a id="a027b2412f1c36242ccb06cf37c7e29bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a027b2412f1c36242ccb06cf37c7e29bc">&#9670;&nbsp;</a></span>value_ptr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const float* mingfx::Point2::value_ptr </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a const pointer to the raw data array. </p>
+
+</div>
+</div>
+<a id="ab00e35eccdc4b7deae8172f5954a86e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab00e35eccdc4b7deae8172f5954a86e8">&#9670;&nbsp;</a></span>w()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Point2::w </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>In homogeneous coordinates, the w coordinate for all points is 1.0. </p>
+
+<p class="definition">Definition at line <a class="el" href="point2_8h_source.html#l00076">76</a> of file <a class="el" href="point2_8h_source.html">point2.h</a>.</p>
+
+</div>
+</div>
+<a id="a92447f64ca82f67e855da0c42db12ffa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a92447f64ca82f67e855da0c42db12ffa">&#9670;&nbsp;</a></span>x()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Point2::x </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the x coordinate. Can also use my_point[0]. Use the my_point[0] = 1.0; form if you need to set the value. </p>
+
+<p class="definition">Definition at line <a class="el" href="point2_8h_source.html#l00069">69</a> of file <a class="el" href="point2_8h_source.html">point2.h</a>.</p>
+
+</div>
+</div>
+<a id="a4f97a7a75276a147ac06fc4dec810ec8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4f97a7a75276a147ac06fc4dec810ec8">&#9670;&nbsp;</a></span>y()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Point2::y </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the y coordinate. Can also use my_point[1]. Use the my_point[1] = 1.0; form if you need to set the value. </p>
+
+<p class="definition">Definition at line <a class="el" href="point2_8h_source.html#l00073">73</a> of file <a class="el" href="point2_8h_source.html">point2.h</a>.</p>
+
+</div>
+</div>
+<a id="a60a2b348deab631b51caca3eb715461f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a60a2b348deab631b51caca3eb715461f">&#9670;&nbsp;</a></span>Zero()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_point2.html">Point2</a>&amp; mingfx::Point2::Zero </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(0,0) - a shortcut for a special point that is frequently needed </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="point2_8h_source.html">point2.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_point3-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_point3-members.html
new file mode 100644
index 0000000..4aa7e82
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_point3-members.html
@@ -0,0 +1,117 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_point3.html">Point3</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::Point3 Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a9dd5396f53b7006ec4cb63abffd90a7c">ClosestPoint</a>(const std::vector&lt; Point3 &gt; &amp;point_list)</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#ae31d5f91a03fabdf72b2fa54e177b743">ClosestPointOnPlane</a>(const Point3 &amp;plane_origin, const Vector3 &amp;plane_normal)</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#af554773b2d7f4492a0727e8e42efe002">DistanceToPlane</a>(const Point3 &amp;plane_origin, const Vector3 &amp;plane_normal)</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a228a1f3754b8ee82b9bb148ce183fc5b">Lerp</a>(const Point3 &amp;b, float alpha) const</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a206691c31872e537eefbf897603dba74">Lerp</a>(const Point3 &amp;a, const Point3 &amp;b, float alpha)</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a2cfcbefe652720779e0d7beff1c86ece">One</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#acccf9d3fca27174c18ada3b33209c71e">operator!=</a>(const Point3 &amp;p) const</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a8e54b18bfaa39f4b7048b85c9ca43c3d">operator=</a>(const Point3 &amp;p)</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#ab22d5cc4631f26274ada550c90d39699">operator==</a>(const Point3 &amp;p) const</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a3a586db5b58d5f1fdaddb1e33e84d566">operator[]</a>(const int i) const</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a790468d68b6d957b22959f9078f85c3e">operator[]</a>(const int i)</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#aecb7c3137356cd4470851c54a47c7930">Origin</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">Point3</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a29d113f0fa37fa04a642817c680fe953">Point3</a>(float x, float y, float z)</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a062caf579ef643b25129cc35b3dbe756">Point3</a>(float *p)</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a23534a1ce3d4466c303b9205bd21cd97">Point3</a>(const Point3 &amp;p)</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#af0557bdc07452cf335e2b7e04fc0aa3c">value_ptr</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#abbf85b5749b37869f4c1b98443ebbd9e">w</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5">x</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545">y</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6">z</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#a9983b62979f9ac5a11efea08d9d283ed">Zero</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_point3.html#aa55aef76986cc7424c2a535d6fd1ab7a">~Point3</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_point3.html b/dev/MinGfx/docs/html/classmingfx_1_1_point3.html
new file mode 100644
index 0000000..2166d0e
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_point3.html
@@ -0,0 +1,795 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::Point3 Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_point3.html">Point3</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_point3-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::Point3 Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graphics operations. </p>
+<p>Point3s can be transformed by a <a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a>. Example: </p><div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">Point3</a> a(0,0,1);</div>
+<div class="line">std::cout &lt;&lt; a &lt;&lt; std::endl;</div>
+<div class="line"> </div>
+<div class="line">Matrix4 M = <a class="code" href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">Matrix4::Translation</a>(Vector3(0,0,-1));</div>
+<div class="line"><a class="code" href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">Point3</a> b = M * a;</div>
+<div class="line">std::cout &lt;&lt; b &lt;&lt; std::endl;</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// you can access the individual components of the point in two ways:</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">Point3</a> p(1,2,3);</div>
+<div class="line"><span class="keywordtype">float</span> option1 = p.x();</div>
+<div class="line"><span class="keywordtype">float</span> option2 = p[0];</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// to set an individual component of the point use the [] operator:</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">Point3</a> p2;</div>
+<div class="line">p2[0] = 0.4;</div>
+<div class="line">p2[1] = 1.2;</div>
+<div class="line">p2[2] = 3.1;</div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_ae82bab81df82dc03f5eb11e74ba1dd84"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">mingfx::Matrix4::Translation</a></div><div class="ttdeci">static Matrix4 Translation(const Vector3 &amp;v)</div><div class="ttdoc">Returns the translation matrix described by the vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_ae8ab322852c24c6e03bed03cac443664"><div class="ttname"><a href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">mingfx::Point3::Point3</a></div><div class="ttdeci">Point3()</div><div class="ttdoc">Default point at the origin.</div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="point3_8h_source.html#l00052">52</a> of file <a class="el" href="point3_8h_source.html">point3.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="point3_8h_source.html">point3.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ae8ab322852c24c6e03bed03cac443664"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">Point3</a> ()</td></tr>
+<tr class="memdesc:ae8ab322852c24c6e03bed03cac443664"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default point at the origin. <a href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">More...</a><br /></td></tr>
+<tr class="separator:ae8ab322852c24c6e03bed03cac443664"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29d113f0fa37fa04a642817c680fe953"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a29d113f0fa37fa04a642817c680fe953">Point3</a> (float <a class="el" href="classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5">x</a>, float <a class="el" href="classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545">y</a>, float <a class="el" href="classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6">z</a>)</td></tr>
+<tr class="memdesc:a29d113f0fa37fa04a642817c680fe953"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a point given (x,y,z,1), where the 1 comes from the use of homogeneous coordinates in computer graphics. <a href="classmingfx_1_1_point3.html#a29d113f0fa37fa04a642817c680fe953">More...</a><br /></td></tr>
+<tr class="separator:a29d113f0fa37fa04a642817c680fe953"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a062caf579ef643b25129cc35b3dbe756"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a062caf579ef643b25129cc35b3dbe756">Point3</a> (float *p)</td></tr>
+<tr class="memdesc:a062caf579ef643b25129cc35b3dbe756"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a point given a pointer to x,y,z data. <a href="classmingfx_1_1_point3.html#a062caf579ef643b25129cc35b3dbe756">More...</a><br /></td></tr>
+<tr class="separator:a062caf579ef643b25129cc35b3dbe756"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a23534a1ce3d4466c303b9205bd21cd97"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a23534a1ce3d4466c303b9205bd21cd97">Point3</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p)</td></tr>
+<tr class="memdesc:a23534a1ce3d4466c303b9205bd21cd97"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy constructor for point. <a href="classmingfx_1_1_point3.html#a23534a1ce3d4466c303b9205bd21cd97">More...</a><br /></td></tr>
+<tr class="separator:a23534a1ce3d4466c303b9205bd21cd97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa55aef76986cc7424c2a535d6fd1ab7a"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#aa55aef76986cc7424c2a535d6fd1ab7a">~Point3</a> ()</td></tr>
+<tr class="memdesc:aa55aef76986cc7424c2a535d6fd1ab7a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Point destructor. <a href="classmingfx_1_1_point3.html#aa55aef76986cc7424c2a535d6fd1ab7a">More...</a><br /></td></tr>
+<tr class="separator:aa55aef76986cc7424c2a535d6fd1ab7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab22d5cc4631f26274ada550c90d39699"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#ab22d5cc4631f26274ada550c90d39699">operator==</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p) const</td></tr>
+<tr class="memdesc:ab22d5cc4631f26274ada550c90d39699"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "equality", taking floating point imprecision into account. <a href="classmingfx_1_1_point3.html#ab22d5cc4631f26274ada550c90d39699">More...</a><br /></td></tr>
+<tr class="separator:ab22d5cc4631f26274ada550c90d39699"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acccf9d3fca27174c18ada3b33209c71e"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#acccf9d3fca27174c18ada3b33209c71e">operator!=</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p) const</td></tr>
+<tr class="memdesc:acccf9d3fca27174c18ada3b33209c71e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "inequality", taking floating point imprecision into account. <a href="classmingfx_1_1_point3.html#acccf9d3fca27174c18ada3b33209c71e">More...</a><br /></td></tr>
+<tr class="separator:acccf9d3fca27174c18ada3b33209c71e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8e54b18bfaa39f4b7048b85c9ca43c3d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a8e54b18bfaa39f4b7048b85c9ca43c3d">operator=</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p)</td></tr>
+<tr class="memdesc:a8e54b18bfaa39f4b7048b85c9ca43c3d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Assignment operator. <a href="classmingfx_1_1_point3.html#a8e54b18bfaa39f4b7048b85c9ca43c3d">More...</a><br /></td></tr>
+<tr class="separator:a8e54b18bfaa39f4b7048b85c9ca43c3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a586db5b58d5f1fdaddb1e33e84d566"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a3a586db5b58d5f1fdaddb1e33e84d566">operator[]</a> (const int i) const</td></tr>
+<tr class="memdesc:a3a586db5b58d5f1fdaddb1e33e84d566"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the ith coordinate of the point. <a href="classmingfx_1_1_point3.html#a3a586db5b58d5f1fdaddb1e33e84d566">More...</a><br /></td></tr>
+<tr class="separator:a3a586db5b58d5f1fdaddb1e33e84d566"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a790468d68b6d957b22959f9078f85c3e"><td class="memItemLeft" align="right" valign="top">float &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a790468d68b6d957b22959f9078f85c3e">operator[]</a> (const int i)</td></tr>
+<tr class="memdesc:a790468d68b6d957b22959f9078f85c3e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a reference to the ith coordinate of the point. Use this accessor if you wish to set the coordinate rather than just request its value. Example: <a href="classmingfx_1_1_point3.html#a790468d68b6d957b22959f9078f85c3e">More...</a><br /></td></tr>
+<tr class="separator:a790468d68b6d957b22959f9078f85c3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac409e3213620b80c868245c1f6a6eea5"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5">x</a> () const</td></tr>
+<tr class="memdesc:ac409e3213620b80c868245c1f6a6eea5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the x coordinate. Can also use my_point[0]. Use the my_point[0] = 1.0; form if you need to set the value. <a href="classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5">More...</a><br /></td></tr>
+<tr class="separator:ac409e3213620b80c868245c1f6a6eea5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0757315cd84f91879021d7afe18e0545"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545">y</a> () const</td></tr>
+<tr class="memdesc:a0757315cd84f91879021d7afe18e0545"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the y coordinate. Can also use my_point[1]. Use the my_point[1] = 1.0; form if you need to set the value. <a href="classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545">More...</a><br /></td></tr>
+<tr class="separator:a0757315cd84f91879021d7afe18e0545"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac463e3a3ec3edd02c86505ea6400d8e6"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6">z</a> () const</td></tr>
+<tr class="memdesc:ac463e3a3ec3edd02c86505ea6400d8e6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the z coordinate. Can also use my_point[2]. Use the my_point[2] = 1.0; form if you need to set the value. <a href="classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6">More...</a><br /></td></tr>
+<tr class="separator:ac463e3a3ec3edd02c86505ea6400d8e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abbf85b5749b37869f4c1b98443ebbd9e"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#abbf85b5749b37869f4c1b98443ebbd9e">w</a> () const</td></tr>
+<tr class="memdesc:abbf85b5749b37869f4c1b98443ebbd9e"><td class="mdescLeft">&#160;</td><td class="mdescRight">In homogeneous coordinates, the w coordinate for all points is 1.0. <a href="classmingfx_1_1_point3.html#abbf85b5749b37869f4c1b98443ebbd9e">More...</a><br /></td></tr>
+<tr class="separator:abbf85b5749b37869f4c1b98443ebbd9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0557bdc07452cf335e2b7e04fc0aa3c"><td class="memItemLeft" align="right" valign="top">const float *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#af0557bdc07452cf335e2b7e04fc0aa3c">value_ptr</a> () const</td></tr>
+<tr class="memdesc:af0557bdc07452cf335e2b7e04fc0aa3c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a const pointer to the raw data array. <a href="classmingfx_1_1_point3.html#af0557bdc07452cf335e2b7e04fc0aa3c">More...</a><br /></td></tr>
+<tr class="separator:af0557bdc07452cf335e2b7e04fc0aa3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a228a1f3754b8ee82b9bb148ce183fc5b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a228a1f3754b8ee82b9bb148ce183fc5b">Lerp</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;b, float alpha) const</td></tr>
+<tr class="memdesc:a228a1f3754b8ee82b9bb148ce183fc5b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Linear interpolation between this point and another. Alpha=0.0 returns this point, and alpha=1.0 returns the other point, other values blend between the two. <a href="classmingfx_1_1_point3.html#a228a1f3754b8ee82b9bb148ce183fc5b">More...</a><br /></td></tr>
+<tr class="separator:a228a1f3754b8ee82b9bb148ce183fc5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af554773b2d7f4492a0727e8e42efe002"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#af554773b2d7f4492a0727e8e42efe002">DistanceToPlane</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;plane_origin, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;plane_normal)</td></tr>
+<tr class="memdesc:af554773b2d7f4492a0727e8e42efe002"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the shortest (i.e., perpendicular) distance from this point to a plane defined by a point and a normal. <a href="classmingfx_1_1_point3.html#af554773b2d7f4492a0727e8e42efe002">More...</a><br /></td></tr>
+<tr class="separator:af554773b2d7f4492a0727e8e42efe002"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae31d5f91a03fabdf72b2fa54e177b743"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#ae31d5f91a03fabdf72b2fa54e177b743">ClosestPointOnPlane</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;plane_origin, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;plane_normal)</td></tr>
+<tr class="memdesc:ae31d5f91a03fabdf72b2fa54e177b743"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the perpendicular projection of this point onto a plane defined by a point and a normal. <a href="classmingfx_1_1_point3.html#ae31d5f91a03fabdf72b2fa54e177b743">More...</a><br /></td></tr>
+<tr class="separator:ae31d5f91a03fabdf72b2fa54e177b743"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9dd5396f53b7006ec4cb63abffd90a7c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a9dd5396f53b7006ec4cb63abffd90a7c">ClosestPoint</a> (const std::vector&lt; <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &gt; &amp;point_list)</td></tr>
+<tr class="memdesc:a9dd5396f53b7006ec4cb63abffd90a7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Given a list of points, returns the closest in the last to the current point. <a href="classmingfx_1_1_point3.html#a9dd5396f53b7006ec4cb63abffd90a7c">More...</a><br /></td></tr>
+<tr class="separator:a9dd5396f53b7006ec4cb63abffd90a7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:aecb7c3137356cd4470851c54a47c7930"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#aecb7c3137356cd4470851c54a47c7930">Origin</a> ()</td></tr>
+<tr class="memdesc:aecb7c3137356cd4470851c54a47c7930"><td class="mdescLeft">&#160;</td><td class="mdescRight">(0,0,0) - a shortcut for a special point that is frequently needed <a href="classmingfx_1_1_point3.html#aecb7c3137356cd4470851c54a47c7930">More...</a><br /></td></tr>
+<tr class="separator:aecb7c3137356cd4470851c54a47c7930"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9983b62979f9ac5a11efea08d9d283ed"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a9983b62979f9ac5a11efea08d9d283ed">Zero</a> ()</td></tr>
+<tr class="memdesc:a9983b62979f9ac5a11efea08d9d283ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">(0,0,0) - a shortcut for a special point that is frequently needed <a href="classmingfx_1_1_point3.html#a9983b62979f9ac5a11efea08d9d283ed">More...</a><br /></td></tr>
+<tr class="separator:a9983b62979f9ac5a11efea08d9d283ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2cfcbefe652720779e0d7beff1c86ece"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a2cfcbefe652720779e0d7beff1c86ece">One</a> ()</td></tr>
+<tr class="memdesc:a2cfcbefe652720779e0d7beff1c86ece"><td class="mdescLeft">&#160;</td><td class="mdescRight">(1,1,1) - a shortcut for a special point that is frequently needed <a href="classmingfx_1_1_point3.html#a2cfcbefe652720779e0d7beff1c86ece">More...</a><br /></td></tr>
+<tr class="separator:a2cfcbefe652720779e0d7beff1c86ece"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a206691c31872e537eefbf897603dba74"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html#a206691c31872e537eefbf897603dba74">Lerp</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;a, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;b, float alpha)</td></tr>
+<tr class="memdesc:a206691c31872e537eefbf897603dba74"><td class="mdescLeft">&#160;</td><td class="mdescRight">Linear interpolation between two points. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b', other values blend between the two. <a href="classmingfx_1_1_point3.html#a206691c31872e537eefbf897603dba74">More...</a><br /></td></tr>
+<tr class="separator:a206691c31872e537eefbf897603dba74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="ae8ab322852c24c6e03bed03cac443664"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae8ab322852c24c6e03bed03cac443664">&#9670;&nbsp;</a></span>Point3() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Point3::Point3 </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Default point at the origin. </p>
+
+</div>
+</div>
+<a id="a29d113f0fa37fa04a642817c680fe953"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a29d113f0fa37fa04a642817c680fe953">&#9670;&nbsp;</a></span>Point3() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Point3::Point3 </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>z</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a point given (x,y,z,1), where the 1 comes from the use of homogeneous coordinates in computer graphics. </p>
+
+</div>
+</div>
+<a id="a062caf579ef643b25129cc35b3dbe756"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a062caf579ef643b25129cc35b3dbe756">&#9670;&nbsp;</a></span>Point3() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Point3::Point3 </td>
+ <td>(</td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a point given a pointer to x,y,z data. </p>
+
+</div>
+</div>
+<a id="a23534a1ce3d4466c303b9205bd21cd97"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a23534a1ce3d4466c303b9205bd21cd97">&#9670;&nbsp;</a></span>Point3() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Point3::Point3 </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy constructor for point. </p>
+
+</div>
+</div>
+<a id="aa55aef76986cc7424c2a535d6fd1ab7a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa55aef76986cc7424c2a535d6fd1ab7a">&#9670;&nbsp;</a></span>~Point3()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::Point3::~Point3 </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Point destructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a9dd5396f53b7006ec4cb63abffd90a7c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9dd5396f53b7006ec4cb63abffd90a7c">&#9670;&nbsp;</a></span>ClosestPoint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::Point3::ClosestPoint </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>point_list</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Given a list of points, returns the closest in the last to the current point. </p>
+
+</div>
+</div>
+<a id="ae31d5f91a03fabdf72b2fa54e177b743"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae31d5f91a03fabdf72b2fa54e177b743">&#9670;&nbsp;</a></span>ClosestPointOnPlane()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::Point3::ClosestPointOnPlane </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>plane_origin</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>plane_normal</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the perpendicular projection of this point onto a plane defined by a point and a normal. </p>
+
+</div>
+</div>
+<a id="af554773b2d7f4492a0727e8e42efe002"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af554773b2d7f4492a0727e8e42efe002">&#9670;&nbsp;</a></span>DistanceToPlane()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Point3::DistanceToPlane </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>plane_origin</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>plane_normal</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the shortest (i.e., perpendicular) distance from this point to a plane defined by a point and a normal. </p>
+
+</div>
+</div>
+<a id="a206691c31872e537eefbf897603dba74"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a206691c31872e537eefbf897603dba74">&#9670;&nbsp;</a></span>Lerp() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::Point3::Lerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Linear interpolation between two points. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b', other values blend between the two. </p>
+
+</div>
+</div>
+<a id="a228a1f3754b8ee82b9bb148ce183fc5b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a228a1f3754b8ee82b9bb148ce183fc5b">&#9670;&nbsp;</a></span>Lerp() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::Point3::Lerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Linear interpolation between this point and another. Alpha=0.0 returns this point, and alpha=1.0 returns the other point, other values blend between the two. </p>
+
+</div>
+</div>
+<a id="a2cfcbefe652720779e0d7beff1c86ece"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2cfcbefe652720779e0d7beff1c86ece">&#9670;&nbsp;</a></span>One()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_point3.html">Point3</a>&amp; mingfx::Point3::One </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(1,1,1) - a shortcut for a special point that is frequently needed </p>
+
+</div>
+</div>
+<a id="acccf9d3fca27174c18ada3b33209c71e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acccf9d3fca27174c18ada3b33209c71e">&#9670;&nbsp;</a></span>operator!=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Point3::operator!= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "inequality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="a8e54b18bfaa39f4b7048b85c9ca43c3d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8e54b18bfaa39f4b7048b85c9ca43c3d">&#9670;&nbsp;</a></span>operator=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&amp; mingfx::Point3::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Assignment operator. </p>
+
+</div>
+</div>
+<a id="ab22d5cc4631f26274ada550c90d39699"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab22d5cc4631f26274ada550c90d39699">&#9670;&nbsp;</a></span>operator==()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Point3::operator== </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "equality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="a790468d68b6d957b22959f9078f85c3e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a790468d68b6d957b22959f9078f85c3e">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float&amp; mingfx::Point3::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a reference to the ith coordinate of the point. Use this accessor if you wish to set the coordinate rather than just request its value. Example: </p>
+<div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">Point3</a> a;</div>
+<div class="line">a[0] = 5.0; <span class="comment">// set the x-coordinate of the point</span></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="a3a586db5b58d5f1fdaddb1e33e84d566"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3a586db5b58d5f1fdaddb1e33e84d566">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Point3::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read only access to the ith coordinate of the point. </p>
+
+</div>
+</div>
+<a id="aecb7c3137356cd4470851c54a47c7930"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aecb7c3137356cd4470851c54a47c7930">&#9670;&nbsp;</a></span>Origin()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_point3.html">Point3</a>&amp; mingfx::Point3::Origin </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(0,0,0) - a shortcut for a special point that is frequently needed </p>
+
+</div>
+</div>
+<a id="af0557bdc07452cf335e2b7e04fc0aa3c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af0557bdc07452cf335e2b7e04fc0aa3c">&#9670;&nbsp;</a></span>value_ptr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const float* mingfx::Point3::value_ptr </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a const pointer to the raw data array. </p>
+
+</div>
+</div>
+<a id="abbf85b5749b37869f4c1b98443ebbd9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abbf85b5749b37869f4c1b98443ebbd9e">&#9670;&nbsp;</a></span>w()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Point3::w </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>In homogeneous coordinates, the w coordinate for all points is 1.0. </p>
+
+<p class="definition">Definition at line <a class="el" href="point3_8h_source.html#l00104">104</a> of file <a class="el" href="point3_8h_source.html">point3.h</a>.</p>
+
+</div>
+</div>
+<a id="ac409e3213620b80c868245c1f6a6eea5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac409e3213620b80c868245c1f6a6eea5">&#9670;&nbsp;</a></span>x()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Point3::x </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the x coordinate. Can also use my_point[0]. Use the my_point[0] = 1.0; form if you need to set the value. </p>
+
+<p class="definition">Definition at line <a class="el" href="point3_8h_source.html#l00093">93</a> of file <a class="el" href="point3_8h_source.html">point3.h</a>.</p>
+
+</div>
+</div>
+<a id="a0757315cd84f91879021d7afe18e0545"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0757315cd84f91879021d7afe18e0545">&#9670;&nbsp;</a></span>y()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Point3::y </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the y coordinate. Can also use my_point[1]. Use the my_point[1] = 1.0; form if you need to set the value. </p>
+
+<p class="definition">Definition at line <a class="el" href="point3_8h_source.html#l00097">97</a> of file <a class="el" href="point3_8h_source.html">point3.h</a>.</p>
+
+</div>
+</div>
+<a id="ac463e3a3ec3edd02c86505ea6400d8e6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac463e3a3ec3edd02c86505ea6400d8e6">&#9670;&nbsp;</a></span>z()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Point3::z </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the z coordinate. Can also use my_point[2]. Use the my_point[2] = 1.0; form if you need to set the value. </p>
+
+<p class="definition">Definition at line <a class="el" href="point3_8h_source.html#l00101">101</a> of file <a class="el" href="point3_8h_source.html">point3.h</a>.</p>
+
+</div>
+</div>
+<a id="a9983b62979f9ac5a11efea08d9d283ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9983b62979f9ac5a11efea08d9d283ed">&#9670;&nbsp;</a></span>Zero()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_point3.html">Point3</a>&amp; mingfx::Point3::Zero </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(0,0,0) - a shortcut for a special point that is frequently needed </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="point3_8h_source.html">point3.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_quaternion-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_quaternion-members.html
new file mode 100644
index 0000000..4015421
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_quaternion-members.html
@@ -0,0 +1,119 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::Quaternion Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#ab0e3e20f78e537de0187def78d808584">Conjugate</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a90a9b715d06c75ba60eb1164dc6e9c6f">Dot</a>(const Quaternion &amp;q) const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a5bacec2f9a3cbbcf24572f9c8eeb480c">FromAxisAngle</a>(const Vector3 &amp;axis, float angle)</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18">FromEulerAnglesZYX</a>(const Vector3 &amp;angles)</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#af6527ae19f31be2b265b8b8c4b34b77a">Length</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a05def5c8eb729037b3d9522711a5c2a2">Normalize</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#ad72c021d2d1fa543c96ac4a8b360dd2e">operator!=</a>(const Quaternion &amp;q) const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#ac5f82b7ed1d620c3c15f57aca028fcdd">operator=</a>(const Quaternion &amp;q)</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#aa89165641485cf9337cd6279df40a403">operator==</a>(const Quaternion &amp;q) const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a548d09ecd25788241d734240c0dd7ea8">operator[]</a>(const int i) const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a40e6587cc0511572297c5507634db7e1">operator[]</a>(const int i)</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165">Quaternion</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a5c6cbe4fc70e8e4ec23142d0a5a2ba97">Quaternion</a>(float qx, float qy, float qz, float qw)</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a07bb09eb7d0b368ef5e8d9da02fbdad6">Quaternion</a>(float *ptr)</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a0be885a1b3f2d54675c6866ec3578243">Quaternion</a>(const Quaternion &amp;other)</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a0290914928a2618f7faaa40989113d22">Slerp</a>(const Quaternion &amp;other, float alpha) const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a31d37561099fab3d75a74455c5f43133">Slerp</a>(const Quaternion &amp;a, const Quaternion &amp;b, float alpha)</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a033f05ed7e7215a5c3c4cd26548c8007">ToEulerAnglesZYX</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a3572b35419c51332204adb5bf35f0b03">ToUnit</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#abca597e756f257dc33838734ae19baf9">value_ptr</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a8aa53f71892f02c981d98d100a8b57c7">w</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a85464500e1d3c8ba10f1968426dc24ae">x</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#adb294449db2a80bd11426148592d9e0b">y</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a75ec001cbbf08cf5c4e1f8978082a55f">z</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html#a1f9ddd82678ccf51a462e4e03a02c7cc">~Quaternion</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_quaternion.html b/dev/MinGfx/docs/html/classmingfx_1_1_quaternion.html
new file mode 100644
index 0000000..3bce21e
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_quaternion.html
@@ -0,0 +1,818 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::Quaternion Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_quaternion-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::Quaternion Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A quaternion to represent rotations in 3D space. </p>
+<p>The main use of quaternions within the library is to support smooth interpolation between rotations, since this is not possible using Euler angles or rotation matrices. The class includes a Slerp routine for spherical interpolation between rotations. Example use: </p><div class="fragment"><div class="line"><span class="comment">// find a rotation 1/2 way between r1 and r2, both originally expressed in Euler angles</span></div>
+<div class="line"> </div>
+<div class="line">Vector3 euler1 = <a class="code" href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">GfxMath::ToRadians</a>(Vector3(0,0,60));</div>
+<div class="line">Vector3 euler2 = <a class="code" href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">GfxMath::ToRadians</a>(Vector3(45,45,60));</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165">Quaternion</a> q1 = <a class="code" href="classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18">Quaternion::FromEulerAnglesZYX</a>(euler1);</div>
+<div class="line"><a class="code" href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165">Quaternion</a> q2 = <a class="code" href="classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18">Quaternion::FromEulerAnglesZYX</a>(euler2);</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">float</span> alpha = 0.5;</div>
+<div class="line"><a class="code" href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165">Quaternion</a> q_half_way = q1.Slerp(q2, alpha);</div>
+<div class="line">Vector3 new_euler_angles = <a class="code" href="classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3">GfxMath::ToDegrees</a>(q_half_way.ToEulerAnglesZYX());</div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a1336de2695bc3bb750b23fb0ea211637"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">mingfx::GfxMath::ToRadians</a></div><div class="ttdeci">static float ToRadians(float degrees)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a39a2b5973249fb3aefc210b18b0fdff3"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3">mingfx::GfxMath::ToDegrees</a></div><div class="ttdeci">static float ToDegrees(float radians)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a9548599ea5c527f9f67d2ea6710e3d18"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18">mingfx::Quaternion::FromEulerAnglesZYX</a></div><div class="ttdeci">static Quaternion FromEulerAnglesZYX(const Vector3 &amp;angles)</div><div class="ttdoc">Creates a new quaternion from a rotation defined in Euler angles.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_ad58ac80804ec63af354912a71361f165"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165">mingfx::Quaternion::Quaternion</a></div><div class="ttdeci">Quaternion()</div><div class="ttdoc">Creates a quat with the identity rotation.</div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="quaternion_8h_source.html#l00041">41</a> of file <a class="el" href="quaternion_8h_source.html">quaternion.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="quaternion_8h_source.html">quaternion.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ad58ac80804ec63af354912a71361f165"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165">Quaternion</a> ()</td></tr>
+<tr class="memdesc:ad58ac80804ec63af354912a71361f165"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a quat with the identity rotation. <a href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165">More...</a><br /></td></tr>
+<tr class="separator:ad58ac80804ec63af354912a71361f165"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c6cbe4fc70e8e4ec23142d0a5a2ba97"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a5c6cbe4fc70e8e4ec23142d0a5a2ba97">Quaternion</a> (float qx, float qy, float qz, float qw)</td></tr>
+<tr class="memdesc:a5c6cbe4fc70e8e4ec23142d0a5a2ba97"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a quat from the 4 parameters. <a href="classmingfx_1_1_quaternion.html#a5c6cbe4fc70e8e4ec23142d0a5a2ba97">More...</a><br /></td></tr>
+<tr class="separator:a5c6cbe4fc70e8e4ec23142d0a5a2ba97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a07bb09eb7d0b368ef5e8d9da02fbdad6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a07bb09eb7d0b368ef5e8d9da02fbdad6">Quaternion</a> (float *ptr)</td></tr>
+<tr class="memdesc:a07bb09eb7d0b368ef5e8d9da02fbdad6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a quate from a pointer to 4 floating point numbers in the order qx, qy, qz, qw. <a href="classmingfx_1_1_quaternion.html#a07bb09eb7d0b368ef5e8d9da02fbdad6">More...</a><br /></td></tr>
+<tr class="separator:a07bb09eb7d0b368ef5e8d9da02fbdad6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0be885a1b3f2d54675c6866ec3578243"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a0be885a1b3f2d54675c6866ec3578243">Quaternion</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;other)</td></tr>
+<tr class="memdesc:a0be885a1b3f2d54675c6866ec3578243"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy constructor. <a href="classmingfx_1_1_quaternion.html#a0be885a1b3f2d54675c6866ec3578243">More...</a><br /></td></tr>
+<tr class="separator:a0be885a1b3f2d54675c6866ec3578243"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f9ddd82678ccf51a462e4e03a02c7cc"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a1f9ddd82678ccf51a462e4e03a02c7cc">~Quaternion</a> ()</td></tr>
+<tr class="separator:a1f9ddd82678ccf51a462e4e03a02c7cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa89165641485cf9337cd6279df40a403"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#aa89165641485cf9337cd6279df40a403">operator==</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q) const</td></tr>
+<tr class="memdesc:aa89165641485cf9337cd6279df40a403"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "equality", taking floating point imprecision into account. <a href="classmingfx_1_1_quaternion.html#aa89165641485cf9337cd6279df40a403">More...</a><br /></td></tr>
+<tr class="separator:aa89165641485cf9337cd6279df40a403"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad72c021d2d1fa543c96ac4a8b360dd2e"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#ad72c021d2d1fa543c96ac4a8b360dd2e">operator!=</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q) const</td></tr>
+<tr class="memdesc:ad72c021d2d1fa543c96ac4a8b360dd2e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "inequality", taking floating point imprecision into account. <a href="classmingfx_1_1_quaternion.html#ad72c021d2d1fa543c96ac4a8b360dd2e">More...</a><br /></td></tr>
+<tr class="separator:ad72c021d2d1fa543c96ac4a8b360dd2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac5f82b7ed1d620c3c15f57aca028fcdd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#ac5f82b7ed1d620c3c15f57aca028fcdd">operator=</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q)</td></tr>
+<tr class="memdesc:ac5f82b7ed1d620c3c15f57aca028fcdd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Assignment operator. <a href="classmingfx_1_1_quaternion.html#ac5f82b7ed1d620c3c15f57aca028fcdd">More...</a><br /></td></tr>
+<tr class="separator:ac5f82b7ed1d620c3c15f57aca028fcdd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a548d09ecd25788241d734240c0dd7ea8"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a548d09ecd25788241d734240c0dd7ea8">operator[]</a> (const int i) const</td></tr>
+<tr class="memdesc:a548d09ecd25788241d734240c0dd7ea8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the ith coordinate of the quaternion (qx, qy, qz, qw). <a href="classmingfx_1_1_quaternion.html#a548d09ecd25788241d734240c0dd7ea8">More...</a><br /></td></tr>
+<tr class="separator:a548d09ecd25788241d734240c0dd7ea8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40e6587cc0511572297c5507634db7e1"><td class="memItemLeft" align="right" valign="top">float &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a40e6587cc0511572297c5507634db7e1">operator[]</a> (const int i)</td></tr>
+<tr class="memdesc:a40e6587cc0511572297c5507634db7e1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Writable access the ith coordinate of the quaternion (qx, qy, qz, qw). <a href="classmingfx_1_1_quaternion.html#a40e6587cc0511572297c5507634db7e1">More...</a><br /></td></tr>
+<tr class="separator:a40e6587cc0511572297c5507634db7e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85464500e1d3c8ba10f1968426dc24ae"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a85464500e1d3c8ba10f1968426dc24ae">x</a> () const</td></tr>
+<tr class="memdesc:a85464500e1d3c8ba10f1968426dc24ae"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the x coordinate of the imaginary part of the quaternion. <a href="classmingfx_1_1_quaternion.html#a85464500e1d3c8ba10f1968426dc24ae">More...</a><br /></td></tr>
+<tr class="separator:a85464500e1d3c8ba10f1968426dc24ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adb294449db2a80bd11426148592d9e0b"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#adb294449db2a80bd11426148592d9e0b">y</a> () const</td></tr>
+<tr class="memdesc:adb294449db2a80bd11426148592d9e0b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the y coordinate of the imaginary part of the quaternion. <a href="classmingfx_1_1_quaternion.html#adb294449db2a80bd11426148592d9e0b">More...</a><br /></td></tr>
+<tr class="separator:adb294449db2a80bd11426148592d9e0b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75ec001cbbf08cf5c4e1f8978082a55f"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a75ec001cbbf08cf5c4e1f8978082a55f">z</a> () const</td></tr>
+<tr class="memdesc:a75ec001cbbf08cf5c4e1f8978082a55f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the z coordinate of the imaginary part of the quaternion. <a href="classmingfx_1_1_quaternion.html#a75ec001cbbf08cf5c4e1f8978082a55f">More...</a><br /></td></tr>
+<tr class="separator:a75ec001cbbf08cf5c4e1f8978082a55f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8aa53f71892f02c981d98d100a8b57c7"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a8aa53f71892f02c981d98d100a8b57c7">w</a> () const</td></tr>
+<tr class="memdesc:a8aa53f71892f02c981d98d100a8b57c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the w, real part, of the quaternion. <a href="classmingfx_1_1_quaternion.html#a8aa53f71892f02c981d98d100a8b57c7">More...</a><br /></td></tr>
+<tr class="separator:a8aa53f71892f02c981d98d100a8b57c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abca597e756f257dc33838734ae19baf9"><td class="memItemLeft" align="right" valign="top">const float *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#abca597e756f257dc33838734ae19baf9">value_ptr</a> () const</td></tr>
+<tr class="memdesc:abca597e756f257dc33838734ae19baf9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a const pointer to the raw data array, stored in the order qx, qy, qz, qw. <a href="classmingfx_1_1_quaternion.html#abca597e756f257dc33838734ae19baf9">More...</a><br /></td></tr>
+<tr class="separator:abca597e756f257dc33838734ae19baf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a90a9b715d06c75ba60eb1164dc6e9c6f"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a90a9b715d06c75ba60eb1164dc6e9c6f">Dot</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q) const</td></tr>
+<tr class="memdesc:a90a9b715d06c75ba60eb1164dc6e9c6f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the dot product of this quaternion with another. <a href="classmingfx_1_1_quaternion.html#a90a9b715d06c75ba60eb1164dc6e9c6f">More...</a><br /></td></tr>
+<tr class="separator:a90a9b715d06c75ba60eb1164dc6e9c6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6527ae19f31be2b265b8b8c4b34b77a"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#af6527ae19f31be2b265b8b8c4b34b77a">Length</a> () const</td></tr>
+<tr class="memdesc:af6527ae19f31be2b265b8b8c4b34b77a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the length of the quaternion. <a href="classmingfx_1_1_quaternion.html#af6527ae19f31be2b265b8b8c4b34b77a">More...</a><br /></td></tr>
+<tr class="separator:af6527ae19f31be2b265b8b8c4b34b77a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05def5c8eb729037b3d9522711a5c2a2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a05def5c8eb729037b3d9522711a5c2a2">Normalize</a> ()</td></tr>
+<tr class="memdesc:a05def5c8eb729037b3d9522711a5c2a2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Normalizes the quat by making it unit length. <a href="classmingfx_1_1_quaternion.html#a05def5c8eb729037b3d9522711a5c2a2">More...</a><br /></td></tr>
+<tr class="separator:a05def5c8eb729037b3d9522711a5c2a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3572b35419c51332204adb5bf35f0b03"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a3572b35419c51332204adb5bf35f0b03">ToUnit</a> () const</td></tr>
+<tr class="memdesc:a3572b35419c51332204adb5bf35f0b03"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a normalized (i.e., unit length) version of the quaternion without modifying the original. <a href="classmingfx_1_1_quaternion.html#a3572b35419c51332204adb5bf35f0b03">More...</a><br /></td></tr>
+<tr class="separator:a3572b35419c51332204adb5bf35f0b03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0e3e20f78e537de0187def78d808584"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#ab0e3e20f78e537de0187def78d808584">Conjugate</a> () const</td></tr>
+<tr class="memdesc:ab0e3e20f78e537de0187def78d808584"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the conjugate of the quaternion. <a href="classmingfx_1_1_quaternion.html#ab0e3e20f78e537de0187def78d808584">More...</a><br /></td></tr>
+<tr class="separator:ab0e3e20f78e537de0187def78d808584"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a033f05ed7e7215a5c3c4cd26548c8007"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a033f05ed7e7215a5c3c4cd26548c8007">ToEulerAnglesZYX</a> () const</td></tr>
+<tr class="memdesc:a033f05ed7e7215a5c3c4cd26548c8007"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts the rotation specified by the quaternion into Euler angles. <a href="classmingfx_1_1_quaternion.html#a033f05ed7e7215a5c3c4cd26548c8007">More...</a><br /></td></tr>
+<tr class="separator:a033f05ed7e7215a5c3c4cd26548c8007"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0290914928a2618f7faaa40989113d22"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a0290914928a2618f7faaa40989113d22">Slerp</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;other, float alpha) const</td></tr>
+<tr class="memdesc:a0290914928a2618f7faaa40989113d22"><td class="mdescLeft">&#160;</td><td class="mdescRight">Uses spherical interpolation to interpoloate between the rotation stored in this quaternion and the rotation stored in another. <a href="classmingfx_1_1_quaternion.html#a0290914928a2618f7faaa40989113d22">More...</a><br /></td></tr>
+<tr class="separator:a0290914928a2618f7faaa40989113d22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:a5bacec2f9a3cbbcf24572f9c8eeb480c"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a5bacec2f9a3cbbcf24572f9c8eeb480c">FromAxisAngle</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;axis, float angle)</td></tr>
+<tr class="memdesc:a5bacec2f9a3cbbcf24572f9c8eeb480c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new quaternion that describes a rotation by angle radians about. <a href="classmingfx_1_1_quaternion.html#a5bacec2f9a3cbbcf24572f9c8eeb480c">More...</a><br /></td></tr>
+<tr class="separator:a5bacec2f9a3cbbcf24572f9c8eeb480c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9548599ea5c527f9f67d2ea6710e3d18"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18">FromEulerAnglesZYX</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;angles)</td></tr>
+<tr class="memdesc:a9548599ea5c527f9f67d2ea6710e3d18"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new quaternion from a rotation defined in Euler angles. <a href="classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18">More...</a><br /></td></tr>
+<tr class="separator:a9548599ea5c527f9f67d2ea6710e3d18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a31d37561099fab3d75a74455c5f43133"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html#a31d37561099fab3d75a74455c5f43133">Slerp</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;a, const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;b, float alpha)</td></tr>
+<tr class="memdesc:a31d37561099fab3d75a74455c5f43133"><td class="mdescLeft">&#160;</td><td class="mdescRight">Uses spherical interpolation to interpoloate between the rotations specified by two quaternions. <a href="classmingfx_1_1_quaternion.html#a31d37561099fab3d75a74455c5f43133">More...</a><br /></td></tr>
+<tr class="separator:a31d37561099fab3d75a74455c5f43133"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="ad58ac80804ec63af354912a71361f165"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad58ac80804ec63af354912a71361f165">&#9670;&nbsp;</a></span>Quaternion() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Quaternion::Quaternion </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a quat with the identity rotation. </p>
+
+</div>
+</div>
+<a id="a5c6cbe4fc70e8e4ec23142d0a5a2ba97"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5c6cbe4fc70e8e4ec23142d0a5a2ba97">&#9670;&nbsp;</a></span>Quaternion() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Quaternion::Quaternion </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>qx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>qy</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>qz</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>qw</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a quat from the 4 parameters. </p>
+
+</div>
+</div>
+<a id="a07bb09eb7d0b368ef5e8d9da02fbdad6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a07bb09eb7d0b368ef5e8d9da02fbdad6">&#9670;&nbsp;</a></span>Quaternion() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Quaternion::Quaternion </td>
+ <td>(</td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>ptr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a quate from a pointer to 4 floating point numbers in the order qx, qy, qz, qw. </p>
+
+</div>
+</div>
+<a id="a0be885a1b3f2d54675c6866ec3578243"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0be885a1b3f2d54675c6866ec3578243">&#9670;&nbsp;</a></span>Quaternion() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Quaternion::Quaternion </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>other</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy constructor. </p>
+
+</div>
+</div>
+<a id="a1f9ddd82678ccf51a462e4e03a02c7cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1f9ddd82678ccf51a462e4e03a02c7cc">&#9670;&nbsp;</a></span>~Quaternion()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::Quaternion::~Quaternion </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="ab0e3e20f78e537de0187def78d808584"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0e3e20f78e537de0187def78d808584">&#9670;&nbsp;</a></span>Conjugate()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::Quaternion::Conjugate </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the conjugate of the quaternion. </p>
+
+</div>
+</div>
+<a id="a90a9b715d06c75ba60eb1164dc6e9c6f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a90a9b715d06c75ba60eb1164dc6e9c6f">&#9670;&nbsp;</a></span>Dot()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Quaternion::Dot </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the dot product of this quaternion with another. </p>
+
+</div>
+</div>
+<a id="a5bacec2f9a3cbbcf24572f9c8eeb480c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5bacec2f9a3cbbcf24572f9c8eeb480c">&#9670;&nbsp;</a></span>FromAxisAngle()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::Quaternion::FromAxisAngle </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>axis</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>angle</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Creates a new quaternion that describes a rotation by angle radians about. </p>
+
+</div>
+</div>
+<a id="a9548599ea5c527f9f67d2ea6710e3d18"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9548599ea5c527f9f67d2ea6710e3d18">&#9670;&nbsp;</a></span>FromEulerAnglesZYX()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::Quaternion::FromEulerAnglesZYX </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>angles</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Creates a new quaternion from a rotation defined in Euler angles. </p>
+
+</div>
+</div>
+<a id="af6527ae19f31be2b265b8b8c4b34b77a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af6527ae19f31be2b265b8b8c4b34b77a">&#9670;&nbsp;</a></span>Length()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Quaternion::Length </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the length of the quaternion. </p>
+
+</div>
+</div>
+<a id="a05def5c8eb729037b3d9522711a5c2a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a05def5c8eb729037b3d9522711a5c2a2">&#9670;&nbsp;</a></span>Normalize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Quaternion::Normalize </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Normalizes the quat by making it unit length. </p>
+
+</div>
+</div>
+<a id="ad72c021d2d1fa543c96ac4a8b360dd2e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad72c021d2d1fa543c96ac4a8b360dd2e">&#9670;&nbsp;</a></span>operator!=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Quaternion::operator!= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "inequality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="ac5f82b7ed1d620c3c15f57aca028fcdd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac5f82b7ed1d620c3c15f57aca028fcdd">&#9670;&nbsp;</a></span>operator=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; mingfx::Quaternion::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Assignment operator. </p>
+
+</div>
+</div>
+<a id="aa89165641485cf9337cd6279df40a403"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa89165641485cf9337cd6279df40a403">&#9670;&nbsp;</a></span>operator==()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Quaternion::operator== </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "equality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="a40e6587cc0511572297c5507634db7e1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a40e6587cc0511572297c5507634db7e1">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float&amp; mingfx::Quaternion::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Writable access the ith coordinate of the quaternion (qx, qy, qz, qw). </p>
+
+</div>
+</div>
+<a id="a548d09ecd25788241d734240c0dd7ea8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a548d09ecd25788241d734240c0dd7ea8">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Quaternion::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read only access to the ith coordinate of the quaternion (qx, qy, qz, qw). </p>
+
+</div>
+</div>
+<a id="a31d37561099fab3d75a74455c5f43133"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a31d37561099fab3d75a74455c5f43133">&#9670;&nbsp;</a></span>Slerp() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::Quaternion::Slerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Uses spherical interpolation to interpoloate between the rotations specified by two quaternions. </p>
+
+</div>
+</div>
+<a id="a0290914928a2618f7faaa40989113d22"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0290914928a2618f7faaa40989113d22">&#9670;&nbsp;</a></span>Slerp() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::Quaternion::Slerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>other</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Uses spherical interpolation to interpoloate between the rotation stored in this quaternion and the rotation stored in another. </p>
+
+</div>
+</div>
+<a id="a033f05ed7e7215a5c3c4cd26548c8007"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a033f05ed7e7215a5c3c4cd26548c8007">&#9670;&nbsp;</a></span>ToEulerAnglesZYX()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::Quaternion::ToEulerAnglesZYX </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Converts the rotation specified by the quaternion into Euler angles. </p>
+
+</div>
+</div>
+<a id="a3572b35419c51332204adb5bf35f0b03"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3572b35419c51332204adb5bf35f0b03">&#9670;&nbsp;</a></span>ToUnit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::Quaternion::ToUnit </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a normalized (i.e., unit length) version of the quaternion without modifying the original. </p>
+
+</div>
+</div>
+<a id="abca597e756f257dc33838734ae19baf9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abca597e756f257dc33838734ae19baf9">&#9670;&nbsp;</a></span>value_ptr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const float* mingfx::Quaternion::value_ptr </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a const pointer to the raw data array, stored in the order qx, qy, qz, qw. </p>
+
+</div>
+</div>
+<a id="a8aa53f71892f02c981d98d100a8b57c7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8aa53f71892f02c981d98d100a8b57c7">&#9670;&nbsp;</a></span>w()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Quaternion::w </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the w, real part, of the quaternion. </p>
+
+<p class="definition">Definition at line <a class="el" href="quaternion_8h_source.html#l00083">83</a> of file <a class="el" href="quaternion_8h_source.html">quaternion.h</a>.</p>
+
+</div>
+</div>
+<a id="a85464500e1d3c8ba10f1968426dc24ae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a85464500e1d3c8ba10f1968426dc24ae">&#9670;&nbsp;</a></span>x()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Quaternion::x </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the x coordinate of the imaginary part of the quaternion. </p>
+
+<p class="definition">Definition at line <a class="el" href="quaternion_8h_source.html#l00074">74</a> of file <a class="el" href="quaternion_8h_source.html">quaternion.h</a>.</p>
+
+</div>
+</div>
+<a id="adb294449db2a80bd11426148592d9e0b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adb294449db2a80bd11426148592d9e0b">&#9670;&nbsp;</a></span>y()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Quaternion::y </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the y coordinate of the imaginary part of the quaternion. </p>
+
+<p class="definition">Definition at line <a class="el" href="quaternion_8h_source.html#l00077">77</a> of file <a class="el" href="quaternion_8h_source.html">quaternion.h</a>.</p>
+
+</div>
+</div>
+<a id="a75ec001cbbf08cf5c4e1f8978082a55f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a75ec001cbbf08cf5c4e1f8978082a55f">&#9670;&nbsp;</a></span>z()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Quaternion::z </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the z coordinate of the imaginary part of the quaternion. </p>
+
+<p class="definition">Definition at line <a class="el" href="quaternion_8h_source.html#l00080">80</a> of file <a class="el" href="quaternion_8h_source.html">quaternion.h</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="quaternion_8h_source.html">quaternion.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_quick_shapes-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_quick_shapes-members.html
new file mode 100644
index 0000000..6b52b39
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_quick_shapes-members.html
@@ -0,0 +1,111 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_quick_shapes.html">QuickShapes</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::QuickShapes Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#aa7564a49dc2ff8efd93dec13186cb75b">default_shader</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#aebe27814a826558ac0475fef3d4481eb">DrawArrow</a>(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color, Point3 p, Vector3 dir, float radius)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#a637876fdc13e84282922350b53dab5f8">DrawAxes</a>(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#ab24811cfd980b3f2ec4ebccf6c0e8b30">DrawBrush</a>(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#a1880f6dd3e794cd9f6e5d9138f93a424">DrawCone</a>(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#adad98f87a40650ff7c605a94b6d937af">DrawCube</a>(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#a69c442154f800c6bb3f6ffa8395e2844">DrawCylinder</a>(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#abec2513648c1238f36c41cf3c85dd868">DrawFullscreenTexture</a>(const Color &amp;color, const Texture2D &amp;texture)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#af59ae8d8c5bd0447f3bb7f56112400bf">DrawLines</a>(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color, const std::vector&lt; Point3 &gt; &amp;points, LinesType linesType, float radius)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#a0feae19a04d9f315a39e2bdbf659bd7e">DrawLineSegment</a>(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color, const Point3 &amp;p1, const Point3 &amp;p2, float radius)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#aa5f4f64e3708630a6d58f6b4ca7d2744">DrawSphere</a>(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#a4350ea23b8b9e0e8119310423d641ab3">DrawSquare</a>(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#a7187f72fa8e12b38dcd0ce424fc85fbc">DrawSquare</a>(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color, const Texture2D &amp;texture)</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603">LinesType</a> enum name</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#ac8b702a25296cfea15eef1e185333272">material</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#a5764a0953013ece013bf3e2a72e4afa2">QuickShapes</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html#a3a75dde188ec076ea46a6319ed1ca046">~QuickShapes</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_quick_shapes.html b/dev/MinGfx/docs/html/classmingfx_1_1_quick_shapes.html
new file mode 100644
index 0000000..f499aff
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_quick_shapes.html
@@ -0,0 +1,844 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::QuickShapes Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_quick_shapes.html">QuickShapes</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-types">Public Types</a> &#124;
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_quick_shapes-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::QuickShapes Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This class provides a quick way to draw shapes for use in debugging or simple scenes. </p>
+<p>You can specify the color for each shape as part of the Draw...() call. Other lighting parameters (the intensity of the light, advanced material properties) are pre-set to reasonable defaults that apply to all of the shapes drawn. You can edit these if you wish, but note that the intent of this class is just to provide a quick way to draw shapes &ndash; this is not the right tool to use if you wish to do quality renderings and use multiple types of materials.</p>
+<p>Example usage: ~~~ define a new <a class="el" href="classmingfx_1_1_quick_shapes.html" title="This class provides a quick way to draw shapes for use in debugging or simple scenes.">QuickShapes</a> object during initialization, or as a class member variable <a class="el" href="classmingfx_1_1_quick_shapes.html" title="This class provides a quick way to draw shapes for use in debugging or simple scenes.">QuickShapes</a> quick_shapes;</p>
+<p>void DrawUsingOpenGL() { later, in your draw routine, use it to draw shapes <a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a> view = <a class="el" href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de" title="Returns a view matrix that centers the camera at the &#39;eye&#39; position and orients it to look at the des...">Matrix4::LookAt</a>(Point3(0,0,3), Point3(0,0,0), Vector3(0,1,0)); <a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a> proj = <a class="el" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e" title="Returns a perspective projection matrix equivalent to the one gluPerspective creates.">Matrix4::Perspective</a>(60.0, aspect_ratio(), 0.1, 10.0);</p>
+<p><a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a> m_cube = <a class="el" href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84" title="Returns the translation matrix described by the vector.">Matrix4::Translation</a>(<a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a>(-2.5,0,0)) * <a class="el" href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e" title="Returns the scale matrix described by the vector.">Matrix4::Scale</a>(<a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a>(0.5, 0.5, 0.5)); quick_shapes.DrawCube(m_cube, view, proj, Color(1,1,1));</p>
+<p><a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a> m_sphere = <a class="el" href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e" title="Returns the scale matrix described by the vector.">Matrix4::Scale</a>(<a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a>(2.5, 2.5, 2.5)); quick_shapes.DrawSphere(m_sphere, view, proj, Color(1,1,1));</p>
+<p><a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a> m_loop; std::vector&lt;Point3&gt; loop; loop.push_back(<a class="el" href="classmingfx_1_1_point3.html" title="A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...">Point3</a>( 4.0, 4.0, -4.0)); loop.push_back(<a class="el" href="classmingfx_1_1_point3.html" title="A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...">Point3</a>(-4.0, 4.0, -4.0)); loop.push_back(<a class="el" href="classmingfx_1_1_point3.html" title="A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...">Point3</a>(-4.0, 4.0, 4.0)); loop.push_back(<a class="el" href="classmingfx_1_1_point3.html" title="A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...">Point3</a>( 4.0, 4.0, 4.0)); quick_shapes.DrawLines(m_loop, view, proj, Color(1,1,1), loop, <a class="el" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603a8e0df0247f66bd2cac06f16abb562134">QuickShapes::LinesType::LINE_LOOP</a>, 0.1); } ~~~ </p>
+
+<p class="definition">Definition at line <a class="el" href="quick__shapes_8h_source.html#l00069">69</a> of file <a class="el" href="quick__shapes_8h_source.html">quick_shapes.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="quick__shapes_8h_source.html">quick_shapes.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr class="memitem:aaea35a34a9495a9ab25cd9aa32a91603"><td class="memItemLeft" align="right" valign="top">enum class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603">LinesType</a> { <a class="el" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603ae585142391f356c60bcfe68279ec2727">LINES</a>
+, <a class="el" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603ae64a4d2159ed46d077e21a505575c814">LINE_STRIP</a>
+, <a class="el" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603a8e0df0247f66bd2cac06f16abb562134">LINE_LOOP</a>
+ }</td></tr>
+<tr class="separator:aaea35a34a9495a9ab25cd9aa32a91603"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a5764a0953013ece013bf3e2a72e4afa2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#a5764a0953013ece013bf3e2a72e4afa2">QuickShapes</a> ()</td></tr>
+<tr class="separator:a5764a0953013ece013bf3e2a72e4afa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a75dde188ec076ea46a6319ed1ca046"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#a3a75dde188ec076ea46a6319ed1ca046">~QuickShapes</a> ()</td></tr>
+<tr class="separator:a3a75dde188ec076ea46a6319ed1ca046"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adad98f87a40650ff7c605a94b6d937af"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#adad98f87a40650ff7c605a94b6d937af">DrawCube</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;color)</td></tr>
+<tr class="memdesc:adad98f87a40650ff7c605a94b6d937af"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws a cube with extents -1 to 1 given the model, view, and projection matrices provided and using the supplied color as a material property. <a href="classmingfx_1_1_quick_shapes.html#adad98f87a40650ff7c605a94b6d937af">More...</a><br /></td></tr>
+<tr class="separator:adad98f87a40650ff7c605a94b6d937af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a69c442154f800c6bb3f6ffa8395e2844"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#a69c442154f800c6bb3f6ffa8395e2844">DrawCylinder</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;color)</td></tr>
+<tr class="memdesc:a69c442154f800c6bb3f6ffa8395e2844"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws a cylinder with radius 1 and height y=-1 to 1 given the model, view, and projection matrices provided and using the supplied color as a material property. <a href="classmingfx_1_1_quick_shapes.html#a69c442154f800c6bb3f6ffa8395e2844">More...</a><br /></td></tr>
+<tr class="separator:a69c442154f800c6bb3f6ffa8395e2844"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1880f6dd3e794cd9f6e5d9138f93a424"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#a1880f6dd3e794cd9f6e5d9138f93a424">DrawCone</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;color)</td></tr>
+<tr class="memdesc:a1880f6dd3e794cd9f6e5d9138f93a424"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws a cone with radius 1 and height y=-1 to 1 given the model, view, and projection matrices provided and using the supplied color as a material property. <a href="classmingfx_1_1_quick_shapes.html#a1880f6dd3e794cd9f6e5d9138f93a424">More...</a><br /></td></tr>
+<tr class="separator:a1880f6dd3e794cd9f6e5d9138f93a424"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5f4f64e3708630a6d58f6b4ca7d2744"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#aa5f4f64e3708630a6d58f6b4ca7d2744">DrawSphere</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;color)</td></tr>
+<tr class="memdesc:aa5f4f64e3708630a6d58f6b4ca7d2744"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws a sphere with radius 1 given the model, view, and projection matrices provided and using the supplied color as a material property. <a href="classmingfx_1_1_quick_shapes.html#aa5f4f64e3708630a6d58f6b4ca7d2744">More...</a><br /></td></tr>
+<tr class="separator:aa5f4f64e3708630a6d58f6b4ca7d2744"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab24811cfd980b3f2ec4ebccf6c0e8b30"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#ab24811cfd980b3f2ec4ebccf6c0e8b30">DrawBrush</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;color)</td></tr>
+<tr class="memdesc:ab24811cfd980b3f2ec4ebccf6c0e8b30"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws the classic 3D paintbrush cursor from the 2001 Keefe et al. <a href="classmingfx_1_1_quick_shapes.html#ab24811cfd980b3f2ec4ebccf6c0e8b30">More...</a><br /></td></tr>
+<tr class="separator:ab24811cfd980b3f2ec4ebccf6c0e8b30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0feae19a04d9f315a39e2bdbf659bd7e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#a0feae19a04d9f315a39e2bdbf659bd7e">DrawLineSegment</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;color, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p1, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p2, float radius)</td></tr>
+<tr class="memdesc:a0feae19a04d9f315a39e2bdbf659bd7e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws a cylinder between the two points. <a href="classmingfx_1_1_quick_shapes.html#a0feae19a04d9f315a39e2bdbf659bd7e">More...</a><br /></td></tr>
+<tr class="separator:a0feae19a04d9f315a39e2bdbf659bd7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af59ae8d8c5bd0447f3bb7f56112400bf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#af59ae8d8c5bd0447f3bb7f56112400bf">DrawLines</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;color, const std::vector&lt; <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &gt; &amp;points, <a class="el" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603">LinesType</a> linesType, float radius)</td></tr>
+<tr class="memdesc:af59ae8d8c5bd0447f3bb7f56112400bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws a series of line segments. <a href="classmingfx_1_1_quick_shapes.html#af59ae8d8c5bd0447f3bb7f56112400bf">More...</a><br /></td></tr>
+<tr class="separator:af59ae8d8c5bd0447f3bb7f56112400bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aebe27814a826558ac0475fef3d4481eb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#aebe27814a826558ac0475fef3d4481eb">DrawArrow</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;color, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> p, <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> dir, float radius)</td></tr>
+<tr class="memdesc:aebe27814a826558ac0475fef3d4481eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws an arrow originating at point p and extending in the direction and length specified by dir. <a href="classmingfx_1_1_quick_shapes.html#aebe27814a826558ac0475fef3d4481eb">More...</a><br /></td></tr>
+<tr class="separator:aebe27814a826558ac0475fef3d4481eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a637876fdc13e84282922350b53dab5f8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#a637876fdc13e84282922350b53dab5f8">DrawAxes</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix)</td></tr>
+<tr class="memdesc:a637876fdc13e84282922350b53dab5f8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws a right handed set of axes at the coordinate frame specified by the modelMatrix. <a href="classmingfx_1_1_quick_shapes.html#a637876fdc13e84282922350b53dab5f8">More...</a><br /></td></tr>
+<tr class="separator:a637876fdc13e84282922350b53dab5f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4350ea23b8b9e0e8119310423d641ab3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#a4350ea23b8b9e0e8119310423d641ab3">DrawSquare</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;color)</td></tr>
+<tr class="memdesc:a4350ea23b8b9e0e8119310423d641ab3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws a square in the X-Y plane with extents -1 to 1 and normal in the +Y direction. <a href="classmingfx_1_1_quick_shapes.html#a4350ea23b8b9e0e8119310423d641ab3">More...</a><br /></td></tr>
+<tr class="separator:a4350ea23b8b9e0e8119310423d641ab3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7187f72fa8e12b38dcd0ce424fc85fbc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#a7187f72fa8e12b38dcd0ce424fc85fbc">DrawSquare</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;color, const <a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;texture)</td></tr>
+<tr class="memdesc:a7187f72fa8e12b38dcd0ce424fc85fbc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws a square, which you can deform into some other shape by adjusting the model matrix, and applies a texture to it. <a href="classmingfx_1_1_quick_shapes.html#a7187f72fa8e12b38dcd0ce424fc85fbc">More...</a><br /></td></tr>
+<tr class="separator:a7187f72fa8e12b38dcd0ce424fc85fbc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abec2513648c1238f36c41cf3c85dd868"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#abec2513648c1238f36c41cf3c85dd868">DrawFullscreenTexture</a> (const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;color, const <a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;texture)</td></tr>
+<tr class="memdesc:abec2513648c1238f36c41cf3c85dd868"><td class="mdescLeft">&#160;</td><td class="mdescRight">Draws a background texture across the whole screen. <a href="classmingfx_1_1_quick_shapes.html#abec2513648c1238f36c41cf3c85dd868">More...</a><br /></td></tr>
+<tr class="separator:abec2513648c1238f36c41cf3c85dd868"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7564a49dc2ff8efd93dec13186cb75b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_default_shader.html">DefaultShader</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#aa7564a49dc2ff8efd93dec13186cb75b">default_shader</a> ()</td></tr>
+<tr class="memdesc:aa7564a49dc2ff8efd93dec13186cb75b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a pointer to the default shader used internally by the Draw class so that you may change the default lighting properties if you wish. <a href="classmingfx_1_1_quick_shapes.html#aa7564a49dc2ff8efd93dec13186cb75b">More...</a><br /></td></tr>
+<tr class="separator:aa7564a49dc2ff8efd93dec13186cb75b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac8b702a25296cfea15eef1e185333272"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">DefaultShader::MaterialProperties</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html#ac8b702a25296cfea15eef1e185333272">material</a> ()</td></tr>
+<tr class="memdesc:ac8b702a25296cfea15eef1e185333272"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a pointer to the default material properties for the shapes so that you may adjust the reflectance properties used by all the shapes if needed. <a href="classmingfx_1_1_quick_shapes.html#ac8b702a25296cfea15eef1e185333272">More...</a><br /></td></tr>
+<tr class="separator:ac8b702a25296cfea15eef1e185333272"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Enumeration Documentation</h2>
+<a id="aaea35a34a9495a9ab25cd9aa32a91603"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaea35a34a9495a9ab25cd9aa32a91603">&#9670;&nbsp;</a></span>LinesType</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603">mingfx::QuickShapes::LinesType</a></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">strong</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="aaea35a34a9495a9ab25cd9aa32a91603ae585142391f356c60bcfe68279ec2727"></a>LINES&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="aaea35a34a9495a9ab25cd9aa32a91603ae64a4d2159ed46d077e21a505575c814"></a>LINE_STRIP&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="aaea35a34a9495a9ab25cd9aa32a91603a8e0df0247f66bd2cac06f16abb562134"></a>LINE_LOOP&#160;</td><td class="fielddoc"></td></tr>
+</table>
+
+<p class="definition">Definition at line <a class="el" href="quick__shapes_8h_source.html#l00134">134</a> of file <a class="el" href="quick__shapes_8h_source.html">quick_shapes.h</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a5764a0953013ece013bf3e2a72e4afa2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5764a0953013ece013bf3e2a72e4afa2">&#9670;&nbsp;</a></span>QuickShapes()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::QuickShapes::QuickShapes </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a3a75dde188ec076ea46a6319ed1ca046"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3a75dde188ec076ea46a6319ed1ca046">&#9670;&nbsp;</a></span>~QuickShapes()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::QuickShapes::~QuickShapes </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="aa7564a49dc2ff8efd93dec13186cb75b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa7564a49dc2ff8efd93dec13186cb75b">&#9670;&nbsp;</a></span>default_shader()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_default_shader.html">DefaultShader</a>* mingfx::QuickShapes::default_shader </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a pointer to the default shader used internally by the Draw class so that you may change the default lighting properties if you wish. </p>
+
+</div>
+</div>
+<a id="aebe27814a826558ac0475fef3d4481eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aebe27814a826558ac0475fef3d4481eb">&#9670;&nbsp;</a></span>DrawArrow()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawArrow </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>modelMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>color</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td>
+ <td class="paramname"><em>dir</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>radius</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws an arrow originating at point p and extending in the direction and length specified by dir. </p>
+<p>radius is the radius of the cylinder used to draw the shaft of the arrow. </p>
+
+</div>
+</div>
+<a id="a637876fdc13e84282922350b53dab5f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a637876fdc13e84282922350b53dab5f8">&#9670;&nbsp;</a></span>DrawAxes()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawAxes </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>modelMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws a right handed set of axes at the coordinate frame specified by the modelMatrix. </p>
+<p>The arrows are 1 unit in length and colored based on the axis: X=red, Y=green, Z=blue. </p>
+
+</div>
+</div>
+<a id="ab24811cfd980b3f2ec4ebccf6c0e8b30"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab24811cfd980b3f2ec4ebccf6c0e8b30">&#9670;&nbsp;</a></span>DrawBrush()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawBrush </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>modelMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>color</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws the classic 3D paintbrush cursor from the 2001 Keefe et al. </p>
+<p>CavePainting paper. The tip of the brush is at (0,0,0), the front flat edge runs along the X axis, and the handle runs in the +Z direction. </p>
+
+</div>
+</div>
+<a id="a1880f6dd3e794cd9f6e5d9138f93a424"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1880f6dd3e794cd9f6e5d9138f93a424">&#9670;&nbsp;</a></span>DrawCone()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawCone </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>modelMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>color</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws a cone with radius 1 and height y=-1 to 1 given the model, view, and projection matrices provided and using the supplied color as a material property. </p>
+
+</div>
+</div>
+<a id="adad98f87a40650ff7c605a94b6d937af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adad98f87a40650ff7c605a94b6d937af">&#9670;&nbsp;</a></span>DrawCube()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawCube </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>modelMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>color</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws a cube with extents -1 to 1 given the model, view, and projection matrices provided and using the supplied color as a material property. </p>
+
+</div>
+</div>
+<a id="a69c442154f800c6bb3f6ffa8395e2844"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a69c442154f800c6bb3f6ffa8395e2844">&#9670;&nbsp;</a></span>DrawCylinder()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawCylinder </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>modelMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>color</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws a cylinder with radius 1 and height y=-1 to 1 given the model, view, and projection matrices provided and using the supplied color as a material property. </p>
+
+</div>
+</div>
+<a id="abec2513648c1238f36c41cf3c85dd868"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abec2513648c1238f36c41cf3c85dd868">&#9670;&nbsp;</a></span>DrawFullscreenTexture()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawFullscreenTexture </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>color</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;&#160;</td>
+ <td class="paramname"><em>texture</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws a background texture across the whole screen. </p>
+<p>Typically, you will want to do this before any other draw calls. </p>
+
+</div>
+</div>
+<a id="af59ae8d8c5bd0447f3bb7f56112400bf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af59ae8d8c5bd0447f3bb7f56112400bf">&#9670;&nbsp;</a></span>DrawLines()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawLines </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>modelMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>color</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>points</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603">LinesType</a>&#160;</td>
+ <td class="paramname"><em>linesType</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>radius</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws a series of line segments. </p>
+<p>Using linesType=LINES connects each consecutive pair of points in the points array with a line. A linesType=LINE_STRIP will connect each point to the next. And, a linesType=LINE_LOOP will connect each point to the next and in addition connect the last to the first. Example: </p><div class="fragment"><div class="line">Matrix4 model;</div>
+<div class="line">Matrix4 view = <a class="code" href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">Matrix4::LookAt</a>(Point3(0,0,3), Point3(0,0,0), Vector3(0,1,0));</div>
+<div class="line">Matrix4 proj = <a class="code" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">Matrix4::Perspective</a>(60.0, aspect_ratio(), 0.1, 10.0);</div>
+<div class="line">std::vector&lt;Point3&gt; loop;</div>
+<div class="line">loop.push_back(Point3( 4.0, 4.0, -4.0));</div>
+<div class="line">loop.push_back(Point3(-4.0, 4.0, -4.0));</div>
+<div class="line">loop.push_back(Point3(-4.0, 4.0, 4.0));</div>
+<div class="line">loop.push_back(Point3( 4.0, 4.0, 4.0));</div>
+<div class="line">quick_shapes.DrawLines(model, view, proj, Color(1,1,1), loop, <a class="code" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603a8e0df0247f66bd2cac06f16abb562134">QuickShapes::LinesType::LINE_LOOP</a>, 0.1);</div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0e34aee86758a0397074590b87712c5e"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">mingfx::Matrix4::Perspective</a></div><div class="ttdeci">static Matrix4 Perspective(float fov_y_in_degrees, float aspect_ratio, float near_plane_dist, float far_plane_dist)</div><div class="ttdoc">Returns a perspective projection matrix equivalent to the one gluPerspective creates.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a4543695a6dfc996d0312b70c2eaa00de"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">mingfx::Matrix4::LookAt</a></div><div class="ttdeci">static Matrix4 LookAt(Point3 eye, Point3 target, Vector3 up)</div><div class="ttdoc">Returns a view matrix that centers the camera at the 'eye' position and orients it to look at the des...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_aaea35a34a9495a9ab25cd9aa32a91603a8e0df0247f66bd2cac06f16abb562134"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603a8e0df0247f66bd2cac06f16abb562134">mingfx::QuickShapes::LinesType::LINE_LOOP</a></div><div class="ttdeci">@ LINE_LOOP</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="a0feae19a04d9f315a39e2bdbf659bd7e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0feae19a04d9f315a39e2bdbf659bd7e">&#9670;&nbsp;</a></span>DrawLineSegment()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawLineSegment </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>modelMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>color</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>radius</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws a cylinder between the two points. </p>
+
+</div>
+</div>
+<a id="aa5f4f64e3708630a6d58f6b4ca7d2744"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa5f4f64e3708630a6d58f6b4ca7d2744">&#9670;&nbsp;</a></span>DrawSphere()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawSphere </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>modelMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>color</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws a sphere with radius 1 given the model, view, and projection matrices provided and using the supplied color as a material property. </p>
+
+</div>
+</div>
+<a id="a4350ea23b8b9e0e8119310423d641ab3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4350ea23b8b9e0e8119310423d641ab3">&#9670;&nbsp;</a></span>DrawSquare() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawSquare </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>modelMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>color</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws a square in the X-Y plane with extents -1 to 1 and normal in the +Y direction. </p>
+<p>Uses the model, view, and projection matrices provided and the supplied color as a material property. </p>
+
+</div>
+</div>
+<a id="a7187f72fa8e12b38dcd0ce424fc85fbc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7187f72fa8e12b38dcd0ce424fc85fbc">&#9670;&nbsp;</a></span>DrawSquare() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::QuickShapes::DrawSquare </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>modelMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>viewMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>color</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;&#160;</td>
+ <td class="paramname"><em>texture</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Draws a square, which you can deform into some other shape by adjusting the model matrix, and applies a texture to it. </p>
+<p>The texture must already be bound to the OpenGL textureID provided. The square lies in the X-Y plane with extents -1 to 1 and normal in the +Y direction. No lighting is applied. </p>
+
+</div>
+</div>
+<a id="ac8b702a25296cfea15eef1e185333272"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac8b702a25296cfea15eef1e185333272">&#9670;&nbsp;</a></span>material()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">DefaultShader::MaterialProperties</a>* mingfx::QuickShapes::material </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a pointer to the default material properties for the shapes so that you may adjust the reflectance properties used by all the shapes if needed. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="quick__shapes_8h_source.html">quick_shapes.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_ray-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_ray-members.html
new file mode 100644
index 0000000..f27cee9
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_ray-members.html
@@ -0,0 +1,110 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_ray.html">Ray</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::Ray Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe">direction</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc">FastIntersectMesh</a>(Mesh *mesh, float *iTime, Point3 *iPoint, int *iTriangleID) const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#a57d3ee10518ed361ae02d9cbdef842b7">IntersectAABB</a>(const AABB &amp;box, float *iTime) const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#a79caa1df0839d13339575d3d5527ae6f">IntersectMesh</a>(const Mesh &amp;mesh, float *iTime, Point3 *iPoint, int *iTriangleID) const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#a8707604031eb9437c449345d85d69d24">IntersectPlane</a>(const Point3 &amp;planePt, const Vector3 &amp;planeNormal, float *iTime, Point3 *iPoint) const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#a37689523a0b73d3d3288ce60bdcb7ae3">IntersectQuad</a>(const Point3 &amp;v1, const Point3 &amp;v2, const Point3 &amp;v3, const Point3 &amp;v4, float *iTime, Point3 *iPoint) const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#a970c7dbc19167be625967fabfb39b4ff">IntersectSphere</a>(const Point3 &amp;center, float radius, float *iTime, Point3 *iPoint) const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#a1a6130616c4e4eebe9d09181b0f8b734">IntersectTriangle</a>(const Point3 &amp;v1, const Point3 &amp;v2, const Point3 &amp;v3, float *iTime, Point3 *iPoint) const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#a3c926e2da6dfd1b0a435577617eae984">Length</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#ab62fa6ea1c20870f67c58401aefe3eff">operator!=</a>(const Ray &amp;other) const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#a87b07c4f7c9f33189efade7e519b5d9d">operator==</a>(const Ray &amp;other) const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe">origin</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda">Ray</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#ab38cdd0793b3acfe55fa9ebca5ddebf6">Ray</a>(const Point3 &amp;origin, const Vector3 &amp;direction)</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#a75593293307b4eead15a876bf3597071">set</a>(Point3 newOrigin, Vector3 newDir)</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_ray.html#ac20909f30c07d5375598876c6d294625">~Ray</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_ray.html b/dev/MinGfx/docs/html/classmingfx_1_1_ray.html
new file mode 100644
index 0000000..0c5b500
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_ray.html
@@ -0,0 +1,689 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::Ray Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_ray.html">Ray</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_ray-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::Ray Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Stores the mathematical object of a ray that begins at an origin (a 3D point) and points in a direction (a unit 3D vector). </p>
+<p>Rays can intersect a variety of other computer graphics objects, such as planes, triangles, spheres, 3D meshes, etc. These intersections can be tested with the Intersect...() methods. The <a class="el" href="classmingfx_1_1_ray.html" title="Stores the mathematical object of a ray that begins at an origin (a 3D point) and points in a directi...">Ray</a> can also be transformed by a <a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a>. Example: </p><div class="fragment"><div class="line"><span class="comment">// Create a pick ray from the mouse position</span></div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::OnLeftMouseDown(<span class="keyword">const</span> Point2 &amp;pos) {</div>
+<div class="line"> Point2 mouse_xy = PixelsToNormalizedDeviceCoords(pos);</div>
+<div class="line"> <span class="keywordtype">float</span> mouse_z = ReadZValueAtPixel(pos);</div>
+<div class="line"> Point3 mouse_3d = <a class="code" href="classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0">GfxMath::ScreenToNearPlane</a>(view_matrix, proj_matrix, mouse_xy, mouse_z);</div>
+<div class="line"> Matrix4 camera_matrix = view_matrix.Inverse();</div>
+<div class="line"> Point3 eye = camera_matrix.ColumnToPoint3(3);</div>
+<div class="line"> </div>
+<div class="line"> <a class="code" href="classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda">Ray</a> pick_ray(eye, mouse_3d - eye);</div>
+<div class="line"> </div>
+<div class="line"> <span class="comment">// check to see if the ray intersects a sphere</span></div>
+<div class="line"> <span class="keywordtype">float</span> t;</div>
+<div class="line"> Point3 p;</div>
+<div class="line"> <span class="keywordflow">if</span> (pick_ray.IntersectSphere(Point3(0,0,0), 2.0, &amp;t, &amp;p)) {</div>
+<div class="line"> std::cout &lt;&lt; <span class="stringliteral">&quot;Mouse pointing at sphere! Intersection point = &quot;</span> &lt;&lt; p &lt;&lt; std::endl;</div>
+<div class="line"> }</div>
+<div class="line">}</div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a2086a2f885f887fb53da8a5adb5860f0"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0">mingfx::GfxMath::ScreenToNearPlane</a></div><div class="ttdeci">static Point3 ScreenToNearPlane(const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projMatrix, const Point2 &amp;normalizedScreenPt)</div><div class="ttdoc">Converts a 2D point on the filmplane represented in Normalized Device Coorindates,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_aee3fe586869e00ae657a74bb4bbbbfda"><div class="ttname"><a href="classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda">mingfx::Ray::Ray</a></div><div class="ttdeci">Ray()</div><div class="ttdoc">Defaults to a ray at the origin and pointing in the -Z direction.</div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="ray_8h_source.html#l00054">54</a> of file <a class="el" href="ray_8h_source.html">ray.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="ray_8h_source.html">ray.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:aee3fe586869e00ae657a74bb4bbbbfda"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda">Ray</a> ()</td></tr>
+<tr class="memdesc:aee3fe586869e00ae657a74bb4bbbbfda"><td class="mdescLeft">&#160;</td><td class="mdescRight">Defaults to a ray at the origin and pointing in the -Z direction. <a href="classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda">More...</a><br /></td></tr>
+<tr class="separator:aee3fe586869e00ae657a74bb4bbbbfda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab38cdd0793b3acfe55fa9ebca5ddebf6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#ab38cdd0793b3acfe55fa9ebca5ddebf6">Ray</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;<a class="el" href="classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe">origin</a>, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;<a class="el" href="classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe">direction</a>)</td></tr>
+<tr class="memdesc:ab38cdd0793b3acfe55fa9ebca5ddebf6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a ray from a 3D origin and direction. <a href="classmingfx_1_1_ray.html#ab38cdd0793b3acfe55fa9ebca5ddebf6">More...</a><br /></td></tr>
+<tr class="separator:ab38cdd0793b3acfe55fa9ebca5ddebf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac20909f30c07d5375598876c6d294625"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#ac20909f30c07d5375598876c6d294625">~Ray</a> ()</td></tr>
+<tr class="memdesc:ac20909f30c07d5375598876c6d294625"><td class="mdescLeft">&#160;</td><td class="mdescRight"><a class="el" href="classmingfx_1_1_ray.html" title="Stores the mathematical object of a ray that begins at an origin (a 3D point) and points in a directi...">Ray</a> destructor. <a href="classmingfx_1_1_ray.html#ac20909f30c07d5375598876c6d294625">More...</a><br /></td></tr>
+<tr class="separator:ac20909f30c07d5375598876c6d294625"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87b07c4f7c9f33189efade7e519b5d9d"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#a87b07c4f7c9f33189efade7e519b5d9d">operator==</a> (const <a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;other) const</td></tr>
+<tr class="memdesc:a87b07c4f7c9f33189efade7e519b5d9d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "equality", taking floating point imprecision into account. <a href="classmingfx_1_1_ray.html#a87b07c4f7c9f33189efade7e519b5d9d">More...</a><br /></td></tr>
+<tr class="separator:a87b07c4f7c9f33189efade7e519b5d9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab62fa6ea1c20870f67c58401aefe3eff"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#ab62fa6ea1c20870f67c58401aefe3eff">operator!=</a> (const <a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;other) const</td></tr>
+<tr class="memdesc:ab62fa6ea1c20870f67c58401aefe3eff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "inequality", taking floating point imprecision into account. <a href="classmingfx_1_1_ray.html#ab62fa6ea1c20870f67c58401aefe3eff">More...</a><br /></td></tr>
+<tr class="separator:ab62fa6ea1c20870f67c58401aefe3eff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c926e2da6dfd1b0a435577617eae984"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#a3c926e2da6dfd1b0a435577617eae984">Length</a> () const</td></tr>
+<tr class="memdesc:a3c926e2da6dfd1b0a435577617eae984"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the length of the direction vector. <a href="classmingfx_1_1_ray.html#a3c926e2da6dfd1b0a435577617eae984">More...</a><br /></td></tr>
+<tr class="separator:a3c926e2da6dfd1b0a435577617eae984"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8707604031eb9437c449345d85d69d24"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#a8707604031eb9437c449345d85d69d24">IntersectPlane</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;planePt, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;planeNormal, float *iTime, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> *iPoint) const</td></tr>
+<tr class="memdesc:a8707604031eb9437c449345d85d69d24"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks to see if the ray intersects a plane defined by a point and a normal. <a href="classmingfx_1_1_ray.html#a8707604031eb9437c449345d85d69d24">More...</a><br /></td></tr>
+<tr class="separator:a8707604031eb9437c449345d85d69d24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a6130616c4e4eebe9d09181b0f8b734"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#a1a6130616c4e4eebe9d09181b0f8b734">IntersectTriangle</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;v1, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;v2, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;v3, float *iTime, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> *iPoint) const</td></tr>
+<tr class="memdesc:a1a6130616c4e4eebe9d09181b0f8b734"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks to see if the ray intersects a triangle defined by the vertices v1, v2, and v3. <a href="classmingfx_1_1_ray.html#a1a6130616c4e4eebe9d09181b0f8b734">More...</a><br /></td></tr>
+<tr class="separator:a1a6130616c4e4eebe9d09181b0f8b734"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a37689523a0b73d3d3288ce60bdcb7ae3"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#a37689523a0b73d3d3288ce60bdcb7ae3">IntersectQuad</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;v1, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;v2, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;v3, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;v4, float *iTime, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> *iPoint) const</td></tr>
+<tr class="memdesc:a37689523a0b73d3d3288ce60bdcb7ae3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks to see if the ray intersects a quad defined by the vertices v1, v2, v3, and v4. <a href="classmingfx_1_1_ray.html#a37689523a0b73d3d3288ce60bdcb7ae3">More...</a><br /></td></tr>
+<tr class="separator:a37689523a0b73d3d3288ce60bdcb7ae3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a970c7dbc19167be625967fabfb39b4ff"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#a970c7dbc19167be625967fabfb39b4ff">IntersectSphere</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;center, float radius, float *iTime, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> *iPoint) const</td></tr>
+<tr class="memdesc:a970c7dbc19167be625967fabfb39b4ff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks to see if the ray intersects a sphere defined by a center point and a radius. <a href="classmingfx_1_1_ray.html#a970c7dbc19167be625967fabfb39b4ff">More...</a><br /></td></tr>
+<tr class="separator:a970c7dbc19167be625967fabfb39b4ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a79caa1df0839d13339575d3d5527ae6f"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#a79caa1df0839d13339575d3d5527ae6f">IntersectMesh</a> (const <a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;mesh, float *iTime, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> *iPoint, int *iTriangleID) const</td></tr>
+<tr class="memdesc:a79caa1df0839d13339575d3d5527ae6f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks to see if the ray intersects a triangle mesh. <a href="classmingfx_1_1_ray.html#a79caa1df0839d13339575d3d5527ae6f">More...</a><br /></td></tr>
+<tr class="separator:a79caa1df0839d13339575d3d5527ae6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac90097090f0f8f49db13f6f232712afc"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc">FastIntersectMesh</a> (<a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> *mesh, float *iTime, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> *iPoint, int *iTriangleID) const</td></tr>
+<tr class="memdesc:ac90097090f0f8f49db13f6f232712afc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks to see if the ray intersects a triangle mesh. <a href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc">More...</a><br /></td></tr>
+<tr class="separator:ac90097090f0f8f49db13f6f232712afc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57d3ee10518ed361ae02d9cbdef842b7"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#a57d3ee10518ed361ae02d9cbdef842b7">IntersectAABB</a> (const <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;box, float *iTime) const</td></tr>
+<tr class="memdesc:a57d3ee10518ed361ae02d9cbdef842b7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks to see if the ray intersects an <a class="el" href="classmingfx_1_1_a_a_b_b.html" title="A 3D axis-aligned bounding box defined by two corners (min and max).">AABB</a> (Axis-Aligned Bounding Box). <a href="classmingfx_1_1_ray.html#a57d3ee10518ed361ae02d9cbdef842b7">More...</a><br /></td></tr>
+<tr class="separator:a57d3ee10518ed361ae02d9cbdef842b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe">origin</a> () const</td></tr>
+<tr class="memdesc:a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the origin. <a href="classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe">More...</a><br /></td></tr>
+<tr class="separator:a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b7826730a410c10be00122c99fe6dbe"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe">direction</a> () const</td></tr>
+<tr class="memdesc:a7b7826730a410c10be00122c99fe6dbe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the direction. <a href="classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe">More...</a><br /></td></tr>
+<tr class="separator:a7b7826730a410c10be00122c99fe6dbe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75593293307b4eead15a876bf3597071"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html#a75593293307b4eead15a876bf3597071">set</a> (<a class="el" href="classmingfx_1_1_point3.html">Point3</a> newOrigin, <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> newDir)</td></tr>
+<tr class="memdesc:a75593293307b4eead15a876bf3597071"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets a new origin and direction. <a href="classmingfx_1_1_ray.html#a75593293307b4eead15a876bf3597071">More...</a><br /></td></tr>
+<tr class="separator:a75593293307b4eead15a876bf3597071"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="aee3fe586869e00ae657a74bb4bbbbfda"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aee3fe586869e00ae657a74bb4bbbbfda">&#9670;&nbsp;</a></span>Ray() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Ray::Ray </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Defaults to a ray at the origin and pointing in the -Z direction. </p>
+
+</div>
+</div>
+<a id="ab38cdd0793b3acfe55fa9ebca5ddebf6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab38cdd0793b3acfe55fa9ebca5ddebf6">&#9670;&nbsp;</a></span>Ray() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Ray::Ray </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>origin</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>direction</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a ray from a 3D origin and direction. </p>
+
+</div>
+</div>
+<a id="ac20909f30c07d5375598876c6d294625"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac20909f30c07d5375598876c6d294625">&#9670;&nbsp;</a></span>~Ray()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::Ray::~Ray </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p><a class="el" href="classmingfx_1_1_ray.html" title="Stores the mathematical object of a ray that begins at an origin (a 3D point) and points in a directi...">Ray</a> destructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a7b7826730a410c10be00122c99fe6dbe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7b7826730a410c10be00122c99fe6dbe">&#9670;&nbsp;</a></span>direction()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::Ray::direction </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the direction. </p>
+
+</div>
+</div>
+<a id="ac90097090f0f8f49db13f6f232712afc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac90097090f0f8f49db13f6f232712afc">&#9670;&nbsp;</a></span>FastIntersectMesh()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Ray::FastIntersectMesh </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> *&#160;</td>
+ <td class="paramname"><em>mesh</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>iTime</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> *&#160;</td>
+ <td class="paramname"><em>iPoint</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int *&#160;</td>
+ <td class="paramname"><em>iTriangleID</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks to see if the ray intersects a triangle mesh. </p>
+<p>This uses a <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> (Bounding Volume Hierarchy) to accelerate the ray-triangle intersection tests. Each mesh can optionally store a <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a>. If a <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> has already been calculated for the mesh (done with Mesh::CalculateBVH()), then this function will be much faster than the brute-force <a class="el" href="classmingfx_1_1_ray.html#a79caa1df0839d13339575d3d5527ae6f" title="Checks to see if the ray intersects a triangle mesh.">IntersectMesh()</a> function. If a <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> has not already been calculated for the mesh, the first call to <a class="el" href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc" title="Checks to see if the ray intersects a triangle mesh.">FastIntersectMesh()</a> will trigger the mesh to create a <a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a> (not a fast operation) but then subsequent calls to <a class="el" href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc" title="Checks to see if the ray intersects a triangle mesh.">FastIntersectMesh()</a> will be fast. </p>
+
+</div>
+</div>
+<a id="a57d3ee10518ed361ae02d9cbdef842b7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57d3ee10518ed361ae02d9cbdef842b7">&#9670;&nbsp;</a></span>IntersectAABB()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Ray::IntersectAABB </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;&#160;</td>
+ <td class="paramname"><em>box</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>iTime</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks to see if the ray intersects an <a class="el" href="classmingfx_1_1_a_a_b_b.html" title="A 3D axis-aligned bounding box defined by two corners (min and max).">AABB</a> (Axis-Aligned Bounding Box). </p>
+<p>Typically, this is the first step of a more detailed intersection test and we don't care about the actual point of intersection, just whether it intersects or not. So, we don't bother calculating the iPoint. We get the iTime for free though, so we do return that. You can calc the iPoint if you want using: </p><div class="fragment"><div class="line"><span class="keywordtype">float</span> t;</div>
+<div class="line"><span class="keywordflow">if</span> (ray.IntersectAABB(box, &amp;t)) {</div>
+<div class="line"> Point3 iPoint = ray.origin() + t*ray.direction();</div>
+<div class="line">}</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="a79caa1df0839d13339575d3d5527ae6f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a79caa1df0839d13339575d3d5527ae6f">&#9670;&nbsp;</a></span>IntersectMesh()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Ray::IntersectMesh </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;&#160;</td>
+ <td class="paramname"><em>mesh</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>iTime</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> *&#160;</td>
+ <td class="paramname"><em>iPoint</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int *&#160;</td>
+ <td class="paramname"><em>iTriangleID</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks to see if the ray intersects a triangle mesh. </p>
+<p>This is a brute-force check over each triangle in the mesh. If there was an intersection, true is returned, iTime is set to the intersection time, iPoint is set to the intersection point, and iTriangleID is set to the ID of the closest intersected triangle along the ray. </p>
+
+</div>
+</div>
+<a id="a8707604031eb9437c449345d85d69d24"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8707604031eb9437c449345d85d69d24">&#9670;&nbsp;</a></span>IntersectPlane()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Ray::IntersectPlane </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>planePt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>planeNormal</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>iTime</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> *&#160;</td>
+ <td class="paramname"><em>iPoint</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks to see if the ray intersects a plane defined by a point and a normal. </p>
+<p>If there was an intersection, true is returned, iTime is set to the intersection time, and iPoint is set to the intersection point. The plane is considered to be 1-sided. That is the intersection will only occur if the ray hits the plane from its front side as determined by the plane's normal. </p>
+
+</div>
+</div>
+<a id="a37689523a0b73d3d3288ce60bdcb7ae3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a37689523a0b73d3d3288ce60bdcb7ae3">&#9670;&nbsp;</a></span>IntersectQuad()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Ray::IntersectQuad </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v3</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v4</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>iTime</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> *&#160;</td>
+ <td class="paramname"><em>iPoint</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks to see if the ray intersects a quad defined by the vertices v1, v2, v3, and v4. </p>
+<p>The vertices must be provided in counter-clockwise order so that the normal of the triangle can be determined via the right-hand rule. The intersection will only happen if the ray hits the front side of the triangle. If there was an intersection, true is returned, iTime is set to the intersection time, and iPoint is set to the intersection point. </p>
+
+</div>
+</div>
+<a id="a970c7dbc19167be625967fabfb39b4ff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a970c7dbc19167be625967fabfb39b4ff">&#9670;&nbsp;</a></span>IntersectSphere()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Ray::IntersectSphere </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>center</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>radius</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>iTime</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> *&#160;</td>
+ <td class="paramname"><em>iPoint</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks to see if the ray intersects a sphere defined by a center point and a radius. </p>
+<p>If there was an intersection, true is returned, iTime is set to the intersection time, and iPoint is set to the intersection point. </p>
+
+</div>
+</div>
+<a id="a1a6130616c4e4eebe9d09181b0f8b734"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1a6130616c4e4eebe9d09181b0f8b734">&#9670;&nbsp;</a></span>IntersectTriangle()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Ray::IntersectTriangle </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v3</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>iTime</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> *&#160;</td>
+ <td class="paramname"><em>iPoint</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Checks to see if the ray intersects a triangle defined by the vertices v1, v2, and v3. </p>
+<p>The vertices must be provided in counter-clockwise order so that the normal of the triangle can be determined via the right-hand rule. The intersection will only happen if the ray hits the front side of the triangle. If there was an intersection, true is returned, iTime is set to the intersection time, and iPoint is set to the intersection point. </p>
+
+</div>
+</div>
+<a id="a3c926e2da6dfd1b0a435577617eae984"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3c926e2da6dfd1b0a435577617eae984">&#9670;&nbsp;</a></span>Length()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Ray::Length </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the length of the direction vector. </p>
+
+</div>
+</div>
+<a id="ab62fa6ea1c20870f67c58401aefe3eff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab62fa6ea1c20870f67c58401aefe3eff">&#9670;&nbsp;</a></span>operator!=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Ray::operator!= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;&#160;</td>
+ <td class="paramname"><em>other</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "inequality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="a87b07c4f7c9f33189efade7e519b5d9d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a87b07c4f7c9f33189efade7e519b5d9d">&#9670;&nbsp;</a></span>operator==()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Ray::operator== </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;&#160;</td>
+ <td class="paramname"><em>other</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "equality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe">&#9670;&nbsp;</a></span>origin()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::Ray::origin </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the origin. </p>
+
+</div>
+</div>
+<a id="a75593293307b4eead15a876bf3597071"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a75593293307b4eead15a876bf3597071">&#9670;&nbsp;</a></span>set()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Ray::set </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td>
+ <td class="paramname"><em>newOrigin</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td>
+ <td class="paramname"><em>newDir</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Sets a new origin and direction. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="ray_8h_source.html">ray.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_shader_program-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_shader_program-members.html
new file mode 100644
index 0000000..1964ba3
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_shader_program-members.html
@@ -0,0 +1,127 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_shader_program.html">ShaderProgram</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::ShaderProgram Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#acd94fc12beb85fe57aa80d3b825018b0">AddFragmentShaderFromFile</a>(const std::string &amp;file)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a7a3063ec42798c076e1ab0c0e6411e9c">AddFragmentShaderFromSource</a>(const std::string &amp;code)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a63ac061271fad9338e922389d4a179e5">AddVertexShaderFromFile</a>(const std::string &amp;file)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#ab5fed4904a59c6e83ebb43aebf4c043d">AddVertexShaderFromSource</a>(const std::string &amp;code)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a4e5a2659f66f29433b15748f36c61ea2">BindTexture</a>(const std::string &amp;name, const Texture2D &amp;tex)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#af81d97c2843278eb40cdcdf8e5d54a96">BindTexture</a>(const std::string &amp;name, const Texture2D &amp;tex, int texUnit)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a2eddd93e446ad2079d1c57676655ffbe">initialized</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#ad14c3a9a4ee1eef39f933bc46260c794">LinkProgram</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a">SetUniform</a>(const std::string &amp;name, const Point2 &amp;p)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#aef58537d81bdb9d88a5f1c56a2b98b25">SetUniform</a>(const std::string &amp;name, const Vector2 &amp;v)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#ac59b3d0542ce45631876615eabf66487">SetUniform</a>(const std::string &amp;name, const Point3 &amp;p)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a0b3e6285354e007bf79a9ac1587f86f5">SetUniform</a>(const std::string &amp;name, const Vector3 &amp;v)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a766988eac957e9d810fdf2cbd2eafae0">SetUniform</a>(const std::string &amp;name, const Matrix4 &amp;m)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a9ec2b53ba4bea7e48ef459530b8c6d60">SetUniform</a>(const std::string &amp;name, const Color &amp;c)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#ab547dadc25582bec157b39de29d1419e">SetUniform</a>(const std::string &amp;name, int i)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a707d2cb51a54151959c6570d6bfc7840">SetUniform</a>(const std::string &amp;name, unsigned int ui)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a680fa87cb30343bb56abc48a090e823c">SetUniform</a>(const std::string &amp;name, float f)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a51cd1c1d194b2f5c07e81d4f579f2f2b">SetUniformArray1</a>(const std::string &amp;name, int *i, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#abba87d2b0baca89232dbd1d6331875de">SetUniformArray1</a>(const std::string &amp;name, unsigned int *ui, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a5c7891252d6b6c40982b56543820cd19">SetUniformArray1</a>(const std::string &amp;name, float *f, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a9bab504c74a1c4258258b91afe9a9623">SetUniformArray2</a>(const std::string &amp;name, int *i, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a6fdca4b0ccaa8a0b2c8c68fd7645727c">SetUniformArray2</a>(const std::string &amp;name, unsigned int *ui, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a93914cad6d8e751218c88010c51cf657">SetUniformArray2</a>(const std::string &amp;name, float *f, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#ac582a2aa74a83095e0b8e359ce432511">SetUniformArray3</a>(const std::string &amp;name, int *i, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a8c31de93b17f050baecb5323a69bdbfa">SetUniformArray3</a>(const std::string &amp;name, unsigned int *ui, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#afc84377716296a57299ebbc01884b65d">SetUniformArray3</a>(const std::string &amp;name, float *f, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#ab06ef4682f801fca080a8f67dc6345ba">SetUniformArray4</a>(const std::string &amp;name, int *i, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a2854ad947f74432edc0b730462b7f695">SetUniformArray4</a>(const std::string &amp;name, unsigned int *ui, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a9710cf4c72a7321b9a1ff1b86ae42da1">SetUniformArray4</a>(const std::string &amp;name, float *f, int count)</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700">ShaderProgram</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da">StopProgram</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#af1c968f1c79f70e183c9d1239d3d205e">UseProgram</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html#a96da0dede354f2511084eeb25428edb4">~ShaderProgram</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_shader_program.html b/dev/MinGfx/docs/html/classmingfx_1_1_shader_program.html
new file mode 100644
index 0000000..26f8de9
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_shader_program.html
@@ -0,0 +1,1202 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::ShaderProgram Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_shader_program.html">ShaderProgram</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_shader_program-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::ShaderProgram Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A wrapper around GLSL shader programs. </p>
+<p>This class supports loading vertex and fragment shaders from files or strings, compiling them, and then linking them into a shader program. Uniform variables within the shader programs can be set in order to pass parameters from C++ code into the shader program. Textures can also be bound to the shader. Example usage: </p><div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700">ShaderProgram</a> shader_prog;</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::InitOpenGL() {</div>
+<div class="line"> shader_prog.AddVertexShaderFromFile(Platform::findFile(<span class="stringliteral">&quot;my_shader.vert&quot;</span>, searchPath));</div>
+<div class="line"> shader_prog.AddFragmentShaderFromFile(Platform::findFile(<span class="stringliteral">&quot;my_shader.frag&quot;</span>, searchPath));</div>
+<div class="line"> shader_prog.LinkProgram();</div>
+<div class="line">}</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::DrawUsingOpenGL() {</div>
+<div class="line"> <span class="comment">// Activate the shader program</span></div>
+<div class="line"> shader_prog.UseProgram();</div>
+<div class="line"> </div>
+<div class="line"> <span class="comment">// Pass uniforms and textures from C++ to the GPU Shader Program</span></div>
+<div class="line"> shader_prog.SetUniform(<span class="stringliteral">&quot;ModelMatrix&quot;</span>, modelMat);</div>
+<div class="line"> shader_prog.SetUniform(<span class="stringliteral">&quot;ViewMatrix&quot;</span>, viewMat);</div>
+<div class="line"> shader_prog.SetUniform(<span class="stringliteral">&quot;ProjectionMatrix&quot;</span>, projMat);</div>
+<div class="line"> shader_prog.SetUniform(<span class="stringliteral">&quot;LightPosition&quot;</span>, Point3(2,2,2));</div>
+<div class="line"> shader_prog.BindTexture(<span class="stringliteral">&quot;SurfaceTexture&quot;</span>, my_tex);</div>
+<div class="line"> </div>
+<div class="line"> <span class="comment">// Draw whatever geometry you want now</span></div>
+<div class="line"> mesh1.Draw();</div>
+<div class="line"> mesh2.Draw();</div>
+<div class="line"> </div>
+<div class="line"> <span class="comment">// Deactivate the shader program</span></div>
+<div class="line"> shader_prog.StopProgram();</div>
+<div class="line">}</div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a0c3d86656c464223dc615cbec0943700"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700">mingfx::ShaderProgram::ShaderProgram</a></div><div class="ttdeci">ShaderProgram()</div><div class="ttdoc">Creates an empty ShaderProgram object.</div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="shader__program_8h_source.html#l00066">66</a> of file <a class="el" href="shader__program_8h_source.html">shader_program.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="shader__program_8h_source.html">shader_program.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a0c3d86656c464223dc615cbec0943700"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700">ShaderProgram</a> ()</td></tr>
+<tr class="memdesc:a0c3d86656c464223dc615cbec0943700"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates an empty <a class="el" href="classmingfx_1_1_shader_program.html" title="A wrapper around GLSL shader programs.">ShaderProgram</a> object. <a href="classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700">More...</a><br /></td></tr>
+<tr class="separator:a0c3d86656c464223dc615cbec0943700"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96da0dede354f2511084eeb25428edb4"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a96da0dede354f2511084eeb25428edb4">~ShaderProgram</a> ()</td></tr>
+<tr class="separator:a96da0dede354f2511084eeb25428edb4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a63ac061271fad9338e922389d4a179e5"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a63ac061271fad9338e922389d4a179e5">AddVertexShaderFromFile</a> (const std::string &amp;file)</td></tr>
+<tr class="memdesc:a63ac061271fad9338e922389d4a179e5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call during initialization but after the OpenGL context has been created (e.g., inside InitOpenGL()). This loads the shader from the file and compiles it. An error will be printed to stderr if there are any compilation errors. <a href="classmingfx_1_1_shader_program.html#a63ac061271fad9338e922389d4a179e5">More...</a><br /></td></tr>
+<tr class="separator:a63ac061271fad9338e922389d4a179e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5fed4904a59c6e83ebb43aebf4c043d"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#ab5fed4904a59c6e83ebb43aebf4c043d">AddVertexShaderFromSource</a> (const std::string &amp;code)</td></tr>
+<tr class="memdesc:ab5fed4904a59c6e83ebb43aebf4c043d"><td class="mdescLeft">&#160;</td><td class="mdescRight">This loads and compiles a shader from a string. An error will be printed to stderr if there are any compilation errors. <a href="classmingfx_1_1_shader_program.html#ab5fed4904a59c6e83ebb43aebf4c043d">More...</a><br /></td></tr>
+<tr class="separator:ab5fed4904a59c6e83ebb43aebf4c043d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd94fc12beb85fe57aa80d3b825018b0"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#acd94fc12beb85fe57aa80d3b825018b0">AddFragmentShaderFromFile</a> (const std::string &amp;file)</td></tr>
+<tr class="memdesc:acd94fc12beb85fe57aa80d3b825018b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call during initialization but after the OpenGL context has been created (e.g., inside InitOpenGL()). This loads the shader from the file and compiles it. An error will be printed to stderr if there are any compilation errors. <a href="classmingfx_1_1_shader_program.html#acd94fc12beb85fe57aa80d3b825018b0">More...</a><br /></td></tr>
+<tr class="separator:acd94fc12beb85fe57aa80d3b825018b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a3063ec42798c076e1ab0c0e6411e9c"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a7a3063ec42798c076e1ab0c0e6411e9c">AddFragmentShaderFromSource</a> (const std::string &amp;code)</td></tr>
+<tr class="memdesc:a7a3063ec42798c076e1ab0c0e6411e9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">This loads and compiles a shader from a string. An error will be printed to stderr if there are any compilation errors. <a href="classmingfx_1_1_shader_program.html#a7a3063ec42798c076e1ab0c0e6411e9c">More...</a><br /></td></tr>
+<tr class="separator:a7a3063ec42798c076e1ab0c0e6411e9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad14c3a9a4ee1eef39f933bc46260c794"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#ad14c3a9a4ee1eef39f933bc46260c794">LinkProgram</a> ()</td></tr>
+<tr class="memdesc:ad14c3a9a4ee1eef39f933bc46260c794"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call this after adding vertex and fragment shaders in order to link them together to create the full shader program. An error will be printed to stderr if there are any linking errors. <a href="classmingfx_1_1_shader_program.html#ad14c3a9a4ee1eef39f933bc46260c794">More...</a><br /></td></tr>
+<tr class="separator:ad14c3a9a4ee1eef39f933bc46260c794"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1c968f1c79f70e183c9d1239d3d205e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#af1c968f1c79f70e183c9d1239d3d205e">UseProgram</a> ()</td></tr>
+<tr class="memdesc:af1c968f1c79f70e183c9d1239d3d205e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call this first to make the shader program active, then call <a class="el" href="classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a" title="Passes the x,y values of point p to the shader program and stores the result in the shader variable n...">SetUniform()</a> to pass data from your C++ program into the shader code via the named uniform variables that appear in the code. Then render whatever geometry you wish with your own glDrawArrays() call(s). Finally, call <a class="el" href="classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da" title="Call this after rendering geometry to deactivate the shader.">StopProgram()</a> to turn off the shader program. <a href="classmingfx_1_1_shader_program.html#af1c968f1c79f70e183c9d1239d3d205e">More...</a><br /></td></tr>
+<tr class="separator:af1c968f1c79f70e183c9d1239d3d205e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a461ba9368ad89fe1e9749b14b099027a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a">SetUniform</a> (const std::string &amp;name, const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p)</td></tr>
+<tr class="memdesc:a461ba9368ad89fe1e9749b14b099027a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes the x,y values of point p to the shader program and stores the result in the shader variable named name, which should be of type vec2. <a href="classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a">More...</a><br /></td></tr>
+<tr class="separator:a461ba9368ad89fe1e9749b14b099027a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef58537d81bdb9d88a5f1c56a2b98b25"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#aef58537d81bdb9d88a5f1c56a2b98b25">SetUniform</a> (const std::string &amp;name, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v)</td></tr>
+<tr class="memdesc:aef58537d81bdb9d88a5f1c56a2b98b25"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes the x,y values of vector v to the shader program and stores the result in the shader variable named name, which should be of type vec2. <a href="classmingfx_1_1_shader_program.html#aef58537d81bdb9d88a5f1c56a2b98b25">More...</a><br /></td></tr>
+<tr class="separator:aef58537d81bdb9d88a5f1c56a2b98b25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac59b3d0542ce45631876615eabf66487"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#ac59b3d0542ce45631876615eabf66487">SetUniform</a> (const std::string &amp;name, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p)</td></tr>
+<tr class="memdesc:ac59b3d0542ce45631876615eabf66487"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes the x,y,z,1 values of point p to the shader program and stores the result in the shader variable named name, which should be of type vec4. <a href="classmingfx_1_1_shader_program.html#ac59b3d0542ce45631876615eabf66487">More...</a><br /></td></tr>
+<tr class="separator:ac59b3d0542ce45631876615eabf66487"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b3e6285354e007bf79a9ac1587f86f5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a0b3e6285354e007bf79a9ac1587f86f5">SetUniform</a> (const std::string &amp;name, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="memdesc:a0b3e6285354e007bf79a9ac1587f86f5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes the x,y,z,0 values of vector v to the shader program and stores the result in the shader variable named name, which should be of type vec4. <a href="classmingfx_1_1_shader_program.html#a0b3e6285354e007bf79a9ac1587f86f5">More...</a><br /></td></tr>
+<tr class="separator:a0b3e6285354e007bf79a9ac1587f86f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a766988eac957e9d810fdf2cbd2eafae0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a766988eac957e9d810fdf2cbd2eafae0">SetUniform</a> (const std::string &amp;name, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m)</td></tr>
+<tr class="memdesc:a766988eac957e9d810fdf2cbd2eafae0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes the column-major 16 float values of matrix m to the shader program and stores the result in the shader variable named name, which should be of type mat4. <a href="classmingfx_1_1_shader_program.html#a766988eac957e9d810fdf2cbd2eafae0">More...</a><br /></td></tr>
+<tr class="separator:a766988eac957e9d810fdf2cbd2eafae0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ec2b53ba4bea7e48ef459530b8c6d60"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a9ec2b53ba4bea7e48ef459530b8c6d60">SetUniform</a> (const std::string &amp;name, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;c)</td></tr>
+<tr class="memdesc:a9ec2b53ba4bea7e48ef459530b8c6d60"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes the r,g,b,a values of color c to the shader program and stores the result in the shader variable named name, which should be of type vec4. <a href="classmingfx_1_1_shader_program.html#a9ec2b53ba4bea7e48ef459530b8c6d60">More...</a><br /></td></tr>
+<tr class="separator:a9ec2b53ba4bea7e48ef459530b8c6d60"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab547dadc25582bec157b39de29d1419e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#ab547dadc25582bec157b39de29d1419e">SetUniform</a> (const std::string &amp;name, int i)</td></tr>
+<tr class="memdesc:ab547dadc25582bec157b39de29d1419e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes the int to the shader program and stores the result in the shader variable named name, which should be of type int. <a href="classmingfx_1_1_shader_program.html#ab547dadc25582bec157b39de29d1419e">More...</a><br /></td></tr>
+<tr class="separator:ab547dadc25582bec157b39de29d1419e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a707d2cb51a54151959c6570d6bfc7840"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a707d2cb51a54151959c6570d6bfc7840">SetUniform</a> (const std::string &amp;name, unsigned int ui)</td></tr>
+<tr class="memdesc:a707d2cb51a54151959c6570d6bfc7840"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes the unsigned int to the shader program and stores the result in the shader variable named name, which should be of type uint. <a href="classmingfx_1_1_shader_program.html#a707d2cb51a54151959c6570d6bfc7840">More...</a><br /></td></tr>
+<tr class="separator:a707d2cb51a54151959c6570d6bfc7840"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a680fa87cb30343bb56abc48a090e823c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a680fa87cb30343bb56abc48a090e823c">SetUniform</a> (const std::string &amp;name, float f)</td></tr>
+<tr class="memdesc:a680fa87cb30343bb56abc48a090e823c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes the float to the shader program and stores the result in the shader variable named name, which should be of type float. <a href="classmingfx_1_1_shader_program.html#a680fa87cb30343bb56abc48a090e823c">More...</a><br /></td></tr>
+<tr class="separator:a680fa87cb30343bb56abc48a090e823c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51cd1c1d194b2f5c07e81d4f579f2f2b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a51cd1c1d194b2f5c07e81d4f579f2f2b">SetUniformArray1</a> (const std::string &amp;name, int *i, int count)</td></tr>
+<tr class="memdesc:a51cd1c1d194b2f5c07e81d4f579f2f2b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count ints to the shader program and stores the result in the shader variable named name, which should be of type int name[count]. <a href="classmingfx_1_1_shader_program.html#a51cd1c1d194b2f5c07e81d4f579f2f2b">More...</a><br /></td></tr>
+<tr class="separator:a51cd1c1d194b2f5c07e81d4f579f2f2b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abba87d2b0baca89232dbd1d6331875de"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#abba87d2b0baca89232dbd1d6331875de">SetUniformArray1</a> (const std::string &amp;name, unsigned int *ui, int count)</td></tr>
+<tr class="memdesc:abba87d2b0baca89232dbd1d6331875de"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count unsigned ints to the shader program and stores the result in the shader variable named name, which should be of type uint name[count]. <a href="classmingfx_1_1_shader_program.html#abba87d2b0baca89232dbd1d6331875de">More...</a><br /></td></tr>
+<tr class="separator:abba87d2b0baca89232dbd1d6331875de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c7891252d6b6c40982b56543820cd19"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a5c7891252d6b6c40982b56543820cd19">SetUniformArray1</a> (const std::string &amp;name, float *f, int count)</td></tr>
+<tr class="memdesc:a5c7891252d6b6c40982b56543820cd19"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count floats to the shader program and stores the result in the shader variable named name, which should be of type float name[count]. <a href="classmingfx_1_1_shader_program.html#a5c7891252d6b6c40982b56543820cd19">More...</a><br /></td></tr>
+<tr class="separator:a5c7891252d6b6c40982b56543820cd19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9bab504c74a1c4258258b91afe9a9623"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a9bab504c74a1c4258258b91afe9a9623">SetUniformArray2</a> (const std::string &amp;name, int *i, int count)</td></tr>
+<tr class="memdesc:a9bab504c74a1c4258258b91afe9a9623"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count 2D int arrays to the shader program and stores the result in the shader variable named name, which should be of type ivec2 name[count]. <a href="classmingfx_1_1_shader_program.html#a9bab504c74a1c4258258b91afe9a9623">More...</a><br /></td></tr>
+<tr class="separator:a9bab504c74a1c4258258b91afe9a9623"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fdca4b0ccaa8a0b2c8c68fd7645727c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a6fdca4b0ccaa8a0b2c8c68fd7645727c">SetUniformArray2</a> (const std::string &amp;name, unsigned int *ui, int count)</td></tr>
+<tr class="memdesc:a6fdca4b0ccaa8a0b2c8c68fd7645727c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count 2D unsigned int arrays to the shader program and stores the result in the shader variable named name, which should be of type uivec2 name[count]. <a href="classmingfx_1_1_shader_program.html#a6fdca4b0ccaa8a0b2c8c68fd7645727c">More...</a><br /></td></tr>
+<tr class="separator:a6fdca4b0ccaa8a0b2c8c68fd7645727c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a93914cad6d8e751218c88010c51cf657"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a93914cad6d8e751218c88010c51cf657">SetUniformArray2</a> (const std::string &amp;name, float *f, int count)</td></tr>
+<tr class="memdesc:a93914cad6d8e751218c88010c51cf657"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count 2D float arrays to the shader program and stores the result in the shader variable named name, which should be of type vec2 name[count]. <a href="classmingfx_1_1_shader_program.html#a93914cad6d8e751218c88010c51cf657">More...</a><br /></td></tr>
+<tr class="separator:a93914cad6d8e751218c88010c51cf657"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac582a2aa74a83095e0b8e359ce432511"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#ac582a2aa74a83095e0b8e359ce432511">SetUniformArray3</a> (const std::string &amp;name, int *i, int count)</td></tr>
+<tr class="memdesc:ac582a2aa74a83095e0b8e359ce432511"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count 3D int arrays to the shader program and stores the result in the shader variable named name, which should be of type ivec3 name[count]. <a href="classmingfx_1_1_shader_program.html#ac582a2aa74a83095e0b8e359ce432511">More...</a><br /></td></tr>
+<tr class="separator:ac582a2aa74a83095e0b8e359ce432511"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8c31de93b17f050baecb5323a69bdbfa"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a8c31de93b17f050baecb5323a69bdbfa">SetUniformArray3</a> (const std::string &amp;name, unsigned int *ui, int count)</td></tr>
+<tr class="memdesc:a8c31de93b17f050baecb5323a69bdbfa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count 3D unsigned int arrays to the shader program and stores the result in the shader variable named name, which should be of type uivec3 name[count]. <a href="classmingfx_1_1_shader_program.html#a8c31de93b17f050baecb5323a69bdbfa">More...</a><br /></td></tr>
+<tr class="separator:a8c31de93b17f050baecb5323a69bdbfa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc84377716296a57299ebbc01884b65d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#afc84377716296a57299ebbc01884b65d">SetUniformArray3</a> (const std::string &amp;name, float *f, int count)</td></tr>
+<tr class="memdesc:afc84377716296a57299ebbc01884b65d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count 3D float arrays to the shader program and stores the result in the shader variable named name, which should be of type vec3 name[count]. <a href="classmingfx_1_1_shader_program.html#afc84377716296a57299ebbc01884b65d">More...</a><br /></td></tr>
+<tr class="separator:afc84377716296a57299ebbc01884b65d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab06ef4682f801fca080a8f67dc6345ba"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#ab06ef4682f801fca080a8f67dc6345ba">SetUniformArray4</a> (const std::string &amp;name, int *i, int count)</td></tr>
+<tr class="memdesc:ab06ef4682f801fca080a8f67dc6345ba"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count 4D int arrays to the shader program and stores the result in the shader variable named name, which should be of type ivec4 name[count]. <a href="classmingfx_1_1_shader_program.html#ab06ef4682f801fca080a8f67dc6345ba">More...</a><br /></td></tr>
+<tr class="separator:ab06ef4682f801fca080a8f67dc6345ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2854ad947f74432edc0b730462b7f695"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a2854ad947f74432edc0b730462b7f695">SetUniformArray4</a> (const std::string &amp;name, unsigned int *ui, int count)</td></tr>
+<tr class="memdesc:a2854ad947f74432edc0b730462b7f695"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count 4D unsigned int arrays to the shader program and stores the result in the shader variable named name, which should be of type uivec4 name[count]. <a href="classmingfx_1_1_shader_program.html#a2854ad947f74432edc0b730462b7f695">More...</a><br /></td></tr>
+<tr class="separator:a2854ad947f74432edc0b730462b7f695"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9710cf4c72a7321b9a1ff1b86ae42da1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a9710cf4c72a7321b9a1ff1b86ae42da1">SetUniformArray4</a> (const std::string &amp;name, float *f, int count)</td></tr>
+<tr class="memdesc:a9710cf4c72a7321b9a1ff1b86ae42da1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Passes an array of count 4D float arrays to the shader program and stores the result in the shader variable named name, which should be of type vec4 name[count]. <a href="classmingfx_1_1_shader_program.html#a9710cf4c72a7321b9a1ff1b86ae42da1">More...</a><br /></td></tr>
+<tr class="separator:a9710cf4c72a7321b9a1ff1b86ae42da1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e5a2659f66f29433b15748f36c61ea2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a4e5a2659f66f29433b15748f36c61ea2">BindTexture</a> (const std::string &amp;name, const <a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;tex)</td></tr>
+<tr class="memdesc:a4e5a2659f66f29433b15748f36c61ea2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binds a <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a> to a sampler2D in the shader program. This version automatically selects an available texture unit, i.e., one not already used by this shader program. <a href="classmingfx_1_1_shader_program.html#a4e5a2659f66f29433b15748f36c61ea2">More...</a><br /></td></tr>
+<tr class="separator:a4e5a2659f66f29433b15748f36c61ea2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af81d97c2843278eb40cdcdf8e5d54a96"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#af81d97c2843278eb40cdcdf8e5d54a96">BindTexture</a> (const std::string &amp;name, const <a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;tex, int texUnit)</td></tr>
+<tr class="memdesc:af81d97c2843278eb40cdcdf8e5d54a96"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binds a <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a> to a sampler2D in the shader program. This version allows you to specify the texture unit to use. <a href="classmingfx_1_1_shader_program.html#af81d97c2843278eb40cdcdf8e5d54a96">More...</a><br /></td></tr>
+<tr class="separator:af81d97c2843278eb40cdcdf8e5d54a96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e4d6db720bf22038270cf8c51cdf7da"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da">StopProgram</a> ()</td></tr>
+<tr class="memdesc:a2e4d6db720bf22038270cf8c51cdf7da"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call this after rendering geometry to deactivate the shader. <a href="classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da">More...</a><br /></td></tr>
+<tr class="separator:a2e4d6db720bf22038270cf8c51cdf7da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2eddd93e446ad2079d1c57676655ffbe"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html#a2eddd93e446ad2079d1c57676655ffbe">initialized</a> ()</td></tr>
+<tr class="memdesc:a2eddd93e446ad2079d1c57676655ffbe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns true if the shader program has been successfully compiled and linked. <a href="classmingfx_1_1_shader_program.html#a2eddd93e446ad2079d1c57676655ffbe">More...</a><br /></td></tr>
+<tr class="separator:a2eddd93e446ad2079d1c57676655ffbe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a0c3d86656c464223dc615cbec0943700"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c3d86656c464223dc615cbec0943700">&#9670;&nbsp;</a></span>ShaderProgram()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::ShaderProgram::ShaderProgram </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates an empty <a class="el" href="classmingfx_1_1_shader_program.html" title="A wrapper around GLSL shader programs.">ShaderProgram</a> object. </p>
+
+</div>
+</div>
+<a id="a96da0dede354f2511084eeb25428edb4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a96da0dede354f2511084eeb25428edb4">&#9670;&nbsp;</a></span>~ShaderProgram()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::ShaderProgram::~ShaderProgram </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="acd94fc12beb85fe57aa80d3b825018b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd94fc12beb85fe57aa80d3b825018b0">&#9670;&nbsp;</a></span>AddFragmentShaderFromFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::ShaderProgram::AddFragmentShaderFromFile </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>file</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Call during initialization but after the OpenGL context has been created (e.g., inside InitOpenGL()). This loads the shader from the file and compiles it. An error will be printed to stderr if there are any compilation errors. </p>
+
+</div>
+</div>
+<a id="a7a3063ec42798c076e1ab0c0e6411e9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7a3063ec42798c076e1ab0c0e6411e9c">&#9670;&nbsp;</a></span>AddFragmentShaderFromSource()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::ShaderProgram::AddFragmentShaderFromSource </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>code</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This loads and compiles a shader from a string. An error will be printed to stderr if there are any compilation errors. </p>
+
+</div>
+</div>
+<a id="a63ac061271fad9338e922389d4a179e5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a63ac061271fad9338e922389d4a179e5">&#9670;&nbsp;</a></span>AddVertexShaderFromFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::ShaderProgram::AddVertexShaderFromFile </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>file</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Call during initialization but after the OpenGL context has been created (e.g., inside InitOpenGL()). This loads the shader from the file and compiles it. An error will be printed to stderr if there are any compilation errors. </p>
+
+</div>
+</div>
+<a id="ab5fed4904a59c6e83ebb43aebf4c043d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5fed4904a59c6e83ebb43aebf4c043d">&#9670;&nbsp;</a></span>AddVertexShaderFromSource()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::ShaderProgram::AddVertexShaderFromSource </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>code</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This loads and compiles a shader from a string. An error will be printed to stderr if there are any compilation errors. </p>
+
+</div>
+</div>
+<a id="a4e5a2659f66f29433b15748f36c61ea2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e5a2659f66f29433b15748f36c61ea2">&#9670;&nbsp;</a></span>BindTexture() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::BindTexture </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;&#160;</td>
+ <td class="paramname"><em>tex</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Binds a <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a> to a sampler2D in the shader program. This version automatically selects an available texture unit, i.e., one not already used by this shader program. </p>
+
+</div>
+</div>
+<a id="af81d97c2843278eb40cdcdf8e5d54a96"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af81d97c2843278eb40cdcdf8e5d54a96">&#9670;&nbsp;</a></span>BindTexture() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::BindTexture </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;&#160;</td>
+ <td class="paramname"><em>tex</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>texUnit</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Binds a <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a> to a sampler2D in the shader program. This version allows you to specify the texture unit to use. </p>
+
+</div>
+</div>
+<a id="a2eddd93e446ad2079d1c57676655ffbe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2eddd93e446ad2079d1c57676655ffbe">&#9670;&nbsp;</a></span>initialized()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::ShaderProgram::initialized </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns true if the shader program has been successfully compiled and linked. </p>
+
+</div>
+</div>
+<a id="ad14c3a9a4ee1eef39f933bc46260c794"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad14c3a9a4ee1eef39f933bc46260c794">&#9670;&nbsp;</a></span>LinkProgram()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::ShaderProgram::LinkProgram </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Call this after adding vertex and fragment shaders in order to link them together to create the full shader program. An error will be printed to stderr if there are any linking errors. </p>
+
+</div>
+</div>
+<a id="a9ec2b53ba4bea7e48ef459530b8c6d60"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ec2b53ba4bea7e48ef459530b8c6d60">&#9670;&nbsp;</a></span>SetUniform() <span class="overload">[1/9]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniform </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>c</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes the r,g,b,a values of color c to the shader program and stores the result in the shader variable named name, which should be of type vec4. </p>
+
+</div>
+</div>
+<a id="a766988eac957e9d810fdf2cbd2eafae0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a766988eac957e9d810fdf2cbd2eafae0">&#9670;&nbsp;</a></span>SetUniform() <span class="overload">[2/9]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniform </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes the column-major 16 float values of matrix m to the shader program and stores the result in the shader variable named name, which should be of type mat4. </p>
+
+</div>
+</div>
+<a id="a461ba9368ad89fe1e9749b14b099027a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a461ba9368ad89fe1e9749b14b099027a">&#9670;&nbsp;</a></span>SetUniform() <span class="overload">[3/9]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniform </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes the x,y values of point p to the shader program and stores the result in the shader variable named name, which should be of type vec2. </p>
+
+</div>
+</div>
+<a id="ac59b3d0542ce45631876615eabf66487"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac59b3d0542ce45631876615eabf66487">&#9670;&nbsp;</a></span>SetUniform() <span class="overload">[4/9]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniform </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes the x,y,z,1 values of point p to the shader program and stores the result in the shader variable named name, which should be of type vec4. </p>
+
+</div>
+</div>
+<a id="aef58537d81bdb9d88a5f1c56a2b98b25"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aef58537d81bdb9d88a5f1c56a2b98b25">&#9670;&nbsp;</a></span>SetUniform() <span class="overload">[5/9]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniform </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes the x,y values of vector v to the shader program and stores the result in the shader variable named name, which should be of type vec2. </p>
+
+</div>
+</div>
+<a id="a0b3e6285354e007bf79a9ac1587f86f5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0b3e6285354e007bf79a9ac1587f86f5">&#9670;&nbsp;</a></span>SetUniform() <span class="overload">[6/9]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniform </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes the x,y,z,0 values of vector v to the shader program and stores the result in the shader variable named name, which should be of type vec4. </p>
+
+</div>
+</div>
+<a id="a680fa87cb30343bb56abc48a090e823c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a680fa87cb30343bb56abc48a090e823c">&#9670;&nbsp;</a></span>SetUniform() <span class="overload">[7/9]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniform </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>f</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes the float to the shader program and stores the result in the shader variable named name, which should be of type float. </p>
+
+</div>
+</div>
+<a id="ab547dadc25582bec157b39de29d1419e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab547dadc25582bec157b39de29d1419e">&#9670;&nbsp;</a></span>SetUniform() <span class="overload">[8/9]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniform </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>i</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes the int to the shader program and stores the result in the shader variable named name, which should be of type int. </p>
+
+</div>
+</div>
+<a id="a707d2cb51a54151959c6570d6bfc7840"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a707d2cb51a54151959c6570d6bfc7840">&#9670;&nbsp;</a></span>SetUniform() <span class="overload">[9/9]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniform </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned int&#160;</td>
+ <td class="paramname"><em>ui</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes the unsigned int to the shader program and stores the result in the shader variable named name, which should be of type uint. </p>
+
+</div>
+</div>
+<a id="a5c7891252d6b6c40982b56543820cd19"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5c7891252d6b6c40982b56543820cd19">&#9670;&nbsp;</a></span>SetUniformArray1() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray1 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>f</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count floats to the shader program and stores the result in the shader variable named name, which should be of type float name[count]. </p>
+
+</div>
+</div>
+<a id="a51cd1c1d194b2f5c07e81d4f579f2f2b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51cd1c1d194b2f5c07e81d4f579f2f2b">&#9670;&nbsp;</a></span>SetUniformArray1() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray1 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int *&#160;</td>
+ <td class="paramname"><em>i</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count ints to the shader program and stores the result in the shader variable named name, which should be of type int name[count]. </p>
+
+</div>
+</div>
+<a id="abba87d2b0baca89232dbd1d6331875de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abba87d2b0baca89232dbd1d6331875de">&#9670;&nbsp;</a></span>SetUniformArray1() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray1 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned int *&#160;</td>
+ <td class="paramname"><em>ui</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count unsigned ints to the shader program and stores the result in the shader variable named name, which should be of type uint name[count]. </p>
+
+</div>
+</div>
+<a id="a93914cad6d8e751218c88010c51cf657"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a93914cad6d8e751218c88010c51cf657">&#9670;&nbsp;</a></span>SetUniformArray2() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray2 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>f</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count 2D float arrays to the shader program and stores the result in the shader variable named name, which should be of type vec2 name[count]. </p>
+
+</div>
+</div>
+<a id="a9bab504c74a1c4258258b91afe9a9623"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9bab504c74a1c4258258b91afe9a9623">&#9670;&nbsp;</a></span>SetUniformArray2() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray2 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int *&#160;</td>
+ <td class="paramname"><em>i</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count 2D int arrays to the shader program and stores the result in the shader variable named name, which should be of type ivec2 name[count]. </p>
+
+</div>
+</div>
+<a id="a6fdca4b0ccaa8a0b2c8c68fd7645727c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6fdca4b0ccaa8a0b2c8c68fd7645727c">&#9670;&nbsp;</a></span>SetUniformArray2() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray2 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned int *&#160;</td>
+ <td class="paramname"><em>ui</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count 2D unsigned int arrays to the shader program and stores the result in the shader variable named name, which should be of type uivec2 name[count]. </p>
+
+</div>
+</div>
+<a id="afc84377716296a57299ebbc01884b65d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc84377716296a57299ebbc01884b65d">&#9670;&nbsp;</a></span>SetUniformArray3() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray3 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>f</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count 3D float arrays to the shader program and stores the result in the shader variable named name, which should be of type vec3 name[count]. </p>
+
+</div>
+</div>
+<a id="ac582a2aa74a83095e0b8e359ce432511"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac582a2aa74a83095e0b8e359ce432511">&#9670;&nbsp;</a></span>SetUniformArray3() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray3 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int *&#160;</td>
+ <td class="paramname"><em>i</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count 3D int arrays to the shader program and stores the result in the shader variable named name, which should be of type ivec3 name[count]. </p>
+
+</div>
+</div>
+<a id="a8c31de93b17f050baecb5323a69bdbfa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8c31de93b17f050baecb5323a69bdbfa">&#9670;&nbsp;</a></span>SetUniformArray3() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray3 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned int *&#160;</td>
+ <td class="paramname"><em>ui</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count 3D unsigned int arrays to the shader program and stores the result in the shader variable named name, which should be of type uivec3 name[count]. </p>
+
+</div>
+</div>
+<a id="a9710cf4c72a7321b9a1ff1b86ae42da1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9710cf4c72a7321b9a1ff1b86ae42da1">&#9670;&nbsp;</a></span>SetUniformArray4() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray4 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>f</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count 4D float arrays to the shader program and stores the result in the shader variable named name, which should be of type vec4 name[count]. </p>
+
+</div>
+</div>
+<a id="ab06ef4682f801fca080a8f67dc6345ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab06ef4682f801fca080a8f67dc6345ba">&#9670;&nbsp;</a></span>SetUniformArray4() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray4 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int *&#160;</td>
+ <td class="paramname"><em>i</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count 4D int arrays to the shader program and stores the result in the shader variable named name, which should be of type ivec4 name[count]. </p>
+
+</div>
+</div>
+<a id="a2854ad947f74432edc0b730462b7f695"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2854ad947f74432edc0b730462b7f695">&#9670;&nbsp;</a></span>SetUniformArray4() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::SetUniformArray4 </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned int *&#160;</td>
+ <td class="paramname"><em>ui</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Passes an array of count 4D unsigned int arrays to the shader program and stores the result in the shader variable named name, which should be of type uivec4 name[count]. </p>
+
+</div>
+</div>
+<a id="a2e4d6db720bf22038270cf8c51cdf7da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2e4d6db720bf22038270cf8c51cdf7da">&#9670;&nbsp;</a></span>StopProgram()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::StopProgram </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Call this after rendering geometry to deactivate the shader. </p>
+
+</div>
+</div>
+<a id="af1c968f1c79f70e183c9d1239d3d205e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af1c968f1c79f70e183c9d1239d3d205e">&#9670;&nbsp;</a></span>UseProgram()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::ShaderProgram::UseProgram </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Call this first to make the shader program active, then call <a class="el" href="classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a" title="Passes the x,y values of point p to the shader program and stores the result in the shader variable n...">SetUniform()</a> to pass data from your C++ program into the shader code via the named uniform variables that appear in the code. Then render whatever geometry you wish with your own glDrawArrays() call(s). Finally, call <a class="el" href="classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da" title="Call this after rendering geometry to deactivate the shader.">StopProgram()</a> to turn off the shader program. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="shader__program_8h_source.html">shader_program.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_text_shader-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_text_shader-members.html
new file mode 100644
index 0000000..d8cbc90
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_text_shader-members.html
@@ -0,0 +1,102 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_text_shader.html">TextShader</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::TextShader Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_text_shader.html">mingfx::TextShader</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html#a2caaaf2decfac523b476951474e9a359">Draw3D</a>(const Matrix4 &amp;model, const Matrix4 &amp;view, const Matrix4 &amp;projection, const std::string &amp;text, TextFormat format, bool cache=false)</td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html">mingfx::TextShader</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c">HorizAlign</a> enum name</td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html">mingfx::TextShader</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html#ad60a8b572adc30dad47e2d163dc603a3">Init</a>(const std::string &amp;font_file, int native_font_size)</td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html">mingfx::TextShader</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html#a707b2b36547db78d19139575003c8a0d">native_font_size</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html">mingfx::TextShader</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html#ac4e9a150311fe6d74e9f6214ebeb6b28">TextExtents</a>(const std::string &amp;text, TextFormat format, bool cache=false)</td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html">mingfx::TextShader</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html#a0ec5a6ba22abb3f86c611107925fca67">TextShader</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html">mingfx::TextShader</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a">VertAlign</a> enum name</td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html">mingfx::TextShader</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html#a457f7a42eceb957cdb103664dd864feb">~TextShader</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader.html">mingfx::TextShader</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_text_shader.html b/dev/MinGfx/docs/html/classmingfx_1_1_text_shader.html
new file mode 100644
index 0000000..deef67e
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_text_shader.html
@@ -0,0 +1,377 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::TextShader Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_text_shader.html">TextShader</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#pub-types">Public Types</a> &#124;
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_text_shader-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::TextShader Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock">
+<p class="definition">Definition at line <a class="el" href="text__shader_8h_source.html#l00036">36</a> of file <a class="el" href="text__shader_8h_source.html">text_shader.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="text__shader_8h_source.html">text_shader.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">TextFormat</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr class="memitem:af464d970e6475a2176f21c3f4b24c63c"><td class="memItemLeft" align="right" valign="top">enum class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c">HorizAlign</a> { <a class="el" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca8e6d89d62375493a3cc1fb5dba289f92">HORIZ_ALIGN_LEFT</a>
+, <a class="el" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca5089ab07b80a999b45667e5711cae1f4">HORIZ_ALIGN_CENTER</a>
+, <a class="el" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca6999f9ad8384a34813e7535baf44f78b">HORIZ_ALIGN_RIGHT</a>
+ }</td></tr>
+<tr class="separator:af464d970e6475a2176f21c3f4b24c63c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7624918a2d157cf2880fc8858c00db2a"><td class="memItemLeft" align="right" valign="top">enum class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a">VertAlign</a> { <a class="el" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa970e4fcd7c426e6cd49709119fba6e04">VERT_ALIGN_TOP</a>
+, <a class="el" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aac49ae9c9553284e44f90228b9ce647af">VERT_ALIGN_CENTER</a>
+, <a class="el" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa0400d0d77ea6770b313eedaf36fe71bb">VERT_ALIGN_BASELINE</a>
+, <a class="el" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa080e12cacc0f01b361c8b93c73dd2e28">VERT_ALIGN_BOTTOM</a>
+ }</td></tr>
+<tr class="separator:a7624918a2d157cf2880fc8858c00db2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a0ec5a6ba22abb3f86c611107925fca67"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader.html#a0ec5a6ba22abb3f86c611107925fca67">TextShader</a> ()</td></tr>
+<tr class="separator:a0ec5a6ba22abb3f86c611107925fca67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a457f7a42eceb957cdb103664dd864feb"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader.html#a457f7a42eceb957cdb103664dd864feb">~TextShader</a> ()</td></tr>
+<tr class="separator:a457f7a42eceb957cdb103664dd864feb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad60a8b572adc30dad47e2d163dc603a3"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader.html#ad60a8b572adc30dad47e2d163dc603a3">Init</a> (const std::string &amp;font_file, int <a class="el" href="classmingfx_1_1_text_shader.html#a707b2b36547db78d19139575003c8a0d">native_font_size</a>)</td></tr>
+<tr class="memdesc:ad60a8b572adc30dad47e2d163dc603a3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call this from within the InitOpenGL() function since it will initialize not just the Font's internal data but also an OpenGL texture to be stored on the graphics card. Internally, this uses the stb_truetype library to load true type fonts (files with a .ttf extension). <a href="classmingfx_1_1_text_shader.html#ad60a8b572adc30dad47e2d163dc603a3">More...</a><br /></td></tr>
+<tr class="separator:ad60a8b572adc30dad47e2d163dc603a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2caaaf2decfac523b476951474e9a359"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader.html#a2caaaf2decfac523b476951474e9a359">Draw3D</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;model, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;view, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projection, const std::string &amp;text, <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">TextFormat</a> format, bool cache=false)</td></tr>
+<tr class="separator:a2caaaf2decfac523b476951474e9a359"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac4e9a150311fe6d74e9f6214ebeb6b28"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader.html#ac4e9a150311fe6d74e9f6214ebeb6b28">TextExtents</a> (const std::string &amp;text, <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">TextFormat</a> format, bool cache=false)</td></tr>
+<tr class="separator:ac4e9a150311fe6d74e9f6214ebeb6b28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a707b2b36547db78d19139575003c8a0d"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader.html#a707b2b36547db78d19139575003c8a0d">native_font_size</a> ()</td></tr>
+<tr class="separator:a707b2b36547db78d19139575003c8a0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Enumeration Documentation</h2>
+<a id="af464d970e6475a2176f21c3f4b24c63c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af464d970e6475a2176f21c3f4b24c63c">&#9670;&nbsp;</a></span>HorizAlign</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c">mingfx::TextShader::HorizAlign</a></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">strong</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="af464d970e6475a2176f21c3f4b24c63ca8e6d89d62375493a3cc1fb5dba289f92"></a>HORIZ_ALIGN_LEFT&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af464d970e6475a2176f21c3f4b24c63ca5089ab07b80a999b45667e5711cae1f4"></a>HORIZ_ALIGN_CENTER&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af464d970e6475a2176f21c3f4b24c63ca6999f9ad8384a34813e7535baf44f78b"></a>HORIZ_ALIGN_RIGHT&#160;</td><td class="fielddoc"></td></tr>
+</table>
+
+<p class="definition">Definition at line <a class="el" href="text__shader_8h_source.html#l00047">47</a> of file <a class="el" href="text__shader_8h_source.html">text_shader.h</a>.</p>
+
+</div>
+</div>
+<a id="a7624918a2d157cf2880fc8858c00db2a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7624918a2d157cf2880fc8858c00db2a">&#9670;&nbsp;</a></span>VertAlign</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a">mingfx::TextShader::VertAlign</a></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">strong</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a7624918a2d157cf2880fc8858c00db2aa970e4fcd7c426e6cd49709119fba6e04"></a>VERT_ALIGN_TOP&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a7624918a2d157cf2880fc8858c00db2aac49ae9c9553284e44f90228b9ce647af"></a>VERT_ALIGN_CENTER&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a7624918a2d157cf2880fc8858c00db2aa0400d0d77ea6770b313eedaf36fe71bb"></a>VERT_ALIGN_BASELINE&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a7624918a2d157cf2880fc8858c00db2aa080e12cacc0f01b361c8b93c73dd2e28"></a>VERT_ALIGN_BOTTOM&#160;</td><td class="fielddoc"></td></tr>
+</table>
+
+<p class="definition">Definition at line <a class="el" href="text__shader_8h_source.html#l00053">53</a> of file <a class="el" href="text__shader_8h_source.html">text_shader.h</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a0ec5a6ba22abb3f86c611107925fca67"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0ec5a6ba22abb3f86c611107925fca67">&#9670;&nbsp;</a></span>TextShader()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::TextShader::TextShader </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a457f7a42eceb957cdb103664dd864feb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a457f7a42eceb957cdb103664dd864feb">&#9670;&nbsp;</a></span>~TextShader()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::TextShader::~TextShader </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a2caaaf2decfac523b476951474e9a359"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2caaaf2decfac523b476951474e9a359">&#9670;&nbsp;</a></span>Draw3D()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::TextShader::Draw3D </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>model</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>view</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projection</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">TextFormat</a>&#160;</td>
+ <td class="paramname"><em>format</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">bool&#160;</td>
+ <td class="paramname"><em>cache</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ad60a8b572adc30dad47e2d163dc603a3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad60a8b572adc30dad47e2d163dc603a3">&#9670;&nbsp;</a></span>Init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::TextShader::Init </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>font_file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>native_font_size</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Call this from within the InitOpenGL() function since it will initialize not just the Font's internal data but also an OpenGL texture to be stored on the graphics card. Internally, this uses the stb_truetype library to load true type fonts (files with a .ttf extension). </p>
+
+</div>
+</div>
+<a id="a707b2b36547db78d19139575003c8a0d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a707b2b36547db78d19139575003c8a0d">&#9670;&nbsp;</a></span>native_font_size()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::TextShader::native_font_size </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac4e9a150311fe6d74e9f6214ebeb6b28"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac4e9a150311fe6d74e9f6214ebeb6b28">&#9670;&nbsp;</a></span>TextExtents()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::TextShader::TextExtents </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">TextFormat</a>&#160;</td>
+ <td class="paramname"><em>format</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">bool&#160;</td>
+ <td class="paramname"><em>cache</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="text__shader_8h_source.html">text_shader.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_text_shader_1_1_text_format-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_text_shader_1_1_text_format-members.html
new file mode 100644
index 0000000..83a6563
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_text_shader_1_1_text_format-members.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_text_shader.html">TextShader</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">TextFormat</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::TextShader::TextFormat Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">mingfx::TextShader::TextFormat</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#af0483874ac3fcea58b6ff99ef6644ff7">color</a></td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">mingfx::TextShader::TextFormat</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#acde55d28b0446e788e6c68b85df83066">h_align</a></td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">mingfx::TextShader::TextFormat</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#aeecda817624276f0cfb812ddcdbbc2f0">size</a></td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">mingfx::TextShader::TextFormat</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#a2b7d7e2e540c881952b97b8948b49fcb">TextFormat</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">mingfx::TextShader::TextFormat</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#a8455382a6829022020eb307ae9168bd7">v_align</a></td><td class="entry"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">mingfx::TextShader::TextFormat</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_text_shader_1_1_text_format.html b/dev/MinGfx/docs/html/classmingfx_1_1_text_shader_1_1_text_format.html
new file mode 100644
index 0000000..2a238e2
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_text_shader_1_1_text_format.html
@@ -0,0 +1,213 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::TextShader::TextFormat Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_text_shader.html">TextShader</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">TextFormat</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="classmingfx_1_1_text_shader_1_1_text_format-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::TextShader::TextFormat Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock">
+<p class="definition">Definition at line <a class="el" href="text__shader_8h_source.html#l00060">60</a> of file <a class="el" href="text__shader_8h_source.html">text_shader.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="text__shader_8h_source.html">text_shader.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a2b7d7e2e540c881952b97b8948b49fcb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#a2b7d7e2e540c881952b97b8948b49fcb">TextFormat</a> ()</td></tr>
+<tr class="separator:a2b7d7e2e540c881952b97b8948b49fcb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:aeecda817624276f0cfb812ddcdbbc2f0"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#aeecda817624276f0cfb812ddcdbbc2f0">size</a></td></tr>
+<tr class="separator:aeecda817624276f0cfb812ddcdbbc2f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0483874ac3fcea58b6ff99ef6644ff7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#af0483874ac3fcea58b6ff99ef6644ff7">color</a></td></tr>
+<tr class="separator:af0483874ac3fcea58b6ff99ef6644ff7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acde55d28b0446e788e6c68b85df83066"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c">HorizAlign</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#acde55d28b0446e788e6c68b85df83066">h_align</a></td></tr>
+<tr class="separator:acde55d28b0446e788e6c68b85df83066"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8455382a6829022020eb307ae9168bd7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a">VertAlign</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#a8455382a6829022020eb307ae9168bd7">v_align</a></td></tr>
+<tr class="separator:a8455382a6829022020eb307ae9168bd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a2b7d7e2e540c881952b97b8948b49fcb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b7d7e2e540c881952b97b8948b49fcb">&#9670;&nbsp;</a></span>TextFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::TextShader::TextFormat::TextFormat </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="text__shader_8h_source.html#l00063">63</a> of file <a class="el" href="text__shader_8h_source.html">text_shader.h</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a id="af0483874ac3fcea58b6ff99ef6644ff7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af0483874ac3fcea58b6ff99ef6644ff7">&#9670;&nbsp;</a></span>color</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_color.html">Color</a> mingfx::TextShader::TextFormat::color</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="text__shader_8h_source.html#l00070">70</a> of file <a class="el" href="text__shader_8h_source.html">text_shader.h</a>.</p>
+
+</div>
+</div>
+<a id="acde55d28b0446e788e6c68b85df83066"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acde55d28b0446e788e6c68b85df83066">&#9670;&nbsp;</a></span>h_align</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c">HorizAlign</a> mingfx::TextShader::TextFormat::h_align</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="text__shader_8h_source.html#l00071">71</a> of file <a class="el" href="text__shader_8h_source.html">text_shader.h</a>.</p>
+
+</div>
+</div>
+<a id="aeecda817624276f0cfb812ddcdbbc2f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeecda817624276f0cfb812ddcdbbc2f0">&#9670;&nbsp;</a></span>size</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::TextShader::TextFormat::size</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="text__shader_8h_source.html#l00069">69</a> of file <a class="el" href="text__shader_8h_source.html">text_shader.h</a>.</p>
+
+</div>
+</div>
+<a id="a8455382a6829022020eb307ae9168bd7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8455382a6829022020eb307ae9168bd7">&#9670;&nbsp;</a></span>v_align</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a">VertAlign</a> mingfx::TextShader::TextFormat::v_align</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="text__shader_8h_source.html#l00072">72</a> of file <a class="el" href="text__shader_8h_source.html">text_shader.h</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="text__shader_8h_source.html">text_shader.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_texture2_d-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_texture2_d-members.html
new file mode 100644
index 0000000..b5e46ec
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_texture2_d-members.html
@@ -0,0 +1,110 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::Texture2D Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#af0052203fcfd9bbb903a40d14700b13b">filter_mode</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88">height</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#aba57b01065096fe9f6483e8f68622944">InitFromBytes</a>(int width, int height, const unsigned char *data)</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#a8eded044ccdf9bd3e1e5bcfe74526bdc">InitFromFile</a>(const std::string &amp;filename)</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#aee8a0aad1795680cb840ffcf544ed7b8">InitFromFloats</a>(int width, int height, const float *data)</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#a15d5c319cf7e012e703668f4d4e7be87">initialized</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#ad4e0faadfe016e6ee501e66fc0244504">opengl_id</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b">Pixel</a>(int x, int y) const</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#a4a3b2b550fefdf79f0fb392b04e7b013">set_filter_mode</a>(GLenum filterMode)</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#aa5cbe3396e4560ec0746e91dbc55bc9f">set_wrap_mode</a>(GLenum wrapMode)</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d">Texture2D</a>(GLenum wrapMode=GL_REPEAT, GLenum filterMode=GL_LINEAR)</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#a0783ad70829ef353aa92344d320b107c">UpdateFromBytes</a>(const unsigned char *data)</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#ad7640f0cbda6398a6bb80202b80dd693">UpdateFromFloats</a>(const float *data)</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869">width</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#a1c8827426f43343c0ad171e181a741ea">wrap_mode</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html#aab734dbbcf6211507ab65d5bb94a4ef9">~Texture2D</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_texture2_d.html b/dev/MinGfx/docs/html/classmingfx_1_1_texture2_d.html
new file mode 100644
index 0000000..a72804d
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_texture2_d.html
@@ -0,0 +1,540 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::Texture2D Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_texture2_d-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::Texture2D Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A wrapper around a 2D texture that supports loading images from files or setting texture color data directly. </p>
+<p>Example: </p><div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d">Texture2D</a> tex1;</div>
+<div class="line"><a class="code" href="classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d">Texture2D</a> tex2(GL_CLAMP_TO_EDGE);</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::InitOpenGL() {</div>
+<div class="line"> std::vector&lt;std::string&gt; search_path;</div>
+<div class="line"> search_path.push_back(<span class="stringliteral">&quot;.&quot;</span>);</div>
+<div class="line"> search_path.push_back(<span class="stringliteral">&quot;./data&quot;</span>);</div>
+<div class="line"> search_path.push_back(<span class="stringliteral">&quot;./shaders&quot;</span>);</div>
+<div class="line"> tex1.InitFromFile(<a class="code" href="classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1">Platform::FindFile</a>(<span class="stringliteral">&quot;earth-2k.png&quot;</span>, search_path));</div>
+<div class="line"> tex2.InitFromFile(<a class="code" href="classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1">Platform::FindFile</a>(<span class="stringliteral">&quot;toon-ramp.png&quot;</span>, search_path));</div>
+<div class="line">}</div>
+<div class="ttc" id="aclassmingfx_1_1_platform_html_a32a392f4bac832c95fabc2d10bd03ad1"><div class="ttname"><a href="classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1">mingfx::Platform::FindFile</a></div><div class="ttdeci">static std::string FindFile(const std::string &amp;basename, const std::vector&lt; std::string &gt; &amp;searchpath)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_aa15b86ec3b7312842c220b081c39980d"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d">mingfx::Texture2D::Texture2D</a></div><div class="ttdeci">Texture2D(GLenum wrapMode=GL_REPEAT, GLenum filterMode=GL_LINEAR)</div><div class="ttdoc">Creates an empty texture. Optional parameters can be provided to set the texture wrap mode and filter...</div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="texture2d_8h_source.html#l00042">42</a> of file <a class="el" href="texture2d_8h_source.html">texture2d.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="texture2d_8h_source.html">texture2d.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:aa15b86ec3b7312842c220b081c39980d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d">Texture2D</a> (GLenum wrapMode=GL_REPEAT, GLenum filterMode=GL_LINEAR)</td></tr>
+<tr class="memdesc:aa15b86ec3b7312842c220b081c39980d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates an empty texture. Optional parameters can be provided to set the texture wrap mode and filter mode. <a href="classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d">More...</a><br /></td></tr>
+<tr class="separator:aa15b86ec3b7312842c220b081c39980d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab734dbbcf6211507ab65d5bb94a4ef9"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#aab734dbbcf6211507ab65d5bb94a4ef9">~Texture2D</a> ()</td></tr>
+<tr class="separator:aab734dbbcf6211507ab65d5bb94a4ef9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8eded044ccdf9bd3e1e5bcfe74526bdc"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#a8eded044ccdf9bd3e1e5bcfe74526bdc">InitFromFile</a> (const std::string &amp;filename)</td></tr>
+<tr class="memdesc:a8eded044ccdf9bd3e1e5bcfe74526bdc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call this from within the InitOpenGL() function since it will initialize not just the <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a>'s internal data but also an OpenGL texture to be stored on the graphics card. Internally, this uses the stbi library to load images. It supports png, jpg, bmp, and other file formats. <a href="classmingfx_1_1_texture2_d.html#a8eded044ccdf9bd3e1e5bcfe74526bdc">More...</a><br /></td></tr>
+<tr class="separator:a8eded044ccdf9bd3e1e5bcfe74526bdc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba57b01065096fe9f6483e8f68622944"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#aba57b01065096fe9f6483e8f68622944">InitFromBytes</a> (int <a class="el" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869">width</a>, int <a class="el" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88">height</a>, const unsigned char *data)</td></tr>
+<tr class="memdesc:aba57b01065096fe9f6483e8f68622944"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call this from within the InitOpenGL() function since it will initialize not just the <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a>'s internal data but also an OpenGL texture to be stored on the graphics card. With this version of Init, you may pass in your own pointer to color data. The data argument must point to an array of 4-channel color data stored as unsigned chars in RGBA format. You are responsible for managing the memory for this array. If you will never call <a class="el" href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b" title="Returns the color at the specified pixel. The top left corner of the image is (0,0) and the bottom ri...">Pixel()</a>, then it is safe to free data as soon as this function returns. Otherwise, you need to make sure data does not change in memory until you destroy the <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a> object. <a href="classmingfx_1_1_texture2_d.html#aba57b01065096fe9f6483e8f68622944">More...</a><br /></td></tr>
+<tr class="separator:aba57b01065096fe9f6483e8f68622944"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aee8a0aad1795680cb840ffcf544ed7b8"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#aee8a0aad1795680cb840ffcf544ed7b8">InitFromFloats</a> (int <a class="el" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869">width</a>, int <a class="el" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88">height</a>, const float *data)</td></tr>
+<tr class="memdesc:aee8a0aad1795680cb840ffcf544ed7b8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call this from within the InitOpenGL() function since it will initialize not just the <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a>'s internal data but also an OpenGL texture to be stored on the graphics card. With this version of Init, you may pass in your own pointer to color data. The data argument must point to an array of 4-channel color data stored as floats in RGBA format. You are responsible for managing the memory for this array. If you will never call <a class="el" href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b" title="Returns the color at the specified pixel. The top left corner of the image is (0,0) and the bottom ri...">Pixel()</a>, then it is safe to free data as soon as this function returns. Otherwise, you need to make sure data does not change in memory until you destroy the <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a> object. <a href="classmingfx_1_1_texture2_d.html#aee8a0aad1795680cb840ffcf544ed7b8">More...</a><br /></td></tr>
+<tr class="separator:aee8a0aad1795680cb840ffcf544ed7b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0783ad70829ef353aa92344d320b107c"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#a0783ad70829ef353aa92344d320b107c">UpdateFromBytes</a> (const unsigned char *data)</td></tr>
+<tr class="memdesc:a0783ad70829ef353aa92344d320b107c"><td class="mdescLeft">&#160;</td><td class="mdescRight">This function may be called to re-read the texture data from an array formated the same as in InitFromBytes. The width and height of the texture must remain the same. <a href="classmingfx_1_1_texture2_d.html#a0783ad70829ef353aa92344d320b107c">More...</a><br /></td></tr>
+<tr class="separator:a0783ad70829ef353aa92344d320b107c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad7640f0cbda6398a6bb80202b80dd693"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#ad7640f0cbda6398a6bb80202b80dd693">UpdateFromFloats</a> (const float *data)</td></tr>
+<tr class="memdesc:ad7640f0cbda6398a6bb80202b80dd693"><td class="mdescLeft">&#160;</td><td class="mdescRight">This function may be called to re-read the texture data from an array formated the same as in InitFromFloats. The width and height of the texture must remain the same. <a href="classmingfx_1_1_texture2_d.html#ad7640f0cbda6398a6bb80202b80dd693">More...</a><br /></td></tr>
+<tr class="separator:ad7640f0cbda6398a6bb80202b80dd693"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15d5c319cf7e012e703668f4d4e7be87"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#a15d5c319cf7e012e703668f4d4e7be87">initialized</a> () const</td></tr>
+<tr class="memdesc:a15d5c319cf7e012e703668f4d4e7be87"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns true if the texture data has been successfully transferred to OpenGL. <a href="classmingfx_1_1_texture2_d.html#a15d5c319cf7e012e703668f4d4e7be87">More...</a><br /></td></tr>
+<tr class="separator:a15d5c319cf7e012e703668f4d4e7be87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a401629d948aa144be81b94fe21938869"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869">width</a> () const</td></tr>
+<tr class="memdesc:a401629d948aa144be81b94fe21938869"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the width in pixels of the texture. <a href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869">More...</a><br /></td></tr>
+<tr class="separator:a401629d948aa144be81b94fe21938869"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c396193b466053f23803894039d8d88"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88">height</a> () const</td></tr>
+<tr class="memdesc:a3c396193b466053f23803894039d8d88"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the height in pixels of the texture. <a href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88">More...</a><br /></td></tr>
+<tr class="separator:a3c396193b466053f23803894039d8d88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4e0faadfe016e6ee501e66fc0244504"><td class="memItemLeft" align="right" valign="top">GLuint&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#ad4e0faadfe016e6ee501e66fc0244504">opengl_id</a> () const</td></tr>
+<tr class="memdesc:ad4e0faadfe016e6ee501e66fc0244504"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the unsigned int used as the texture handle by OpenGL. <a href="classmingfx_1_1_texture2_d.html#ad4e0faadfe016e6ee501e66fc0244504">More...</a><br /></td></tr>
+<tr class="separator:ad4e0faadfe016e6ee501e66fc0244504"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c8827426f43343c0ad171e181a741ea"><td class="memItemLeft" align="right" valign="top">GLenum&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#a1c8827426f43343c0ad171e181a741ea">wrap_mode</a> () const</td></tr>
+<tr class="memdesc:a1c8827426f43343c0ad171e181a741ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns an enumerated constant for the OpenGL wrap mode used by the texture. <a href="classmingfx_1_1_texture2_d.html#a1c8827426f43343c0ad171e181a741ea">More...</a><br /></td></tr>
+<tr class="separator:a1c8827426f43343c0ad171e181a741ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0052203fcfd9bbb903a40d14700b13b"><td class="memItemLeft" align="right" valign="top">GLenum&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#af0052203fcfd9bbb903a40d14700b13b">filter_mode</a> () const</td></tr>
+<tr class="memdesc:af0052203fcfd9bbb903a40d14700b13b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns an enumerated constant for the OpenGL filter mode used by the texture. <a href="classmingfx_1_1_texture2_d.html#af0052203fcfd9bbb903a40d14700b13b">More...</a><br /></td></tr>
+<tr class="separator:af0052203fcfd9bbb903a40d14700b13b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5cbe3396e4560ec0746e91dbc55bc9f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#aa5cbe3396e4560ec0746e91dbc55bc9f">set_wrap_mode</a> (GLenum wrapMode)</td></tr>
+<tr class="memdesc:aa5cbe3396e4560ec0746e91dbc55bc9f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Uses the OpenGL texture wrap mode arguments. <a href="classmingfx_1_1_texture2_d.html#aa5cbe3396e4560ec0746e91dbc55bc9f">More...</a><br /></td></tr>
+<tr class="separator:aa5cbe3396e4560ec0746e91dbc55bc9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a3b2b550fefdf79f0fb392b04e7b013"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#a4a3b2b550fefdf79f0fb392b04e7b013">set_filter_mode</a> (GLenum filterMode)</td></tr>
+<tr class="memdesc:a4a3b2b550fefdf79f0fb392b04e7b013"><td class="mdescLeft">&#160;</td><td class="mdescRight">Uses the OpenGL texture filter mode arguments. <a href="classmingfx_1_1_texture2_d.html#a4a3b2b550fefdf79f0fb392b04e7b013">More...</a><br /></td></tr>
+<tr class="separator:a4a3b2b550fefdf79f0fb392b04e7b013"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1e843f3d8904f9c7a99f7614f87de73b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_color.html">Color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b">Pixel</a> (int x, int y) const</td></tr>
+<tr class="memdesc:a1e843f3d8904f9c7a99f7614f87de73b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the color at the specified pixel. The top left corner of the image is (0,0) and the bottom right is (<a class="el" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869" title="Returns the width in pixels of the texture.">width()</a>-1, <a class="el" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88" title="Returns the height in pixels of the texture.">height()</a>-1). <a href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b">More...</a><br /></td></tr>
+<tr class="separator:a1e843f3d8904f9c7a99f7614f87de73b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="aa15b86ec3b7312842c220b081c39980d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa15b86ec3b7312842c220b081c39980d">&#9670;&nbsp;</a></span>Texture2D()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Texture2D::Texture2D </td>
+ <td>(</td>
+ <td class="paramtype">GLenum&#160;</td>
+ <td class="paramname"><em>wrapMode</em> = <code>GL_REPEAT</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">GLenum&#160;</td>
+ <td class="paramname"><em>filterMode</em> = <code>GL_LINEAR</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates an empty texture. Optional parameters can be provided to set the texture wrap mode and filter mode. </p>
+
+</div>
+</div>
+<a id="aab734dbbcf6211507ab65d5bb94a4ef9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aab734dbbcf6211507ab65d5bb94a4ef9">&#9670;&nbsp;</a></span>~Texture2D()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::Texture2D::~Texture2D </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="af0052203fcfd9bbb903a40d14700b13b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af0052203fcfd9bbb903a40d14700b13b">&#9670;&nbsp;</a></span>filter_mode()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">GLenum mingfx::Texture2D::filter_mode </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns an enumerated constant for the OpenGL filter mode used by the texture. </p>
+
+</div>
+</div>
+<a id="a3c396193b466053f23803894039d8d88"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3c396193b466053f23803894039d8d88">&#9670;&nbsp;</a></span>height()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int mingfx::Texture2D::height </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the height in pixels of the texture. </p>
+
+</div>
+</div>
+<a id="aba57b01065096fe9f6483e8f68622944"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba57b01065096fe9f6483e8f68622944">&#9670;&nbsp;</a></span>InitFromBytes()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Texture2D::InitFromBytes </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>height</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const unsigned char *&#160;</td>
+ <td class="paramname"><em>data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Call this from within the InitOpenGL() function since it will initialize not just the <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a>'s internal data but also an OpenGL texture to be stored on the graphics card. With this version of Init, you may pass in your own pointer to color data. The data argument must point to an array of 4-channel color data stored as unsigned chars in RGBA format. You are responsible for managing the memory for this array. If you will never call <a class="el" href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b" title="Returns the color at the specified pixel. The top left corner of the image is (0,0) and the bottom ri...">Pixel()</a>, then it is safe to free data as soon as this function returns. Otherwise, you need to make sure data does not change in memory until you destroy the <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a> object. </p>
+
+</div>
+</div>
+<a id="a8eded044ccdf9bd3e1e5bcfe74526bdc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8eded044ccdf9bd3e1e5bcfe74526bdc">&#9670;&nbsp;</a></span>InitFromFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Texture2D::InitFromFile </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>filename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Call this from within the InitOpenGL() function since it will initialize not just the <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a>'s internal data but also an OpenGL texture to be stored on the graphics card. Internally, this uses the stbi library to load images. It supports png, jpg, bmp, and other file formats. </p>
+
+</div>
+</div>
+<a id="aee8a0aad1795680cb840ffcf544ed7b8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aee8a0aad1795680cb840ffcf544ed7b8">&#9670;&nbsp;</a></span>InitFromFloats()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Texture2D::InitFromFloats </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>height</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float *&#160;</td>
+ <td class="paramname"><em>data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Call this from within the InitOpenGL() function since it will initialize not just the <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a>'s internal data but also an OpenGL texture to be stored on the graphics card. With this version of Init, you may pass in your own pointer to color data. The data argument must point to an array of 4-channel color data stored as floats in RGBA format. You are responsible for managing the memory for this array. If you will never call <a class="el" href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b" title="Returns the color at the specified pixel. The top left corner of the image is (0,0) and the bottom ri...">Pixel()</a>, then it is safe to free data as soon as this function returns. Otherwise, you need to make sure data does not change in memory until you destroy the <a class="el" href="classmingfx_1_1_texture2_d.html" title="A wrapper around a 2D texture that supports loading images from files or setting texture color data d...">Texture2D</a> object. </p>
+
+</div>
+</div>
+<a id="a15d5c319cf7e012e703668f4d4e7be87"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a15d5c319cf7e012e703668f4d4e7be87">&#9670;&nbsp;</a></span>initialized()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Texture2D::initialized </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns true if the texture data has been successfully transferred to OpenGL. </p>
+
+</div>
+</div>
+<a id="ad4e0faadfe016e6ee501e66fc0244504"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad4e0faadfe016e6ee501e66fc0244504">&#9670;&nbsp;</a></span>opengl_id()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">GLuint mingfx::Texture2D::opengl_id </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the unsigned int used as the texture handle by OpenGL. </p>
+
+</div>
+</div>
+<a id="a1e843f3d8904f9c7a99f7614f87de73b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1e843f3d8904f9c7a99f7614f87de73b">&#9670;&nbsp;</a></span>Pixel()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_color.html">Color</a> mingfx::Texture2D::Pixel </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>y</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the color at the specified pixel. The top left corner of the image is (0,0) and the bottom right is (<a class="el" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869" title="Returns the width in pixels of the texture.">width()</a>-1, <a class="el" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88" title="Returns the height in pixels of the texture.">height()</a>-1). </p>
+
+</div>
+</div>
+<a id="a4a3b2b550fefdf79f0fb392b04e7b013"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a3b2b550fefdf79f0fb392b04e7b013">&#9670;&nbsp;</a></span>set_filter_mode()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Texture2D::set_filter_mode </td>
+ <td>(</td>
+ <td class="paramtype">GLenum&#160;</td>
+ <td class="paramname"><em>filterMode</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Uses the OpenGL texture filter mode arguments. </p>
+
+</div>
+</div>
+<a id="aa5cbe3396e4560ec0746e91dbc55bc9f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa5cbe3396e4560ec0746e91dbc55bc9f">&#9670;&nbsp;</a></span>set_wrap_mode()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Texture2D::set_wrap_mode </td>
+ <td>(</td>
+ <td class="paramtype">GLenum&#160;</td>
+ <td class="paramname"><em>wrapMode</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Uses the OpenGL texture wrap mode arguments. </p>
+
+</div>
+</div>
+<a id="a0783ad70829ef353aa92344d320b107c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0783ad70829ef353aa92344d320b107c">&#9670;&nbsp;</a></span>UpdateFromBytes()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Texture2D::UpdateFromBytes </td>
+ <td>(</td>
+ <td class="paramtype">const unsigned char *&#160;</td>
+ <td class="paramname"><em>data</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This function may be called to re-read the texture data from an array formated the same as in InitFromBytes. The width and height of the texture must remain the same. </p>
+
+</div>
+</div>
+<a id="ad7640f0cbda6398a6bb80202b80dd693"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad7640f0cbda6398a6bb80202b80dd693">&#9670;&nbsp;</a></span>UpdateFromFloats()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Texture2D::UpdateFromFloats </td>
+ <td>(</td>
+ <td class="paramtype">const float *&#160;</td>
+ <td class="paramname"><em>data</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This function may be called to re-read the texture data from an array formated the same as in InitFromFloats. The width and height of the texture must remain the same. </p>
+
+</div>
+</div>
+<a id="a401629d948aa144be81b94fe21938869"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a401629d948aa144be81b94fe21938869">&#9670;&nbsp;</a></span>width()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int mingfx::Texture2D::width </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the width in pixels of the texture. </p>
+
+</div>
+</div>
+<a id="a1c8827426f43343c0ad171e181a741ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1c8827426f43343c0ad171e181a741ea">&#9670;&nbsp;</a></span>wrap_mode()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">GLenum mingfx::Texture2D::wrap_mode </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns an enumerated constant for the OpenGL wrap mode used by the texture. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="texture2d_8h_source.html">texture2d.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_uni_cam-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_uni_cam-members.html
new file mode 100644
index 0000000..152a39d
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_uni_cam-members.html
@@ -0,0 +1,107 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_uni_cam.html">UniCam</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::UniCam Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#aab253d966af52ac277ac51194745085c">AdvanceAnimation</a>(double dt)</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#ae45f3c80c205a539baeb4f1b8787777d">Draw</a>(const Matrix4 &amp;projectionMatrix)</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#a65d5735b4b3a8e38f2b30df4133cadd2">eye</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#a8363576bf0f85c74d80ced697bd73d40">look</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#a85afba6e8792636f3c6ba2433db1c52f">OnButtonDown</a>(const Point2 &amp;normalizedMousePos, float mouseZ)</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#a2a9431dc3943c8dc485994d88ce2a58a">OnButtonUp</a>(const Point2 &amp;normalizedMousePos)</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#a33f1b41fcf53ea78ca2b3640902c5bbe">OnDrag</a>(const Point2 &amp;normalizedMousePos)</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#a71e0351ac19a18b9c02215a60dc51068">set_default_depth</a>(float d)</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#a6b17bab82595ca468a3c638512011e5b">set_view_matrix</a>(Matrix4 viewMatrix)</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e">UniCam</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#af507e639c4bceb4c79e21a6f80c48d07">UniCam</a>(const Matrix4 &amp;initialViewMatrix)</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3">view_matrix</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html#af98022627bcb52dbf54779cfaeb6ff7e">~UniCam</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_uni_cam.html b/dev/MinGfx/docs/html/classmingfx_1_1_uni_cam.html
new file mode 100644
index 0000000..ad46944
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_uni_cam.html
@@ -0,0 +1,482 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::UniCam Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_uni_cam.html">UniCam</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_uni_cam-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::UniCam Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This implements a user interface for controlling the camera with the mouse. </p>
+<p>It is a special interface inspired by the "Unicam" technique developed by Zeleznik et al. <br />
+</p>
+<p>The key feature is that this interface makes it possible to control camera pan, dolly, and rotation with only a single mouse button. That is quite useful because it leaves the other mouse buttons free for pointing, sketching, or other interaction techniques.</p>
+<p>The only downside of this technique is that it can take some time to learn. In order to enjoy it, you will need to read these brief instructions on how to Pan, Dolly, Rotate, and Spin:</p>
+<ul>
+<li>Pan: Click and drag horizontally with the mouse. Once you make an initial horizontal movement you can than pan up and down as well, but the key to entering pan mode is to start with a horizontal movement.</li>
+<li>Dolly: Click and drag vertically with the mouse. The initial movement must be vertical. If you click on some object in the scene, then the speed of dollying is set so that the object will come all the up to the camera lens if you drag the mouse to the bottom of the screen.</li>
+<li>Rotate: Start with a quick click and release to set the center of rotation. <br />
+ This is most useful if you click on some object in the scene. You will see a black dot appear to mark the center of rotation. If you click on the background then a center of rotation will be selected for you. It will be a point straight ahead and at a depth 4.0 units away. The depth can be adjusted for your application with <a class="el" href="classmingfx_1_1_uni_cam.html#a71e0351ac19a18b9c02215a60dc51068" title="This sets the depth of the center of rotation for the case when the user&#39;s click does not intersect a...">set_default_depth()</a>. Once your center of rotation is established, move your mouse away a bit and then click and drag to do a trackball rotatation of the scene around this point. Come to a stop before letting go of the mouse button in order to avoid entering the spin state!</li>
+<li>Spin: For some fun, try "throwing" the scene so that it continues to rotate even after you let go. To do this, start a rotation and then let go of the mouse button while your mouse is still moving. To stop spinning just click and release the mouse once to "catch" the scene.</li>
+</ul>
+<p>Example usage: </p><div class="fragment"><div class="line"><span class="comment">// Create a global or member variable in your MyGraphicsApp class:</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e">UniCam</a> unicam_;</div>
+<div class="line"> </div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::OnLeftMouseDown(<span class="keyword">const</span> Point2 &amp;pos) {</div>
+<div class="line"> Point2 mouse_xy = PixelsToNormalizedDeviceCoords(pos);</div>
+<div class="line"> <span class="keywordtype">float</span> mouse_z = ReadZValueAtPixel(pos);</div>
+<div class="line"> unicam_.OnButtonDown(mouse_xy, mouse_z);</div>
+<div class="line">}</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::OnLeftMouseDrag(<span class="keyword">const</span> Point2 &amp;pos, <span class="keyword">const</span> Vector2 &amp;delta) {</div>
+<div class="line"> Point2 mouse_xy = PixelsToNormalizedDeviceCoords(pos);</div>
+<div class="line"> unicam_.OnDrag(mouse_xy);</div>
+<div class="line">}</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::OnLeftMouseUp(<span class="keyword">const</span> Point2 &amp;pos) {</div>
+<div class="line"> Point2 mouse_xy = PixelsToNormalizedDeviceCoords(pos);</div>
+<div class="line"> unicam_.OnButtonUp(mouse_xy);</div>
+<div class="line">}</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::InitOpenGL() {</div>
+<div class="line"> projMatrix_ = Matrix4::perspective(30, aspect_ratio(), 1, 20);</div>
+<div class="line"> unicam_.set_view_matrix(Matrix4::lookAt(Point3(2.5,1,2.5), Point3(0,0,0), Vector3(0,1,0)););</div>
+<div class="line">}</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> MyGraphicsApp::DrawOpenGL() {</div>
+<div class="line"> <span class="comment">// draw your scene using the view matrix from UniCam</span></div>
+<div class="line"> Matrix4 proj_matrix = <a class="code" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">Matrix4::Perspective</a>(60, aspect_ratio(), 0.001, 10);;</div>
+<div class="line"> Matrix4 <a class="code" href="classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3">view_matrix</a> = uniCam.view_matrix();</div>
+<div class="line"> Matrix4 model_matrix = Matrix4::RotateY(to_radians(45.0));</div>
+<div class="line"> quickShapes.DrawCube(model_matrix, view_matirx, proj_matrix, Color(1,1,1));</div>
+<div class="line"> </div>
+<div class="line"> <span class="comment">// tell unicam to draw itself (i.e., the small sphere that marks the center of</span></div>
+<div class="line"> <span class="comment">// rotation when in rotation mode)</span></div>
+<div class="line"> unicam_.Draw(proj_matrix);</div>
+<div class="line">}</div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0e34aee86758a0397074590b87712c5e"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">mingfx::Matrix4::Perspective</a></div><div class="ttdeci">static Matrix4 Perspective(float fov_y_in_degrees, float aspect_ratio, float near_plane_dist, float far_plane_dist)</div><div class="ttdoc">Returns a perspective projection matrix equivalent to the one gluPerspective creates.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_a6e7771961011f573b2e2249f602b2d2e"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e">mingfx::UniCam::UniCam</a></div><div class="ttdeci">UniCam()</div><div class="ttdoc">Creates a UniCam object with an initial view matrix = identity.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_af7e7276f9390ec57ca577092c99d6ca3"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3">mingfx::UniCam::view_matrix</a></div><div class="ttdeci">Matrix4 view_matrix()</div><div class="ttdoc">Access the camera view matrix created by the UniCam interactions via this method and use it to draw t...</div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="unicam_8h_source.html#l00105">105</a> of file <a class="el" href="unicam_8h_source.html">unicam.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="unicam_8h_source.html">unicam.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a6e7771961011f573b2e2249f602b2d2e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e">UniCam</a> ()</td></tr>
+<tr class="memdesc:a6e7771961011f573b2e2249f602b2d2e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a <a class="el" href="classmingfx_1_1_uni_cam.html" title="This implements a user interface for controlling the camera with the mouse.">UniCam</a> object with an initial view matrix = identity. <a href="classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e">More...</a><br /></td></tr>
+<tr class="separator:a6e7771961011f573b2e2249f602b2d2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af507e639c4bceb4c79e21a6f80c48d07"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#af507e639c4bceb4c79e21a6f80c48d07">UniCam</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;initialViewMatrix)</td></tr>
+<tr class="memdesc:af507e639c4bceb4c79e21a6f80c48d07"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a <a class="el" href="classmingfx_1_1_uni_cam.html" title="This implements a user interface for controlling the camera with the mouse.">UniCam</a> object with the supplied initial view matrix. <a href="classmingfx_1_1_uni_cam.html#af507e639c4bceb4c79e21a6f80c48d07">More...</a><br /></td></tr>
+<tr class="separator:af507e639c4bceb4c79e21a6f80c48d07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af98022627bcb52dbf54779cfaeb6ff7e"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#af98022627bcb52dbf54779cfaeb6ff7e">~UniCam</a> ()</td></tr>
+<tr class="separator:af98022627bcb52dbf54779cfaeb6ff7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85afba6e8792636f3c6ba2433db1c52f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#a85afba6e8792636f3c6ba2433db1c52f">OnButtonDown</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedMousePos, float mouseZ)</td></tr>
+<tr class="memdesc:a85afba6e8792636f3c6ba2433db1c52f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attach this to whatever mouse button you wish, for example, call this from within <a class="el" href="classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c" title="If the mouse button was pressed down since the last frame, then this function will be called to notif...">GraphicsApp::OnRightMouseDown()</a>. If your mousePos is reported in pixels, you will need to convert it to normalized device coordinates before passing it on to this routine. The depth buffer value for the pixel under the mouse is also needed. If you are using <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, you can access both of these as follows: <a href="classmingfx_1_1_uni_cam.html#a85afba6e8792636f3c6ba2433db1c52f">More...</a><br /></td></tr>
+<tr class="separator:a85afba6e8792636f3c6ba2433db1c52f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33f1b41fcf53ea78ca2b3640902c5bbe"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#a33f1b41fcf53ea78ca2b3640902c5bbe">OnDrag</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedMousePos)</td></tr>
+<tr class="memdesc:a33f1b41fcf53ea78ca2b3640902c5bbe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attach this to the corresponding mouse move event, for example, call this from within <a class="el" href="classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7" title="If the mouse button is held down and the mouse has moved in the past frame then this function will be...">GraphicsApp::OnRightMouseDrag()</a>. If your mousePos is reported in pixels, you will need to convert it to normalized device coordinates before passing it on to this routine. Within <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, use: <a href="classmingfx_1_1_uni_cam.html#a33f1b41fcf53ea78ca2b3640902c5bbe">More...</a><br /></td></tr>
+<tr class="separator:a33f1b41fcf53ea78ca2b3640902c5bbe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a9431dc3943c8dc485994d88ce2a58a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#a2a9431dc3943c8dc485994d88ce2a58a">OnButtonUp</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedMousePos)</td></tr>
+<tr class="memdesc:a2a9431dc3943c8dc485994d88ce2a58a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attach this to the corresponding button up event, for example, call this from within <a class="el" href="classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3" title="If the mouse button was released since the last frame, then this function will be called to notify yo...">GraphicsApp::OnRightMouseUp()</a>. If your mousePos is reported in pixels, you will need to convert it to normalized device coordinates before passing it on to this routine. Within <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, use: <a href="classmingfx_1_1_uni_cam.html#a2a9431dc3943c8dc485994d88ce2a58a">More...</a><br /></td></tr>
+<tr class="separator:a2a9431dc3943c8dc485994d88ce2a58a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab253d966af52ac277ac51194745085c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#aab253d966af52ac277ac51194745085c">AdvanceAnimation</a> (double dt)</td></tr>
+<tr class="memdesc:aab253d966af52ac277ac51194745085c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attach this to a callback that can be used to control animation. Within <a class="el" href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa" title="Called once per frame.">GraphicsApp::UpdateSimulation()</a>, use: <a href="classmingfx_1_1_uni_cam.html#aab253d966af52ac277ac51194745085c">More...</a><br /></td></tr>
+<tr class="separator:aab253d966af52ac277ac51194745085c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae45f3c80c205a539baeb4f1b8787777d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#ae45f3c80c205a539baeb4f1b8787777d">Draw</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix)</td></tr>
+<tr class="memdesc:ae45f3c80c205a539baeb4f1b8787777d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finally, attach this to your draw callback routine. Within <a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca" title="Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.">GraphicsApp::DrawUsingOpenGL()</a>, use: <a href="classmingfx_1_1_uni_cam.html#ae45f3c80c205a539baeb4f1b8787777d">More...</a><br /></td></tr>
+<tr class="separator:ae45f3c80c205a539baeb4f1b8787777d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af7e7276f9390ec57ca577092c99d6ca3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3">view_matrix</a> ()</td></tr>
+<tr class="memdesc:af7e7276f9390ec57ca577092c99d6ca3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Access the camera view matrix created by the <a class="el" href="classmingfx_1_1_uni_cam.html" title="This implements a user interface for controlling the camera with the mouse.">UniCam</a> interactions via this method and use it to draw the geometry in your scence. For example, within <a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca" title="Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.">GraphicsApp::DrawUsingOpenGL()</a>, you might have: <a href="classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3">More...</a><br /></td></tr>
+<tr class="separator:af7e7276f9390ec57ca577092c99d6ca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65d5735b4b3a8e38f2b30df4133cadd2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#a65d5735b4b3a8e38f2b30df4133cadd2">eye</a> ()</td></tr>
+<tr class="memdesc:a65d5735b4b3a8e38f2b30df4133cadd2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the "eye" point (i.e., focal point) of the camera in world space coordinates. <a href="classmingfx_1_1_uni_cam.html#a65d5735b4b3a8e38f2b30df4133cadd2">More...</a><br /></td></tr>
+<tr class="separator:a65d5735b4b3a8e38f2b30df4133cadd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8363576bf0f85c74d80ced697bd73d40"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#a8363576bf0f85c74d80ced697bd73d40">look</a> ()</td></tr>
+<tr class="memdesc:a8363576bf0f85c74d80ced697bd73d40"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the look direction (i.e., -Z axis of the camera matrix) in world space coordinates. <a href="classmingfx_1_1_uni_cam.html#a8363576bf0f85c74d80ced697bd73d40">More...</a><br /></td></tr>
+<tr class="separator:a8363576bf0f85c74d80ced697bd73d40"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b17bab82595ca468a3c638512011e5b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#a6b17bab82595ca468a3c638512011e5b">set_view_matrix</a> (<a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> viewMatrix)</td></tr>
+<tr class="memdesc:a6b17bab82595ca468a3c638512011e5b"><td class="mdescLeft">&#160;</td><td class="mdescRight">This is not required, but you may use this if you wish to set an initial view matrix or reset the view matrix. <a href="classmingfx_1_1_uni_cam.html#a6b17bab82595ca468a3c638512011e5b">More...</a><br /></td></tr>
+<tr class="separator:a6b17bab82595ca468a3c638512011e5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a71e0351ac19a18b9c02215a60dc51068"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html#a71e0351ac19a18b9c02215a60dc51068">set_default_depth</a> (float d)</td></tr>
+<tr class="memdesc:a71e0351ac19a18b9c02215a60dc51068"><td class="mdescLeft">&#160;</td><td class="mdescRight">This sets the depth of the center of rotation for the case when the user's click does not intersect any geometry. It defaults to 4 units, but the right value to use depends very much on the current scene. For example, you could set a very good value by calculating the current centroid of your scene and the finding the depth of this point (the distance along the look vector) relative to the camera. <a href="classmingfx_1_1_uni_cam.html#a71e0351ac19a18b9c02215a60dc51068">More...</a><br /></td></tr>
+<tr class="separator:a71e0351ac19a18b9c02215a60dc51068"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a6e7771961011f573b2e2249f602b2d2e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6e7771961011f573b2e2249f602b2d2e">&#9670;&nbsp;</a></span>UniCam() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::UniCam::UniCam </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a <a class="el" href="classmingfx_1_1_uni_cam.html" title="This implements a user interface for controlling the camera with the mouse.">UniCam</a> object with an initial view matrix = identity. </p>
+
+</div>
+</div>
+<a id="af507e639c4bceb4c79e21a6f80c48d07"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af507e639c4bceb4c79e21a6f80c48d07">&#9670;&nbsp;</a></span>UniCam() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::UniCam::UniCam </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>initialViewMatrix</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a <a class="el" href="classmingfx_1_1_uni_cam.html" title="This implements a user interface for controlling the camera with the mouse.">UniCam</a> object with the supplied initial view matrix. </p>
+
+</div>
+</div>
+<a id="af98022627bcb52dbf54779cfaeb6ff7e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af98022627bcb52dbf54779cfaeb6ff7e">&#9670;&nbsp;</a></span>~UniCam()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::UniCam::~UniCam </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="aab253d966af52ac277ac51194745085c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aab253d966af52ac277ac51194745085c">&#9670;&nbsp;</a></span>AdvanceAnimation()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::UniCam::AdvanceAnimation </td>
+ <td>(</td>
+ <td class="paramtype">double&#160;</td>
+ <td class="paramname"><em>dt</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Attach this to a callback that can be used to control animation. Within <a class="el" href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa" title="Called once per frame.">GraphicsApp::UpdateSimulation()</a>, use: </p>
+<div class="fragment"><div class="line">uniCam.AdvanceAnimation(dt);</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="ae45f3c80c205a539baeb4f1b8787777d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae45f3c80c205a539baeb4f1b8787777d">&#9670;&nbsp;</a></span>Draw()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::UniCam::Draw </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>projectionMatrix</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Finally, attach this to your draw callback routine. Within <a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca" title="Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.">GraphicsApp::DrawUsingOpenGL()</a>, use: </p>
+<div class="fragment"><div class="line">uniCam.Draw(projMatrix);</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="a65d5735b4b3a8e38f2b30df4133cadd2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a65d5735b4b3a8e38f2b30df4133cadd2">&#9670;&nbsp;</a></span>eye()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::UniCam::eye </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the "eye" point (i.e., focal point) of the camera in world space coordinates. </p>
+
+</div>
+</div>
+<a id="a8363576bf0f85c74d80ced697bd73d40"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8363576bf0f85c74d80ced697bd73d40">&#9670;&nbsp;</a></span>look()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::UniCam::look </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the look direction (i.e., -Z axis of the camera matrix) in world space coordinates. </p>
+
+</div>
+</div>
+<a id="a85afba6e8792636f3c6ba2433db1c52f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a85afba6e8792636f3c6ba2433db1c52f">&#9670;&nbsp;</a></span>OnButtonDown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::UniCam::OnButtonDown </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>normalizedMousePos</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>mouseZ</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Attach this to whatever mouse button you wish, for example, call this from within <a class="el" href="classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c" title="If the mouse button was pressed down since the last frame, then this function will be called to notif...">GraphicsApp::OnRightMouseDown()</a>. If your mousePos is reported in pixels, you will need to convert it to normalized device coordinates before passing it on to this routine. The depth buffer value for the pixel under the mouse is also needed. If you are using <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, you can access both of these as follows: </p>
+<div class="fragment"><div class="line">Point2 mouse_xy = PixelsToNormalizedDeviceCoords(mouse_in_pixels);</div>
+<div class="line"><span class="keywordtype">float</span> mouse_z = ReadZValueAtPixel(mouse_in_pixels);</div>
+<div class="line">uniCam.OnButtonDown(mouse_xy, mouse_z);</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="a2a9431dc3943c8dc485994d88ce2a58a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2a9431dc3943c8dc485994d88ce2a58a">&#9670;&nbsp;</a></span>OnButtonUp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::UniCam::OnButtonUp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>normalizedMousePos</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Attach this to the corresponding button up event, for example, call this from within <a class="el" href="classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3" title="If the mouse button was released since the last frame, then this function will be called to notify yo...">GraphicsApp::OnRightMouseUp()</a>. If your mousePos is reported in pixels, you will need to convert it to normalized device coordinates before passing it on to this routine. Within <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, use: </p>
+<div class="fragment"><div class="line">Point2 mouse_xy = PixelsToNormalizedDeviceCoords(mouse_in_pixels);</div>
+<div class="line">uniCam.OnButtonUp(mouse_xy);</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="a33f1b41fcf53ea78ca2b3640902c5bbe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a33f1b41fcf53ea78ca2b3640902c5bbe">&#9670;&nbsp;</a></span>OnDrag()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::UniCam::OnDrag </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>normalizedMousePos</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Attach this to the corresponding mouse move event, for example, call this from within <a class="el" href="classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7" title="If the mouse button is held down and the mouse has moved in the past frame then this function will be...">GraphicsApp::OnRightMouseDrag()</a>. If your mousePos is reported in pixels, you will need to convert it to normalized device coordinates before passing it on to this routine. Within <a class="el" href="classmingfx_1_1_graphics_app.html" title="This is the main application base class for the MinGfx Toolkit.">GraphicsApp</a>, use: </p>
+<div class="fragment"><div class="line">Point2 mouse_xy = PixelsToNormalizedDeviceCoords(mouse_in_pixels);</div>
+<div class="line">uniCam.OnDrag(mouse_xy);</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="a71e0351ac19a18b9c02215a60dc51068"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a71e0351ac19a18b9c02215a60dc51068">&#9670;&nbsp;</a></span>set_default_depth()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::UniCam::set_default_depth </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>d</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This sets the depth of the center of rotation for the case when the user's click does not intersect any geometry. It defaults to 4 units, but the right value to use depends very much on the current scene. For example, you could set a very good value by calculating the current centroid of your scene and the finding the depth of this point (the distance along the look vector) relative to the camera. </p>
+
+</div>
+</div>
+<a id="a6b17bab82595ca468a3c638512011e5b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6b17bab82595ca468a3c638512011e5b">&#9670;&nbsp;</a></span>set_view_matrix()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::UniCam::set_view_matrix </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td>
+ <td class="paramname"><em>viewMatrix</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This is not required, but you may use this if you wish to set an initial view matrix or reset the view matrix. </p>
+
+</div>
+</div>
+<a id="af7e7276f9390ec57ca577092c99d6ca3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af7e7276f9390ec57ca577092c99d6ca3">&#9670;&nbsp;</a></span>view_matrix()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::UniCam::view_matrix </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Access the camera view matrix created by the <a class="el" href="classmingfx_1_1_uni_cam.html" title="This implements a user interface for controlling the camera with the mouse.">UniCam</a> interactions via this method and use it to draw the geometry in your scence. For example, within <a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca" title="Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.">GraphicsApp::DrawUsingOpenGL()</a>, you might have: </p>
+<div class="fragment"><div class="line">Matrix4 P = <a class="code" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">Matrix4::Perspective</a>(30, aspect_ratio(), 1, 20);</div>
+<div class="line">Matrix4 V = unicam.view_matrix();</div>
+<div class="line">Matrix4 M = Matrix4::RotateY(<a class="code" href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">GfxMath::ToRadians</a>(45.0));</div>
+<div class="line">quick_shapes.DrawCube(M, V, P, Color(1,1,1));</div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a1336de2695bc3bb750b23fb0ea211637"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">mingfx::GfxMath::ToRadians</a></div><div class="ttdeci">static float ToRadians(float degrees)</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="unicam_8h_source.html">unicam.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_vector2-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_vector2-members.html
new file mode 100644
index 0000000..8a54e22
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_vector2-members.html
@@ -0,0 +1,120 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::Vector2 Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#ae2208539c6b29712c22f557dcfdd55d9">Dot</a>(const Vector2 &amp;v) const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a9e81c518908ca06c98ba099b075fe1cd">Dot</a>(const Vector2 &amp;v1, const Vector2 &amp;v2)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a71b90903d00cdc318ea42f593db6dbb9">Length</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a5813ffa3c185551eec1927e1daa4cb17">Lerp</a>(const Vector2 &amp;b, float alpha) const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#ac332b5f01b3357b85e6d279fb059d561">Lerp</a>(const Vector2 &amp;a, const Vector2 &amp;b, float alpha)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a632ddd5b06c48fa0f6f39550e91082c0">Normalize</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a06d6c283aba957bddc2b9849698838b2">Normalize</a>(const Vector2 &amp;v)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a5b51e62f03e95d6be1262f037aecf0fd">One</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a1cf3488f1f14a9bf7f6e1278c1c63cdb">operator!=</a>(const Vector2 &amp;v) const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a28c44a323e5bd1a251dee9e00e2e1769">operator=</a>(const Vector2 &amp;v)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#ad7acc2cf4dcd2eca210899c846bb7dfe">operator==</a>(const Vector2 &amp;v) const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#ae1fc0ce3ca1af3d0546af32742e13000">operator[]</a>(const int i) const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a93acf7f4f150cfe53859e31d90eddd1e">operator[]</a>(const int i)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a70f9f612a99017bf051e40ebd7fa7f83">ToUnit</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a8ef6e0525ec34aaee9cf35bab098ecdb">UnitX</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#ab7b3ba42a5a63c512bd7b32fd4cc0db0">UnitY</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a80ef53519d50a6a6f158f66755c040d1">value_ptr</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f">Vector2</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#acc16337b6b06ebea2fde4c4bd1be7abd">Vector2</a>(float x, float y)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a6e3d063a7080bfe199acc70cd5afded2">Vector2</a>(float *v)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a40f53939581f5d06a1b757b0398525f8">Vector2</a>(const Vector2 &amp;v)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a267e6749091f23263d1620f801f0a831">w</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a">x</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b">y</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#a7cb11f9fe8962ff9092fc1e5736faacf">Zero</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html#ac49b009c4b6052ebe71d5cf4ce241b1f">~Vector2</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_vector2.html b/dev/MinGfx/docs/html/classmingfx_1_1_vector2.html
new file mode 100644
index 0000000..48f9e60
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_vector2.html
@@ -0,0 +1,841 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::Vector2 Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_vector2-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::Vector2 Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A 2D Vector with floating point coordinates, used for storing 2D translations, mouse movements, and screen-space vectors. </p>
+
+<p class="definition">Definition at line <a class="el" href="vector2_8h_source.html#l00028">28</a> of file <a class="el" href="vector2_8h_source.html">vector2.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="vector2_8h_source.html">vector2.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a962433a7e3158cf6b224604a0463852f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f">Vector2</a> ()</td></tr>
+<tr class="memdesc:a962433a7e3158cf6b224604a0463852f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default constructor to create zero vector. <a href="classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f">More...</a><br /></td></tr>
+<tr class="separator:a962433a7e3158cf6b224604a0463852f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc16337b6b06ebea2fde4c4bd1be7abd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#acc16337b6b06ebea2fde4c4bd1be7abd">Vector2</a> (float <a class="el" href="classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a">x</a>, float <a class="el" href="classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b">y</a>)</td></tr>
+<tr class="memdesc:acc16337b6b06ebea2fde4c4bd1be7abd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a vector (x,y,0), where the 0 comes from the use of homogeneous coordinates in computer graphics. <a href="classmingfx_1_1_vector2.html#acc16337b6b06ebea2fde4c4bd1be7abd">More...</a><br /></td></tr>
+<tr class="separator:acc16337b6b06ebea2fde4c4bd1be7abd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e3d063a7080bfe199acc70cd5afded2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a6e3d063a7080bfe199acc70cd5afded2">Vector2</a> (float *v)</td></tr>
+<tr class="memdesc:a6e3d063a7080bfe199acc70cd5afded2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a vector given a pointer to x,y,z data. <a href="classmingfx_1_1_vector2.html#a6e3d063a7080bfe199acc70cd5afded2">More...</a><br /></td></tr>
+<tr class="separator:a6e3d063a7080bfe199acc70cd5afded2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40f53939581f5d06a1b757b0398525f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a40f53939581f5d06a1b757b0398525f8">Vector2</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v)</td></tr>
+<tr class="memdesc:a40f53939581f5d06a1b757b0398525f8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy constructor for vector. <a href="classmingfx_1_1_vector2.html#a40f53939581f5d06a1b757b0398525f8">More...</a><br /></td></tr>
+<tr class="separator:a40f53939581f5d06a1b757b0398525f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac49b009c4b6052ebe71d5cf4ce241b1f"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#ac49b009c4b6052ebe71d5cf4ce241b1f">~Vector2</a> ()</td></tr>
+<tr class="memdesc:ac49b009c4b6052ebe71d5cf4ce241b1f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Vector destructor. <a href="classmingfx_1_1_vector2.html#ac49b009c4b6052ebe71d5cf4ce241b1f">More...</a><br /></td></tr>
+<tr class="separator:ac49b009c4b6052ebe71d5cf4ce241b1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad7acc2cf4dcd2eca210899c846bb7dfe"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#ad7acc2cf4dcd2eca210899c846bb7dfe">operator==</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v) const</td></tr>
+<tr class="memdesc:ad7acc2cf4dcd2eca210899c846bb7dfe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "equality", taking floating point imprecision into account. <a href="classmingfx_1_1_vector2.html#ad7acc2cf4dcd2eca210899c846bb7dfe">More...</a><br /></td></tr>
+<tr class="separator:ad7acc2cf4dcd2eca210899c846bb7dfe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1cf3488f1f14a9bf7f6e1278c1c63cdb"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a1cf3488f1f14a9bf7f6e1278c1c63cdb">operator!=</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v) const</td></tr>
+<tr class="memdesc:a1cf3488f1f14a9bf7f6e1278c1c63cdb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "inequality", taking floating point imprecision into account. <a href="classmingfx_1_1_vector2.html#a1cf3488f1f14a9bf7f6e1278c1c63cdb">More...</a><br /></td></tr>
+<tr class="separator:a1cf3488f1f14a9bf7f6e1278c1c63cdb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a28c44a323e5bd1a251dee9e00e2e1769"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a28c44a323e5bd1a251dee9e00e2e1769">operator=</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v)</td></tr>
+<tr class="memdesc:a28c44a323e5bd1a251dee9e00e2e1769"><td class="mdescLeft">&#160;</td><td class="mdescRight">Vector assignment operator. <a href="classmingfx_1_1_vector2.html#a28c44a323e5bd1a251dee9e00e2e1769">More...</a><br /></td></tr>
+<tr class="separator:a28c44a323e5bd1a251dee9e00e2e1769"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1fc0ce3ca1af3d0546af32742e13000"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#ae1fc0ce3ca1af3d0546af32742e13000">operator[]</a> (const int i) const</td></tr>
+<tr class="memdesc:ae1fc0ce3ca1af3d0546af32742e13000"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the ith coordinate of the vector. <a href="classmingfx_1_1_vector2.html#ae1fc0ce3ca1af3d0546af32742e13000">More...</a><br /></td></tr>
+<tr class="separator:ae1fc0ce3ca1af3d0546af32742e13000"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a93acf7f4f150cfe53859e31d90eddd1e"><td class="memItemLeft" align="right" valign="top">float &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a93acf7f4f150cfe53859e31d90eddd1e">operator[]</a> (const int i)</td></tr>
+<tr class="memdesc:a93acf7f4f150cfe53859e31d90eddd1e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a reference to the ith coordinate of the vector. Use this accessor if you wish to set the coordinate rather than just request its value. Example: <a href="classmingfx_1_1_vector2.html#a93acf7f4f150cfe53859e31d90eddd1e">More...</a><br /></td></tr>
+<tr class="separator:a93acf7f4f150cfe53859e31d90eddd1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae84b079eb21494bc7c9a93d32a63712a"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a">x</a> () const</td></tr>
+<tr class="memdesc:ae84b079eb21494bc7c9a93d32a63712a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the x coordinate. Can also use my_vector[0]. Use the my_vector[0] = 1.0; form if you need to set the value. <a href="classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a">More...</a><br /></td></tr>
+<tr class="separator:ae84b079eb21494bc7c9a93d32a63712a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac427d5c06474777e851bed05ec5d134b"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b">y</a> () const</td></tr>
+<tr class="memdesc:ac427d5c06474777e851bed05ec5d134b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the y coordinate. Can also use my_vector[1]. Use the my_vector[1] = 1.0; form if you need to set the value. <a href="classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b">More...</a><br /></td></tr>
+<tr class="separator:ac427d5c06474777e851bed05ec5d134b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a267e6749091f23263d1620f801f0a831"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a267e6749091f23263d1620f801f0a831">w</a> () const</td></tr>
+<tr class="memdesc:a267e6749091f23263d1620f801f0a831"><td class="mdescLeft">&#160;</td><td class="mdescRight">In homogeneous coordinates, the w coordinate for all vectors is 0.0. <a href="classmingfx_1_1_vector2.html#a267e6749091f23263d1620f801f0a831">More...</a><br /></td></tr>
+<tr class="separator:a267e6749091f23263d1620f801f0a831"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2208539c6b29712c22f557dcfdd55d9"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#ae2208539c6b29712c22f557dcfdd55d9">Dot</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v) const</td></tr>
+<tr class="memdesc:ae2208539c6b29712c22f557dcfdd55d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns "this dot v". <a href="classmingfx_1_1_vector2.html#ae2208539c6b29712c22f557dcfdd55d9">More...</a><br /></td></tr>
+<tr class="separator:ae2208539c6b29712c22f557dcfdd55d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a71b90903d00cdc318ea42f593db6dbb9"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a71b90903d00cdc318ea42f593db6dbb9">Length</a> () const</td></tr>
+<tr class="memdesc:a71b90903d00cdc318ea42f593db6dbb9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the length of the vector. <a href="classmingfx_1_1_vector2.html#a71b90903d00cdc318ea42f593db6dbb9">More...</a><br /></td></tr>
+<tr class="separator:a71b90903d00cdc318ea42f593db6dbb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a632ddd5b06c48fa0f6f39550e91082c0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a632ddd5b06c48fa0f6f39550e91082c0">Normalize</a> ()</td></tr>
+<tr class="memdesc:a632ddd5b06c48fa0f6f39550e91082c0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Normalizes the vector by making it unit length. <a href="classmingfx_1_1_vector2.html#a632ddd5b06c48fa0f6f39550e91082c0">More...</a><br /></td></tr>
+<tr class="separator:a632ddd5b06c48fa0f6f39550e91082c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70f9f612a99017bf051e40ebd7fa7f83"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a70f9f612a99017bf051e40ebd7fa7f83">ToUnit</a> () const</td></tr>
+<tr class="memdesc:a70f9f612a99017bf051e40ebd7fa7f83"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a normalized (i.e., unit length) version of the vector without modifying the original ('this') vector. <a href="classmingfx_1_1_vector2.html#a70f9f612a99017bf051e40ebd7fa7f83">More...</a><br /></td></tr>
+<tr class="separator:a70f9f612a99017bf051e40ebd7fa7f83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5813ffa3c185551eec1927e1daa4cb17"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a5813ffa3c185551eec1927e1daa4cb17">Lerp</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;b, float alpha) const</td></tr>
+<tr class="memdesc:a5813ffa3c185551eec1927e1daa4cb17"><td class="mdescLeft">&#160;</td><td class="mdescRight">Linear interpolation between this vector and another. Alpha=0.0 returns this vector, and alpha=1.0 returns the other vector, other values blend between the two. <a href="classmingfx_1_1_vector2.html#a5813ffa3c185551eec1927e1daa4cb17">More...</a><br /></td></tr>
+<tr class="separator:a5813ffa3c185551eec1927e1daa4cb17"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a80ef53519d50a6a6f158f66755c040d1"><td class="memItemLeft" align="right" valign="top">const float *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a80ef53519d50a6a6f158f66755c040d1">value_ptr</a> () const</td></tr>
+<tr class="memdesc:a80ef53519d50a6a6f158f66755c040d1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a const pointer to the raw data array. <a href="classmingfx_1_1_vector2.html#a80ef53519d50a6a6f158f66755c040d1">More...</a><br /></td></tr>
+<tr class="separator:a80ef53519d50a6a6f158f66755c040d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:a06d6c283aba957bddc2b9849698838b2"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a06d6c283aba957bddc2b9849698838b2">Normalize</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v)</td></tr>
+<tr class="memdesc:a06d6c283aba957bddc2b9849698838b2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a new vector that is the unit version of v. <a href="classmingfx_1_1_vector2.html#a06d6c283aba957bddc2b9849698838b2">More...</a><br /></td></tr>
+<tr class="separator:a06d6c283aba957bddc2b9849698838b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e81c518908ca06c98ba099b075fe1cd"><td class="memItemLeft" align="right" valign="top">static float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a9e81c518908ca06c98ba099b075fe1cd">Dot</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v1, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v2)</td></tr>
+<tr class="memdesc:a9e81c518908ca06c98ba099b075fe1cd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns v1 dot v2. <a href="classmingfx_1_1_vector2.html#a9e81c518908ca06c98ba099b075fe1cd">More...</a><br /></td></tr>
+<tr class="separator:a9e81c518908ca06c98ba099b075fe1cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7cb11f9fe8962ff9092fc1e5736faacf"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a7cb11f9fe8962ff9092fc1e5736faacf">Zero</a> ()</td></tr>
+<tr class="memdesc:a7cb11f9fe8962ff9092fc1e5736faacf"><td class="mdescLeft">&#160;</td><td class="mdescRight">(0,0) - a shortcut for a special vector that is frequently needed <a href="classmingfx_1_1_vector2.html#a7cb11f9fe8962ff9092fc1e5736faacf">More...</a><br /></td></tr>
+<tr class="separator:a7cb11f9fe8962ff9092fc1e5736faacf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b51e62f03e95d6be1262f037aecf0fd"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a5b51e62f03e95d6be1262f037aecf0fd">One</a> ()</td></tr>
+<tr class="memdesc:a5b51e62f03e95d6be1262f037aecf0fd"><td class="mdescLeft">&#160;</td><td class="mdescRight">(1,1) - a shortcut for a special vector that is frequently needed <a href="classmingfx_1_1_vector2.html#a5b51e62f03e95d6be1262f037aecf0fd">More...</a><br /></td></tr>
+<tr class="separator:a5b51e62f03e95d6be1262f037aecf0fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ef6e0525ec34aaee9cf35bab098ecdb"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#a8ef6e0525ec34aaee9cf35bab098ecdb">UnitX</a> ()</td></tr>
+<tr class="memdesc:a8ef6e0525ec34aaee9cf35bab098ecdb"><td class="mdescLeft">&#160;</td><td class="mdescRight">(1,0) - a shortcut for a special vector that is frequently needed <a href="classmingfx_1_1_vector2.html#a8ef6e0525ec34aaee9cf35bab098ecdb">More...</a><br /></td></tr>
+<tr class="separator:a8ef6e0525ec34aaee9cf35bab098ecdb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab7b3ba42a5a63c512bd7b32fd4cc0db0"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#ab7b3ba42a5a63c512bd7b32fd4cc0db0">UnitY</a> ()</td></tr>
+<tr class="memdesc:ab7b3ba42a5a63c512bd7b32fd4cc0db0"><td class="mdescLeft">&#160;</td><td class="mdescRight">(0,1) - a shortcut for a special vector that is frequently needed <a href="classmingfx_1_1_vector2.html#ab7b3ba42a5a63c512bd7b32fd4cc0db0">More...</a><br /></td></tr>
+<tr class="separator:ab7b3ba42a5a63c512bd7b32fd4cc0db0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac332b5f01b3357b85e6d279fb059d561"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html#ac332b5f01b3357b85e6d279fb059d561">Lerp</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;a, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;b, float alpha)</td></tr>
+<tr class="memdesc:ac332b5f01b3357b85e6d279fb059d561"><td class="mdescLeft">&#160;</td><td class="mdescRight">Linear interpolation between two vectors. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b', other values blend between the two. <a href="classmingfx_1_1_vector2.html#ac332b5f01b3357b85e6d279fb059d561">More...</a><br /></td></tr>
+<tr class="separator:ac332b5f01b3357b85e6d279fb059d561"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a962433a7e3158cf6b224604a0463852f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a962433a7e3158cf6b224604a0463852f">&#9670;&nbsp;</a></span>Vector2() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Vector2::Vector2 </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Default constructor to create zero vector. </p>
+
+</div>
+</div>
+<a id="acc16337b6b06ebea2fde4c4bd1be7abd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acc16337b6b06ebea2fde4c4bd1be7abd">&#9670;&nbsp;</a></span>Vector2() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Vector2::Vector2 </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>y</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a vector (x,y,0), where the 0 comes from the use of homogeneous coordinates in computer graphics. </p>
+
+</div>
+</div>
+<a id="a6e3d063a7080bfe199acc70cd5afded2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6e3d063a7080bfe199acc70cd5afded2">&#9670;&nbsp;</a></span>Vector2() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Vector2::Vector2 </td>
+ <td>(</td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a vector given a pointer to x,y,z data. </p>
+
+</div>
+</div>
+<a id="a40f53939581f5d06a1b757b0398525f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a40f53939581f5d06a1b757b0398525f8">&#9670;&nbsp;</a></span>Vector2() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Vector2::Vector2 </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy constructor for vector. </p>
+
+</div>
+</div>
+<a id="ac49b009c4b6052ebe71d5cf4ce241b1f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac49b009c4b6052ebe71d5cf4ce241b1f">&#9670;&nbsp;</a></span>~Vector2()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::Vector2::~Vector2 </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Vector destructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="ae2208539c6b29712c22f557dcfdd55d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae2208539c6b29712c22f557dcfdd55d9">&#9670;&nbsp;</a></span>Dot() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector2::Dot </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns "this dot v". </p>
+
+</div>
+</div>
+<a id="a9e81c518908ca06c98ba099b075fe1cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9e81c518908ca06c98ba099b075fe1cd">&#9670;&nbsp;</a></span>Dot() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static float mingfx::Vector2::Dot </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns v1 dot v2. </p>
+
+</div>
+</div>
+<a id="a71b90903d00cdc318ea42f593db6dbb9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a71b90903d00cdc318ea42f593db6dbb9">&#9670;&nbsp;</a></span>Length()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector2::Length </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the length of the vector. </p>
+
+</div>
+</div>
+<a id="ac332b5f01b3357b85e6d279fb059d561"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac332b5f01b3357b85e6d279fb059d561">&#9670;&nbsp;</a></span>Lerp() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::Vector2::Lerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Linear interpolation between two vectors. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b', other values blend between the two. </p>
+
+</div>
+</div>
+<a id="a5813ffa3c185551eec1927e1daa4cb17"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5813ffa3c185551eec1927e1daa4cb17">&#9670;&nbsp;</a></span>Lerp() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::Vector2::Lerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Linear interpolation between this vector and another. Alpha=0.0 returns this vector, and alpha=1.0 returns the other vector, other values blend between the two. </p>
+
+</div>
+</div>
+<a id="a632ddd5b06c48fa0f6f39550e91082c0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a632ddd5b06c48fa0f6f39550e91082c0">&#9670;&nbsp;</a></span>Normalize() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Vector2::Normalize </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Normalizes the vector by making it unit length. </p>
+
+</div>
+</div>
+<a id="a06d6c283aba957bddc2b9849698838b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a06d6c283aba957bddc2b9849698838b2">&#9670;&nbsp;</a></span>Normalize() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::Vector2::Normalize </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns a new vector that is the unit version of v. </p>
+
+</div>
+</div>
+<a id="a5b51e62f03e95d6be1262f037aecf0fd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5b51e62f03e95d6be1262f037aecf0fd">&#9670;&nbsp;</a></span>One()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; mingfx::Vector2::One </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(1,1) - a shortcut for a special vector that is frequently needed </p>
+
+</div>
+</div>
+<a id="a1cf3488f1f14a9bf7f6e1278c1c63cdb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1cf3488f1f14a9bf7f6e1278c1c63cdb">&#9670;&nbsp;</a></span>operator!=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Vector2::operator!= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "inequality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="a28c44a323e5bd1a251dee9e00e2e1769"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a28c44a323e5bd1a251dee9e00e2e1769">&#9670;&nbsp;</a></span>operator=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; mingfx::Vector2::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Vector assignment operator. </p>
+
+</div>
+</div>
+<a id="ad7acc2cf4dcd2eca210899c846bb7dfe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad7acc2cf4dcd2eca210899c846bb7dfe">&#9670;&nbsp;</a></span>operator==()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Vector2::operator== </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "equality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="a93acf7f4f150cfe53859e31d90eddd1e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a93acf7f4f150cfe53859e31d90eddd1e">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float&amp; mingfx::Vector2::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a reference to the ith coordinate of the vector. Use this accessor if you wish to set the coordinate rather than just request its value. Example: </p>
+<div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f">Vector2</a> a;</div>
+<div class="line">a[0] = 5.0; <span class="comment">// set the x-coordinate of the vector</span></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a962433a7e3158cf6b224604a0463852f"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f">mingfx::Vector2::Vector2</a></div><div class="ttdeci">Vector2()</div><div class="ttdoc">Default constructor to create zero vector.</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="ae1fc0ce3ca1af3d0546af32742e13000"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae1fc0ce3ca1af3d0546af32742e13000">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector2::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read only access to the ith coordinate of the vector. </p>
+
+</div>
+</div>
+<a id="a70f9f612a99017bf051e40ebd7fa7f83"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a70f9f612a99017bf051e40ebd7fa7f83">&#9670;&nbsp;</a></span>ToUnit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::Vector2::ToUnit </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a normalized (i.e., unit length) version of the vector without modifying the original ('this') vector. </p>
+
+</div>
+</div>
+<a id="a8ef6e0525ec34aaee9cf35bab098ecdb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8ef6e0525ec34aaee9cf35bab098ecdb">&#9670;&nbsp;</a></span>UnitX()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; mingfx::Vector2::UnitX </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(1,0) - a shortcut for a special vector that is frequently needed </p>
+
+</div>
+</div>
+<a id="ab7b3ba42a5a63c512bd7b32fd4cc0db0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab7b3ba42a5a63c512bd7b32fd4cc0db0">&#9670;&nbsp;</a></span>UnitY()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; mingfx::Vector2::UnitY </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(0,1) - a shortcut for a special vector that is frequently needed </p>
+
+</div>
+</div>
+<a id="a80ef53519d50a6a6f158f66755c040d1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a80ef53519d50a6a6f158f66755c040d1">&#9670;&nbsp;</a></span>value_ptr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const float* mingfx::Vector2::value_ptr </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a const pointer to the raw data array. </p>
+
+</div>
+</div>
+<a id="a267e6749091f23263d1620f801f0a831"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a267e6749091f23263d1620f801f0a831">&#9670;&nbsp;</a></span>w()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector2::w </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>In homogeneous coordinates, the w coordinate for all vectors is 0.0. </p>
+
+<p class="definition">Definition at line <a class="el" href="vector2_8h_source.html#l00077">77</a> of file <a class="el" href="vector2_8h_source.html">vector2.h</a>.</p>
+
+</div>
+</div>
+<a id="ae84b079eb21494bc7c9a93d32a63712a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae84b079eb21494bc7c9a93d32a63712a">&#9670;&nbsp;</a></span>x()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector2::x </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the x coordinate. Can also use my_vector[0]. Use the my_vector[0] = 1.0; form if you need to set the value. </p>
+
+<p class="definition">Definition at line <a class="el" href="vector2_8h_source.html#l00070">70</a> of file <a class="el" href="vector2_8h_source.html">vector2.h</a>.</p>
+
+</div>
+</div>
+<a id="ac427d5c06474777e851bed05ec5d134b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac427d5c06474777e851bed05ec5d134b">&#9670;&nbsp;</a></span>y()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector2::y </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the y coordinate. Can also use my_vector[1]. Use the my_vector[1] = 1.0; form if you need to set the value. </p>
+
+<p class="definition">Definition at line <a class="el" href="vector2_8h_source.html#l00074">74</a> of file <a class="el" href="vector2_8h_source.html">vector2.h</a>.</p>
+
+</div>
+</div>
+<a id="a7cb11f9fe8962ff9092fc1e5736faacf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7cb11f9fe8962ff9092fc1e5736faacf">&#9670;&nbsp;</a></span>Zero()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; mingfx::Vector2::Zero </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(0,0) - a shortcut for a special vector that is frequently needed </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="vector2_8h_source.html">vector2.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_vector3-members.html b/dev/MinGfx/docs/html/classmingfx_1_1_vector3-members.html
new file mode 100644
index 0000000..bbcf674
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_vector3-members.html
@@ -0,0 +1,124 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx::Vector3 Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a38cd4deed7d342464619b34b0ef95bec">Cross</a>(const Vector3 &amp;v) const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a45d7d211135edd97ca21b047439db485">Cross</a>(const Vector3 &amp;v1, const Vector3 &amp;v2)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a31692a459a8056fe220d115eb5addc88">Dot</a>(const Vector3 &amp;v) const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a235fb20d4075960d2ce6198dc95ac507">Dot</a>(const Vector3 &amp;v1, const Vector3 &amp;v2)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a7633dc1625b1f2e6b381438e896b45a3">Length</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a8dafc21c64a4964bac27519972d909b6">Lerp</a>(const Vector3 &amp;b, float alpha) const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a489b042bedf8fa329ac05fe905ca1c6f">Lerp</a>(const Vector3 &amp;a, const Vector3 &amp;b, float alpha)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a9b8e9ecbe10477adec527842f62d0dca">Normalize</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#aeff0177e2111139469b60733248fad8d">Normalize</a>(const Vector3 &amp;v)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#af71b12760516a9cc4837ba9e1dee28db">One</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#ab93acb916c310920b9c011159eaaa016">operator!=</a>(const Vector3 &amp;v) const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#aa5b1c05c285fad7f2709f6f351a63608">operator=</a>(const Vector3 &amp;v)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a85486d0a355417fe4b41fa64146c9e98">operator==</a>(const Vector3 &amp;v) const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#aa37b1fc4b1df9f72726d981c08cd0d1b">operator[]</a>(const int i) const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#abcdda4627b24af879aba38d4fc0e6f71">operator[]</a>(const int i)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a3caef3c6f24b90730ef70c84ce0e0d71">ToUnit</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#ae8d822fdea67f63580b4e1f78f5b8922">UnitX</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a8d31e433d1ac04aaceea1b1dcd1643df">UnitY</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a4b696b0d1143d6e30a34a2f889d2ca61">UnitZ</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#aa7ddfd662e866c019a772ba66eae7331">value_ptr</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a256018f34e230d542027d07d14fd6e65">Vector3</a>(float x, float y, float z)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a95b274c7a5ff118af20bc71682c6b1f1">Vector3</a>(float *v)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#af6100965af7770f833dbf0c9f30f4fdd">Vector3</a>(const Vector3 &amp;v)</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">w</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">x</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">y</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6">z</a>() const</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a52bf8582baa71e7d6f80c412687d9714">Zero</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html#a6e0d09d774615bcfde5645c22a645969">~Vector3</a>()</td><td class="entry"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td><td class="entry"><span class="mlabel">virtual</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/classmingfx_1_1_vector3.html b/dev/MinGfx/docs/html/classmingfx_1_1_vector3.html
new file mode 100644
index 0000000..e46afd3
--- /dev/null
+++ b/dev/MinGfx/docs/html/classmingfx_1_1_vector3.html
@@ -0,0 +1,1018 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx::Vector3 Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacemingfx.html">mingfx</a></li><li class="navelem"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classmingfx_1_1_vector3-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx::Vector3 Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graphics operations. </p>
+<p>Vector3s can be transformed by a <a class="el" href="classmingfx_1_1_matrix4.html" title="A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...">Matrix4</a>, and a <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> can be created by subtracting two Point3s. Example: </p><div class="fragment"><div class="line"><span class="comment">// subtracting two points creates a vector</span></div>
+<div class="line">Point3 a(0,0,0);</div>
+<div class="line">Point3 b(2,0,0);</div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> c = b - a;</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// vectors can be transformed by Matrix4s</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> dir = c.ToUnit();</div>
+<div class="line">Matrix4 M = Matrix4::RotateX(<a class="code" href="classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3">GfxMath::ToDegrees</a>(30.0));</div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> dir_transformed = M * dir;</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// vectors can be added and subtracted</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> d(1,0,0);</div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> e = c + d;</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// and we can do the usual dot products and cross products too</span></div>
+<div class="line"><span class="keywordtype">float</span> f = d.Dot(e);</div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> g = b.Cross(d);</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// you can access the individual components of the vector in two ways:</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> v(1,2,3);</div>
+<div class="line"><span class="keywordtype">float</span> option1 = v.x();</div>
+<div class="line"><span class="keywordtype">float</span> option2 = v[0];</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// to set an individual component of the vector use the [] operator:</span></div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> <a class="code" href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">w</a>;</div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">w</a>[0] = 0.4;</div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">w</a>[1] = 1.2;</div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">w</a>[2] = 3.1;</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// you can print the vector by sending it to stdout:</span></div>
+<div class="line">std::cout &lt;&lt; v &lt;&lt; std::endl;</div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a39a2b5973249fb3aefc210b18b0fdff3"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3">mingfx::GfxMath::ToDegrees</a></div><div class="ttdeci">static float ToDegrees(float radians)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a2556298f536ba115019982222ce6e0c5"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">mingfx::Vector3::w</a></div><div class="ttdeci">float w() const</div><div class="ttdoc">In homogeneous coordinates, the w coordinate for all vectors is 0.0.</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00115">vector3.h:115</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a7f57af8bbecbc793fa17def4521de4dd"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">mingfx::Vector3::Vector3</a></div><div class="ttdeci">Vector3()</div><div class="ttdoc">Default constructor to create zero vector.</div></div>
+</div><!-- fragment -->
+<p class="definition">Definition at line <a class="el" href="vector3_8h_source.html#l00062">62</a> of file <a class="el" href="vector3_8h_source.html">vector3.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="vector3_8h_source.html">vector3.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a7f57af8bbecbc793fa17def4521de4dd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> ()</td></tr>
+<tr class="memdesc:a7f57af8bbecbc793fa17def4521de4dd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default constructor to create zero vector. <a href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">More...</a><br /></td></tr>
+<tr class="separator:a7f57af8bbecbc793fa17def4521de4dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a256018f34e230d542027d07d14fd6e65"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a256018f34e230d542027d07d14fd6e65">Vector3</a> (float <a class="el" href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">x</a>, float <a class="el" href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">y</a>, float <a class="el" href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6">z</a>)</td></tr>
+<tr class="memdesc:a256018f34e230d542027d07d14fd6e65"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a vector (x,y,z,0), where the 0 comes from the use of homogeneous coordinates in computer graphics. <a href="classmingfx_1_1_vector3.html#a256018f34e230d542027d07d14fd6e65">More...</a><br /></td></tr>
+<tr class="separator:a256018f34e230d542027d07d14fd6e65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a95b274c7a5ff118af20bc71682c6b1f1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a95b274c7a5ff118af20bc71682c6b1f1">Vector3</a> (float *v)</td></tr>
+<tr class="memdesc:a95b274c7a5ff118af20bc71682c6b1f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a vector given a pointer to x,y,z data. <a href="classmingfx_1_1_vector3.html#a95b274c7a5ff118af20bc71682c6b1f1">More...</a><br /></td></tr>
+<tr class="separator:a95b274c7a5ff118af20bc71682c6b1f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6100965af7770f833dbf0c9f30f4fdd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#af6100965af7770f833dbf0c9f30f4fdd">Vector3</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="memdesc:af6100965af7770f833dbf0c9f30f4fdd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy constructor for vector. <a href="classmingfx_1_1_vector3.html#af6100965af7770f833dbf0c9f30f4fdd">More...</a><br /></td></tr>
+<tr class="separator:af6100965af7770f833dbf0c9f30f4fdd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e0d09d774615bcfde5645c22a645969"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a6e0d09d774615bcfde5645c22a645969">~Vector3</a> ()</td></tr>
+<tr class="memdesc:a6e0d09d774615bcfde5645c22a645969"><td class="mdescLeft">&#160;</td><td class="mdescRight">Vector destructor. <a href="classmingfx_1_1_vector3.html#a6e0d09d774615bcfde5645c22a645969">More...</a><br /></td></tr>
+<tr class="separator:a6e0d09d774615bcfde5645c22a645969"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85486d0a355417fe4b41fa64146c9e98"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a85486d0a355417fe4b41fa64146c9e98">operator==</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v) const</td></tr>
+<tr class="memdesc:a85486d0a355417fe4b41fa64146c9e98"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "equality", taking floating point imprecision into account. <a href="classmingfx_1_1_vector3.html#a85486d0a355417fe4b41fa64146c9e98">More...</a><br /></td></tr>
+<tr class="separator:a85486d0a355417fe4b41fa64146c9e98"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab93acb916c310920b9c011159eaaa016"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#ab93acb916c310920b9c011159eaaa016">operator!=</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v) const</td></tr>
+<tr class="memdesc:ab93acb916c310920b9c011159eaaa016"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for "inequality", taking floating point imprecision into account. <a href="classmingfx_1_1_vector3.html#ab93acb916c310920b9c011159eaaa016">More...</a><br /></td></tr>
+<tr class="separator:ab93acb916c310920b9c011159eaaa016"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5b1c05c285fad7f2709f6f351a63608"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#aa5b1c05c285fad7f2709f6f351a63608">operator=</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="memdesc:aa5b1c05c285fad7f2709f6f351a63608"><td class="mdescLeft">&#160;</td><td class="mdescRight">Vector assignment operator. <a href="classmingfx_1_1_vector3.html#aa5b1c05c285fad7f2709f6f351a63608">More...</a><br /></td></tr>
+<tr class="separator:aa5b1c05c285fad7f2709f6f351a63608"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa37b1fc4b1df9f72726d981c08cd0d1b"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#aa37b1fc4b1df9f72726d981c08cd0d1b">operator[]</a> (const int i) const</td></tr>
+<tr class="memdesc:aa37b1fc4b1df9f72726d981c08cd0d1b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the ith coordinate of the vector. <a href="classmingfx_1_1_vector3.html#aa37b1fc4b1df9f72726d981c08cd0d1b">More...</a><br /></td></tr>
+<tr class="separator:aa37b1fc4b1df9f72726d981c08cd0d1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abcdda4627b24af879aba38d4fc0e6f71"><td class="memItemLeft" align="right" valign="top">float &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#abcdda4627b24af879aba38d4fc0e6f71">operator[]</a> (const int i)</td></tr>
+<tr class="memdesc:abcdda4627b24af879aba38d4fc0e6f71"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a reference to the ith coordinate of the vector. Use this accessor if you wish to set the coordinate rather than just request its value. Example: <a href="classmingfx_1_1_vector3.html#abcdda4627b24af879aba38d4fc0e6f71">More...</a><br /></td></tr>
+<tr class="separator:abcdda4627b24af879aba38d4fc0e6f71"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac380342bfa614c9a3babe1efd14d2cf4"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">x</a> () const</td></tr>
+<tr class="memdesc:ac380342bfa614c9a3babe1efd14d2cf4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the x coordinate. Can also use my_vector[0]. Use the my_vector[0] = 1.0; form if you need to set the value. <a href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">More...</a><br /></td></tr>
+<tr class="separator:ac380342bfa614c9a3babe1efd14d2cf4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb74fbc0a970b40abb0db8f8e490ee17"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">y</a> () const</td></tr>
+<tr class="memdesc:aeb74fbc0a970b40abb0db8f8e490ee17"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the y coordinate. Can also use my_vector[1]. Use the my_vector[1] = 1.0; form if you need to set the value. <a href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">More...</a><br /></td></tr>
+<tr class="separator:aeb74fbc0a970b40abb0db8f8e490ee17"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78d1dba881575517f0427d55cc418df6"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6">z</a> () const</td></tr>
+<tr class="memdesc:a78d1dba881575517f0427d55cc418df6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read only access to the z coordinate. Can also use my_vector[2]. Use the my_vector[2] = 1.0; form if you need to set the value. <a href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6">More...</a><br /></td></tr>
+<tr class="separator:a78d1dba881575517f0427d55cc418df6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2556298f536ba115019982222ce6e0c5"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">w</a> () const</td></tr>
+<tr class="memdesc:a2556298f536ba115019982222ce6e0c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">In homogeneous coordinates, the w coordinate for all vectors is 0.0. <a href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">More...</a><br /></td></tr>
+<tr class="separator:a2556298f536ba115019982222ce6e0c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a31692a459a8056fe220d115eb5addc88"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a31692a459a8056fe220d115eb5addc88">Dot</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v) const</td></tr>
+<tr class="memdesc:a31692a459a8056fe220d115eb5addc88"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns "this dot v", for example: <a href="classmingfx_1_1_vector3.html#a31692a459a8056fe220d115eb5addc88">More...</a><br /></td></tr>
+<tr class="separator:a31692a459a8056fe220d115eb5addc88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38cd4deed7d342464619b34b0ef95bec"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a38cd4deed7d342464619b34b0ef95bec">Cross</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v) const</td></tr>
+<tr class="memdesc:a38cd4deed7d342464619b34b0ef95bec"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns "this cross v", for example: <a href="classmingfx_1_1_vector3.html#a38cd4deed7d342464619b34b0ef95bec">More...</a><br /></td></tr>
+<tr class="separator:a38cd4deed7d342464619b34b0ef95bec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7633dc1625b1f2e6b381438e896b45a3"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a7633dc1625b1f2e6b381438e896b45a3">Length</a> () const</td></tr>
+<tr class="memdesc:a7633dc1625b1f2e6b381438e896b45a3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the length of the vector. <a href="classmingfx_1_1_vector3.html#a7633dc1625b1f2e6b381438e896b45a3">More...</a><br /></td></tr>
+<tr class="separator:a7633dc1625b1f2e6b381438e896b45a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9b8e9ecbe10477adec527842f62d0dca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a9b8e9ecbe10477adec527842f62d0dca">Normalize</a> ()</td></tr>
+<tr class="memdesc:a9b8e9ecbe10477adec527842f62d0dca"><td class="mdescLeft">&#160;</td><td class="mdescRight">Normalizes the vector by making it unit length. <a href="classmingfx_1_1_vector3.html#a9b8e9ecbe10477adec527842f62d0dca">More...</a><br /></td></tr>
+<tr class="separator:a9b8e9ecbe10477adec527842f62d0dca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3caef3c6f24b90730ef70c84ce0e0d71"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a3caef3c6f24b90730ef70c84ce0e0d71">ToUnit</a> () const</td></tr>
+<tr class="memdesc:a3caef3c6f24b90730ef70c84ce0e0d71"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a normalized (i.e., unit length) version of the vector without modifying the original 'this' vector. <a href="classmingfx_1_1_vector3.html#a3caef3c6f24b90730ef70c84ce0e0d71">More...</a><br /></td></tr>
+<tr class="separator:a3caef3c6f24b90730ef70c84ce0e0d71"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7ddfd662e866c019a772ba66eae7331"><td class="memItemLeft" align="right" valign="top">const float *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#aa7ddfd662e866c019a772ba66eae7331">value_ptr</a> () const</td></tr>
+<tr class="memdesc:aa7ddfd662e866c019a772ba66eae7331"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a const pointer to the raw data array. <a href="classmingfx_1_1_vector3.html#aa7ddfd662e866c019a772ba66eae7331">More...</a><br /></td></tr>
+<tr class="separator:aa7ddfd662e866c019a772ba66eae7331"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8dafc21c64a4964bac27519972d909b6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a8dafc21c64a4964bac27519972d909b6">Lerp</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;b, float alpha) const</td></tr>
+<tr class="memdesc:a8dafc21c64a4964bac27519972d909b6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Linear interpolation between this vector and another. Alpha=0.0 returns this vector, and alpha=1.0 returns the other vector, other values blend between the two. <a href="classmingfx_1_1_vector3.html#a8dafc21c64a4964bac27519972d909b6">More...</a><br /></td></tr>
+<tr class="separator:a8dafc21c64a4964bac27519972d909b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:a52bf8582baa71e7d6f80c412687d9714"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a52bf8582baa71e7d6f80c412687d9714">Zero</a> ()</td></tr>
+<tr class="memdesc:a52bf8582baa71e7d6f80c412687d9714"><td class="mdescLeft">&#160;</td><td class="mdescRight">(0,0,0) - a shortcut for a special vector that is frequently needed <a href="classmingfx_1_1_vector3.html#a52bf8582baa71e7d6f80c412687d9714">More...</a><br /></td></tr>
+<tr class="separator:a52bf8582baa71e7d6f80c412687d9714"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af71b12760516a9cc4837ba9e1dee28db"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#af71b12760516a9cc4837ba9e1dee28db">One</a> ()</td></tr>
+<tr class="memdesc:af71b12760516a9cc4837ba9e1dee28db"><td class="mdescLeft">&#160;</td><td class="mdescRight">(1,1,1) - a shortcut for a special vector that is frequently needed <a href="classmingfx_1_1_vector3.html#af71b12760516a9cc4837ba9e1dee28db">More...</a><br /></td></tr>
+<tr class="separator:af71b12760516a9cc4837ba9e1dee28db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8d822fdea67f63580b4e1f78f5b8922"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#ae8d822fdea67f63580b4e1f78f5b8922">UnitX</a> ()</td></tr>
+<tr class="memdesc:ae8d822fdea67f63580b4e1f78f5b8922"><td class="mdescLeft">&#160;</td><td class="mdescRight">(1,0,0) - a shortcut for a special vector that is frequently needed <a href="classmingfx_1_1_vector3.html#ae8d822fdea67f63580b4e1f78f5b8922">More...</a><br /></td></tr>
+<tr class="separator:ae8d822fdea67f63580b4e1f78f5b8922"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d31e433d1ac04aaceea1b1dcd1643df"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a8d31e433d1ac04aaceea1b1dcd1643df">UnitY</a> ()</td></tr>
+<tr class="memdesc:a8d31e433d1ac04aaceea1b1dcd1643df"><td class="mdescLeft">&#160;</td><td class="mdescRight">(0,1,0) - a shortcut for a special vector that is frequently needed <a href="classmingfx_1_1_vector3.html#a8d31e433d1ac04aaceea1b1dcd1643df">More...</a><br /></td></tr>
+<tr class="separator:a8d31e433d1ac04aaceea1b1dcd1643df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b696b0d1143d6e30a34a2f889d2ca61"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a4b696b0d1143d6e30a34a2f889d2ca61">UnitZ</a> ()</td></tr>
+<tr class="memdesc:a4b696b0d1143d6e30a34a2f889d2ca61"><td class="mdescLeft">&#160;</td><td class="mdescRight">(0,0,1) - a shortcut for a special vector that is frequently needed <a href="classmingfx_1_1_vector3.html#a4b696b0d1143d6e30a34a2f889d2ca61">More...</a><br /></td></tr>
+<tr class="separator:a4b696b0d1143d6e30a34a2f889d2ca61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeff0177e2111139469b60733248fad8d"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#aeff0177e2111139469b60733248fad8d">Normalize</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="memdesc:aeff0177e2111139469b60733248fad8d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a new vector that is the unit version of v. <a href="classmingfx_1_1_vector3.html#aeff0177e2111139469b60733248fad8d">More...</a><br /></td></tr>
+<tr class="separator:aeff0177e2111139469b60733248fad8d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45d7d211135edd97ca21b047439db485"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a45d7d211135edd97ca21b047439db485">Cross</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v1, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v2)</td></tr>
+<tr class="memdesc:a45d7d211135edd97ca21b047439db485"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns v1 cross v2. <a href="classmingfx_1_1_vector3.html#a45d7d211135edd97ca21b047439db485">More...</a><br /></td></tr>
+<tr class="separator:a45d7d211135edd97ca21b047439db485"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a235fb20d4075960d2ce6198dc95ac507"><td class="memItemLeft" align="right" valign="top">static float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a235fb20d4075960d2ce6198dc95ac507">Dot</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v1, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v2)</td></tr>
+<tr class="memdesc:a235fb20d4075960d2ce6198dc95ac507"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns v1 dot v2. <a href="classmingfx_1_1_vector3.html#a235fb20d4075960d2ce6198dc95ac507">More...</a><br /></td></tr>
+<tr class="separator:a235fb20d4075960d2ce6198dc95ac507"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a489b042bedf8fa329ac05fe905ca1c6f"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html#a489b042bedf8fa329ac05fe905ca1c6f">Lerp</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;a, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;b, float alpha)</td></tr>
+<tr class="memdesc:a489b042bedf8fa329ac05fe905ca1c6f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Linear interpolation between two vectors. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b', other values blend between the two. <a href="classmingfx_1_1_vector3.html#a489b042bedf8fa329ac05fe905ca1c6f">More...</a><br /></td></tr>
+<tr class="separator:a489b042bedf8fa329ac05fe905ca1c6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a7f57af8bbecbc793fa17def4521de4dd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7f57af8bbecbc793fa17def4521de4dd">&#9670;&nbsp;</a></span>Vector3() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Vector3::Vector3 </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Default constructor to create zero vector. </p>
+
+</div>
+</div>
+<a id="a256018f34e230d542027d07d14fd6e65"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a256018f34e230d542027d07d14fd6e65">&#9670;&nbsp;</a></span>Vector3() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Vector3::Vector3 </td>
+ <td>(</td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>z</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a vector (x,y,z,0), where the 0 comes from the use of homogeneous coordinates in computer graphics. </p>
+
+</div>
+</div>
+<a id="a95b274c7a5ff118af20bc71682c6b1f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a95b274c7a5ff118af20bc71682c6b1f1">&#9670;&nbsp;</a></span>Vector3() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Vector3::Vector3 </td>
+ <td>(</td>
+ <td class="paramtype">float *&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs a vector given a pointer to x,y,z data. </p>
+
+</div>
+</div>
+<a id="af6100965af7770f833dbf0c9f30f4fdd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af6100965af7770f833dbf0c9f30f4fdd">&#9670;&nbsp;</a></span>Vector3() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mingfx::Vector3::Vector3 </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy constructor for vector. </p>
+
+</div>
+</div>
+<a id="a6e0d09d774615bcfde5645c22a645969"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6e0d09d774615bcfde5645c22a645969">&#9670;&nbsp;</a></span>~Vector3()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual mingfx::Vector3::~Vector3 </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Vector destructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a38cd4deed7d342464619b34b0ef95bec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a38cd4deed7d342464619b34b0ef95bec">&#9670;&nbsp;</a></span>Cross() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::Vector3::Cross </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns "this cross v", for example: </p>
+<div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> <a class="code" href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">x</a>(1,0,0);</div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> <a class="code" href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">y</a>(0,1,0);</div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> <a class="code" href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6">z</a> = <a class="code" href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">x</a>.Cross(<a class="code" href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">y</a>);</div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a78d1dba881575517f0427d55cc418df6"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6">mingfx::Vector3::z</a></div><div class="ttdeci">float z() const</div><div class="ttdoc">Read only access to the z coordinate. Can also use my_vector[2]. Use the my_vector[2] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00112">vector3.h:112</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_ac380342bfa614c9a3babe1efd14d2cf4"><div class="ttname"><a href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">mingfx::Vector3::x</a></div><div class="ttdeci">float x() const</div><div class="ttdoc">Read only access to the x coordinate. Can also use my_vector[0]. Use the my_vector[0] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00104">vector3.h:104</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_aeb74fbc0a970b40abb0db8f8e490ee17"><div class="ttname"><a href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">mingfx::Vector3::y</a></div><div class="ttdeci">float y() const</div><div class="ttdoc">Read only access to the y coordinate. Can also use my_vector[1]. Use the my_vector[1] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00108">vector3.h:108</a></div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="a45d7d211135edd97ca21b047439db485"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a45d7d211135edd97ca21b047439db485">&#9670;&nbsp;</a></span>Cross() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::Vector3::Cross </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns v1 cross v2. </p>
+<p>This is just an alternative syntax for <a class="el" href="classmingfx_1_1_vector3.html#a38cd4deed7d342464619b34b0ef95bec" title="Returns &quot;this cross v&quot;, for example:">Cross()</a>. Example: ~~~ <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> x(1,0,0); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> y(0,1,0); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> z1 = Vector3::Cross(x,y); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> z2 = x.Cross(y); z1 and z2 are the same. ~~~ </p>
+
+</div>
+</div>
+<a id="a31692a459a8056fe220d115eb5addc88"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a31692a459a8056fe220d115eb5addc88">&#9670;&nbsp;</a></span>Dot() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector3::Dot </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns "this dot v", for example: </p>
+<div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> a(1,0,0);</div>
+<div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> b(0.5,0,0);</div>
+<div class="line"><span class="keywordtype">float</span> c = a.Dot(b);</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="a235fb20d4075960d2ce6198dc95ac507"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a235fb20d4075960d2ce6198dc95ac507">&#9670;&nbsp;</a></span>Dot() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static float mingfx::Vector3::Dot </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns v1 dot v2. </p>
+<p>This is just an alternative syntax for <a class="el" href="classmingfx_1_1_vector3.html#a31692a459a8056fe220d115eb5addc88" title="Returns &quot;this dot v&quot;, for example:">Dot()</a>. Example: ~~~ <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> a(1,0,0); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> b(0.5,0,0); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> c1 = a.Dot(b); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> c2 = Vector3::Dot(a,b); c1 and c2 are the same. ~~~ </p>
+
+</div>
+</div>
+<a id="a7633dc1625b1f2e6b381438e896b45a3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7633dc1625b1f2e6b381438e896b45a3">&#9670;&nbsp;</a></span>Length()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector3::Length </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the length of the vector. </p>
+
+</div>
+</div>
+<a id="a489b042bedf8fa329ac05fe905ca1c6f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a489b042bedf8fa329ac05fe905ca1c6f">&#9670;&nbsp;</a></span>Lerp() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::Vector3::Lerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Linear interpolation between two vectors. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b', other values blend between the two. </p>
+
+</div>
+</div>
+<a id="a8dafc21c64a4964bac27519972d909b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8dafc21c64a4964bac27519972d909b6">&#9670;&nbsp;</a></span>Lerp() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::Vector3::Lerp </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">float&#160;</td>
+ <td class="paramname"><em>alpha</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Linear interpolation between this vector and another. Alpha=0.0 returns this vector, and alpha=1.0 returns the other vector, other values blend between the two. </p>
+
+</div>
+</div>
+<a id="a9b8e9ecbe10477adec527842f62d0dca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9b8e9ecbe10477adec527842f62d0dca">&#9670;&nbsp;</a></span>Normalize() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void mingfx::Vector3::Normalize </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Normalizes the vector by making it unit length. </p>
+
+</div>
+</div>
+<a id="aeff0177e2111139469b60733248fad8d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeff0177e2111139469b60733248fad8d">&#9670;&nbsp;</a></span>Normalize() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::Vector3::Normalize </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns a new vector that is the unit version of v. </p>
+<p>This is just an alternative syntax for <a class="el" href="classmingfx_1_1_vector3.html#a3caef3c6f24b90730ef70c84ce0e0d71" title="Returns a normalized (i.e., unit length) version of the vector without modifying the original &#39;this&#39; ...">ToUnit()</a>. Example: ~~~ <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> a(100,150,80); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> b = Vector3::Normalize(a); <a class="el" href="classmingfx_1_1_vector3.html" title="A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...">Vector3</a> c = a.ToUnit(); b and c are the same. ~~~ </p>
+
+</div>
+</div>
+<a id="af71b12760516a9cc4837ba9e1dee28db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af71b12760516a9cc4837ba9e1dee28db">&#9670;&nbsp;</a></span>One()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; mingfx::Vector3::One </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(1,1,1) - a shortcut for a special vector that is frequently needed </p>
+
+</div>
+</div>
+<a id="ab93acb916c310920b9c011159eaaa016"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab93acb916c310920b9c011159eaaa016">&#9670;&nbsp;</a></span>operator!=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Vector3::operator!= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "inequality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="aa5b1c05c285fad7f2709f6f351a63608"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa5b1c05c285fad7f2709f6f351a63608">&#9670;&nbsp;</a></span>operator=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; mingfx::Vector3::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Vector assignment operator. </p>
+
+</div>
+</div>
+<a id="a85486d0a355417fe4b41fa64146c9e98"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a85486d0a355417fe4b41fa64146c9e98">&#9670;&nbsp;</a></span>operator==()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool mingfx::Vector3::operator== </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for "equality", taking floating point imprecision into account. </p>
+
+</div>
+</div>
+<a id="abcdda4627b24af879aba38d4fc0e6f71"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abcdda4627b24af879aba38d4fc0e6f71">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float&amp; mingfx::Vector3::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a reference to the ith coordinate of the vector. Use this accessor if you wish to set the coordinate rather than just request its value. Example: </p>
+<div class="fragment"><div class="line"><a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a> a;</div>
+<div class="line">a[0] = 5.0; <span class="comment">// set the x-coordinate of the vector</span></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="aa37b1fc4b1df9f72726d981c08cd0d1b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa37b1fc4b1df9f72726d981c08cd0d1b">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector3::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const int&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read only access to the ith coordinate of the vector. </p>
+
+</div>
+</div>
+<a id="a3caef3c6f24b90730ef70c84ce0e0d71"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3caef3c6f24b90730ef70c84ce0e0d71">&#9670;&nbsp;</a></span>ToUnit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::Vector3::ToUnit </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a normalized (i.e., unit length) version of the vector without modifying the original 'this' vector. </p>
+
+</div>
+</div>
+<a id="ae8d822fdea67f63580b4e1f78f5b8922"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae8d822fdea67f63580b4e1f78f5b8922">&#9670;&nbsp;</a></span>UnitX()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; mingfx::Vector3::UnitX </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(1,0,0) - a shortcut for a special vector that is frequently needed </p>
+
+</div>
+</div>
+<a id="a8d31e433d1ac04aaceea1b1dcd1643df"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8d31e433d1ac04aaceea1b1dcd1643df">&#9670;&nbsp;</a></span>UnitY()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; mingfx::Vector3::UnitY </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(0,1,0) - a shortcut for a special vector that is frequently needed </p>
+
+</div>
+</div>
+<a id="a4b696b0d1143d6e30a34a2f889d2ca61"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4b696b0d1143d6e30a34a2f889d2ca61">&#9670;&nbsp;</a></span>UnitZ()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; mingfx::Vector3::UnitZ </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(0,0,1) - a shortcut for a special vector that is frequently needed </p>
+
+</div>
+</div>
+<a id="aa7ddfd662e866c019a772ba66eae7331"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa7ddfd662e866c019a772ba66eae7331">&#9670;&nbsp;</a></span>value_ptr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const float* mingfx::Vector3::value_ptr </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a const pointer to the raw data array. </p>
+
+</div>
+</div>
+<a id="a2556298f536ba115019982222ce6e0c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2556298f536ba115019982222ce6e0c5">&#9670;&nbsp;</a></span>w()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector3::w </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>In homogeneous coordinates, the w coordinate for all vectors is 0.0. </p>
+
+<p class="definition">Definition at line <a class="el" href="vector3_8h_source.html#l00115">115</a> of file <a class="el" href="vector3_8h_source.html">vector3.h</a>.</p>
+
+</div>
+</div>
+<a id="ac380342bfa614c9a3babe1efd14d2cf4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac380342bfa614c9a3babe1efd14d2cf4">&#9670;&nbsp;</a></span>x()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector3::x </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the x coordinate. Can also use my_vector[0]. Use the my_vector[0] = 1.0; form if you need to set the value. </p>
+
+<p class="definition">Definition at line <a class="el" href="vector3_8h_source.html#l00104">104</a> of file <a class="el" href="vector3_8h_source.html">vector3.h</a>.</p>
+
+</div>
+</div>
+<a id="aeb74fbc0a970b40abb0db8f8e490ee17"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeb74fbc0a970b40abb0db8f8e490ee17">&#9670;&nbsp;</a></span>y()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector3::y </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the y coordinate. Can also use my_vector[1]. Use the my_vector[1] = 1.0; form if you need to set the value. </p>
+
+<p class="definition">Definition at line <a class="el" href="vector3_8h_source.html#l00108">108</a> of file <a class="el" href="vector3_8h_source.html">vector3.h</a>.</p>
+
+</div>
+</div>
+<a id="a78d1dba881575517f0427d55cc418df6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78d1dba881575517f0427d55cc418df6">&#9670;&nbsp;</a></span>z()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">float mingfx::Vector3::z </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read only access to the z coordinate. Can also use my_vector[2]. Use the my_vector[2] = 1.0; form if you need to set the value. </p>
+
+<p class="definition">Definition at line <a class="el" href="vector3_8h_source.html#l00112">112</a> of file <a class="el" href="vector3_8h_source.html">vector3.h</a>.</p>
+
+</div>
+</div>
+<a id="a52bf8582baa71e7d6f80c412687d9714"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a52bf8582baa71e7d6f80c412687d9714">&#9670;&nbsp;</a></span>Zero()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; mingfx::Vector3::Zero </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>(0,0,0) - a shortcut for a special vector that is frequently needed </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>src/<a class="el" href="vector3_8h_source.html">vector3.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/closed.png b/dev/MinGfx/docs/html/closed.png
new file mode 100644
index 0000000..11c68ad
--- /dev/null
+++ b/dev/MinGfx/docs/html/closed.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/color_8h.html b/dev/MinGfx/docs/html/color_8h.html
new file mode 100644
index 0000000..5a00a99
--- /dev/null
+++ b/dev/MinGfx/docs/html/color_8h.html
@@ -0,0 +1,119 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/color.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">color.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;iostream&gt;</code><br />
+<code>#include &lt;vector&gt;</code><br />
+</div>
+<p><a href="color_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html">mingfx::Color</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with OpenGL. <a href="classmingfx_1_1_color.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6bc967741341f4f318a505d884192906"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">mingfx::operator&lt;&lt;</a> (std::ostream &amp;os, const Color &amp;c)</td></tr>
+<tr class="separator:a6bc967741341f4f318a505d884192906"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6eb31e6e81c6e29144799be4c9db404d"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">mingfx::operator&gt;&gt;</a> (std::istream &amp;is, Color &amp;c)</td></tr>
+<tr class="separator:a6eb31e6e81c6e29144799be4c9db404d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/color_8h_source.html b/dev/MinGfx/docs/html/color_8h_source.html
new file mode 100644
index 0000000..b3c037f
--- /dev/null
+++ b/dev/MinGfx/docs/html/color_8h_source.html
@@ -0,0 +1,177 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/color.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">color.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="color_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_COLOR_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_COLOR_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; </div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
+<div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html"> 41</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_color.html">Color</a> {</div>
+<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="keyword">public</span>: </div>
+<div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d"> 44</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">Color</a>();</div>
+<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; </div>
+<div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#a81b442b8afcd157c260487081f25dcc3"> 47</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html#a81b442b8afcd157c260487081f25dcc3">Color</a>(<span class="keywordtype">float</span> red, <span class="keywordtype">float</span> green, <span class="keywordtype">float</span> blue, <span class="keywordtype">float</span> alpha=1.0);</div>
+<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; </div>
+<div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#ab4d6c067128e779add5390d83ea3410e"> 50</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html#ab4d6c067128e779add5390d83ea3410e">Color</a>(<span class="keywordtype">float</span> *p);</div>
+<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; </div>
+<div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#a7e0ca85141895a108c852f59f7ca00b9"> 53</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html#a7e0ca85141895a108c852f59f7ca00b9">Color</a>(<span class="keyword">const</span> std::vector&lt;float&gt; &amp;vals);</div>
+<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; </div>
+<div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#accb83cd759b7290ce2817724d57e246a"> 56</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html#accb83cd759b7290ce2817724d57e246a">Color</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a>&amp; p);</div>
+<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; </div>
+<div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#ab1a90432dd7fd7b2adf41d747be85378"> 59</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_color.html#ab1a90432dd7fd7b2adf41d747be85378">~Color</a>();</div>
+<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; </div>
+<div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#a5411077527ff2a12d18ce1ae52688cf0"> 62</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_color.html#a5411077527ff2a12d18ce1ae52688cf0">operator==</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a>&amp; p) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; </div>
+<div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#acf92f9f413cf11639b73dc0d7d431244"> 65</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_color.html#acf92f9f413cf11639b73dc0d7d431244">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a>&amp; p) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
+<div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#ae51a066a9bb018e4f050d9b8cc7f330e"> 68</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html">Color</a>&amp; <a class="code" href="classmingfx_1_1_color.html#ae51a066a9bb018e4f050d9b8cc7f330e">operator=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a>&amp; p);</div>
+<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; </div>
+<div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#aa879c4f6e90c419a2c121e323ce31500"> 71</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_color.html#aa879c4f6e90c419a2c121e323ce31500">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; </div>
+<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#a474ed028db8b31e359d8bfec50147bcc"> 74</a></span>&#160; <span class="keywordtype">float</span>&amp; <a class="code" href="classmingfx_1_1_color.html#a474ed028db8b31e359d8bfec50147bcc">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i);</div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; </div>
+<div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#aa3a93033db8e00aff817a125eb5b54a0"> 77</a></span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> * <a class="code" href="classmingfx_1_1_color.html#aa3a93033db8e00aff817a125eb5b54a0">value_ptr</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
+<div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#ae7371e464c4af7ac93d9edd4c0772c2b"> 79</a></span>&#160; std::vector&lt;float&gt; <a class="code" href="classmingfx_1_1_color.html#ae7371e464c4af7ac93d9edd4c0772c2b">ToVector</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; </div>
+<div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#abdec9bbfdd82ed75afc45b103c8bbcf4"> 84</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html">Color</a> <a class="code" href="classmingfx_1_1_color.html#abdec9bbfdd82ed75afc45b103c8bbcf4">Lerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;b, <span class="keywordtype">float</span> alpha) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; </div>
+<div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="classmingfx_1_1_color.html#a883787431fef36c06c724c3b9ed25363"> 89</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> <a class="code" href="classmingfx_1_1_color.html#a883787431fef36c06c724c3b9ed25363">Lerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;a, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;b, <span class="keywordtype">float</span> alpha);</div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; </div>
+<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; </div>
+<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keywordtype">float</span> c[4];</div>
+<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;};</div>
+<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; </div>
+<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; </div>
+<div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906"> 97</a></span>&#160;std::ostream &amp; <a class="code" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">operator&lt;&lt; </a>( std::ostream &amp;os, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;c);</div>
+<div class="line"><a name="l00098"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d"> 98</a></span>&#160;std::istream &amp; <a class="code" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">operator&gt;&gt; </a>( std::istream &amp;is, <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;c);</div>
+<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; </div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; </div>
+<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;} <span class="comment">// namespace</span></div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
+<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html"><div class="ttname"><a href="classmingfx_1_1_color.html">mingfx::Color</a></div><div class="ttdoc">Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with Op...</div><div class="ttdef"><b>Definition:</b> <a href="color_8h_source.html#l00041">color.h:41</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_a474ed028db8b31e359d8bfec50147bcc"><div class="ttname"><a href="classmingfx_1_1_color.html#a474ed028db8b31e359d8bfec50147bcc">mingfx::Color::operator[]</a></div><div class="ttdeci">float &amp; operator[](const int i)</div><div class="ttdoc">Accesses the ith coordinate of the color, stored in RGBA order.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_a5411077527ff2a12d18ce1ae52688cf0"><div class="ttname"><a href="classmingfx_1_1_color.html#a5411077527ff2a12d18ce1ae52688cf0">mingfx::Color::operator==</a></div><div class="ttdeci">bool operator==(const Color &amp;p) const</div><div class="ttdoc">Check for equality.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_a7e0ca85141895a108c852f59f7ca00b9"><div class="ttname"><a href="classmingfx_1_1_color.html#a7e0ca85141895a108c852f59f7ca00b9">mingfx::Color::Color</a></div><div class="ttdeci">Color(const std::vector&lt; float &gt; &amp;vals)</div><div class="ttdoc">Constructs a point given a 3 or 4-element vector of floats.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_a81b442b8afcd157c260487081f25dcc3"><div class="ttname"><a href="classmingfx_1_1_color.html#a81b442b8afcd157c260487081f25dcc3">mingfx::Color::Color</a></div><div class="ttdeci">Color(float red, float green, float blue, float alpha=1.0)</div><div class="ttdoc">Constructs a color. Alpha defaults to 1.0 (completely opaque)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_a883787431fef36c06c724c3b9ed25363"><div class="ttname"><a href="classmingfx_1_1_color.html#a883787431fef36c06c724c3b9ed25363">mingfx::Color::Lerp</a></div><div class="ttdeci">static Color Lerp(const Color &amp;a, const Color &amp;b, float alpha)</div><div class="ttdoc">Linear interpolation between two colors. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b',...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_aa3a93033db8e00aff817a125eb5b54a0"><div class="ttname"><a href="classmingfx_1_1_color.html#aa3a93033db8e00aff817a125eb5b54a0">mingfx::Color::value_ptr</a></div><div class="ttdeci">const float * value_ptr() const</div><div class="ttdoc">Returns a const pointer to the raw data array.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_aa879c4f6e90c419a2c121e323ce31500"><div class="ttname"><a href="classmingfx_1_1_color.html#aa879c4f6e90c419a2c121e323ce31500">mingfx::Color::operator[]</a></div><div class="ttdeci">float operator[](const int i) const</div><div class="ttdoc">Accesses the ith component of the color, stored in RGBA order.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_ab1a90432dd7fd7b2adf41d747be85378"><div class="ttname"><a href="classmingfx_1_1_color.html#ab1a90432dd7fd7b2adf41d747be85378">mingfx::Color::~Color</a></div><div class="ttdeci">virtual ~Color()</div><div class="ttdoc">Color destructor.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_ab4d264b5a1189b73443948c01eab088d"><div class="ttname"><a href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">mingfx::Color::Color</a></div><div class="ttdeci">Color()</div><div class="ttdoc">Defaults to black.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_ab4d6c067128e779add5390d83ea3410e"><div class="ttname"><a href="classmingfx_1_1_color.html#ab4d6c067128e779add5390d83ea3410e">mingfx::Color::Color</a></div><div class="ttdeci">Color(float *p)</div><div class="ttdoc">Constructs a point given a pointer to float array.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_abdec9bbfdd82ed75afc45b103c8bbcf4"><div class="ttname"><a href="classmingfx_1_1_color.html#abdec9bbfdd82ed75afc45b103c8bbcf4">mingfx::Color::Lerp</a></div><div class="ttdeci">Color Lerp(const Color &amp;b, float alpha) const</div><div class="ttdoc">Linear interpolation between this color and another. Alpha=0.0 returns this color,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_accb83cd759b7290ce2817724d57e246a"><div class="ttname"><a href="classmingfx_1_1_color.html#accb83cd759b7290ce2817724d57e246a">mingfx::Color::Color</a></div><div class="ttdeci">Color(const Color &amp;p)</div><div class="ttdoc">Copy constructor.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_acf92f9f413cf11639b73dc0d7d431244"><div class="ttname"><a href="classmingfx_1_1_color.html#acf92f9f413cf11639b73dc0d7d431244">mingfx::Color::operator!=</a></div><div class="ttdeci">bool operator!=(const Color &amp;p) const</div><div class="ttdoc">Check for inequality.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_ae51a066a9bb018e4f050d9b8cc7f330e"><div class="ttname"><a href="classmingfx_1_1_color.html#ae51a066a9bb018e4f050d9b8cc7f330e">mingfx::Color::operator=</a></div><div class="ttdeci">Color &amp; operator=(const Color &amp;p)</div><div class="ttdoc">Assignment operator.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html_ae7371e464c4af7ac93d9edd4c0772c2b"><div class="ttname"><a href="classmingfx_1_1_color.html#ae7371e464c4af7ac93d9edd4c0772c2b">mingfx::Color::ToVector</a></div><div class="ttdeci">std::vector&lt; float &gt; ToVector() const</div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="anamespacemingfx_html_a6bc967741341f4f318a505d884192906"><div class="ttname"><a href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">mingfx::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a6eb31e6e81c6e29144799be4c9db404d"><div class="ttname"><a href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">mingfx::operator&gt;&gt;</a></div><div class="ttdeci">std::istream &amp; operator&gt;&gt;(std::istream &amp;is, Color &amp;c)</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/craft__cam_8h.html b/dev/MinGfx/docs/html/craft__cam_8h.html
new file mode 100644
index 0000000..fd8beaf
--- /dev/null
+++ b/dev/MinGfx/docs/html/craft__cam_8h.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/craft_cam.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">craft_cam.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="point2_8h_source.html">point2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="matrix4_8h_source.html">matrix4.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector2_8h_source.html">vector2.h</a>&quot;</code><br />
+</div>
+<p><a href="craft__cam_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This implements a user interface for controlling the camera with the mouse. <a href="classmingfx_1_1_craft_cam.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/craft__cam_8h_source.html b/dev/MinGfx/docs/html/craft__cam_8h_source.html
new file mode 100644
index 0000000..289eb02
--- /dev/null
+++ b/dev/MinGfx/docs/html/craft__cam_8h_source.html
@@ -0,0 +1,211 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/craft_cam.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">craft_cam.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="craft__cam_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_CRAFT_CAM_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_CRAFT_CAM_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point2_8h.html">point2.h</a>&quot;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="matrix4_8h.html">matrix4.h</a>&quot;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector2_8h.html">vector2.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; </div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; </div>
+<div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html"> 79</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_craft_cam.html">CraftCam</a> {</div>
+<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; </div>
+<div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171"> 83</a></span>&#160; <a class="code" href="classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171">CraftCam</a>();</div>
+<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; </div>
+<div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#ab9e1864b5859c22d27ba809b1ba7a51f"> 86</a></span>&#160; <a class="code" href="classmingfx_1_1_craft_cam.html#ab9e1864b5859c22d27ba809b1ba7a51f">CraftCam</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;initial_view_matrix);</div>
+<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; </div>
+<div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a85ef9bebdd1595be1288bc104245f4ff"> 88</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_craft_cam.html#a85ef9bebdd1595be1288bc104245f4ff">~CraftCam</a>();</div>
+<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; </div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; </div>
+<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="comment">// To make the interaction work, the following set of functions need to be</span></div>
+<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="comment">// called from your GraphicsApp or whatever main application class you use</span></div>
+<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="comment">// to receive user input events and a draw callback.</span></div>
+<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
+<div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7"> 104</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7">UpdateSimulation</a>(<span class="keywordtype">double</span> dt, GLFWwindow *window_ptr);</div>
+<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; </div>
+<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; </div>
+<div class="line"><a name="l00125"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311"> 125</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311">OnMouseMove</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;normalized_mouse_delta);</div>
+<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; </div>
+<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; </div>
+<div class="line"><a name="l00137"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36"> 137</a></span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36">view_matrix</a>();</div>
+<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; </div>
+<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; </div>
+<div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a82a8e20596247e2986e5929c1ef7f150"> 142</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_craft_cam.html#a82a8e20596247e2986e5929c1ef7f150">eye</a>();</div>
+<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; </div>
+<div class="line"><a name="l00146"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a2c7546bccfbf986eb9cd0a2784f74859"> 146</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_craft_cam.html#a2c7546bccfbf986eb9cd0a2784f74859">look</a>();</div>
+<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; </div>
+<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; </div>
+<div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#ae3d9c7ea9307dbbadaa4b6e2f9933a7b"> 153</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_craft_cam.html#ae3d9c7ea9307dbbadaa4b6e2f9933a7b">UpdateHeight</a>(<span class="keywordtype">float</span> new_y_value);</div>
+<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; </div>
+<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; </div>
+<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="comment">// -------------</span></div>
+<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; </div>
+<div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8"> 160</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8">set_view_matrix</a>(<a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36">view_matrix</a>);</div>
+<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; </div>
+<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; </div>
+<div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a93567af7acbae2939d57cfd8a72bcef2"> 167</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_craft_cam.html#a93567af7acbae2939d57cfd8a72bcef2">translation_scale</a>();</div>
+<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; </div>
+<div class="line"><a name="l00173"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a151fde09d08001ee2a615f25ec1acea7"> 173</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_craft_cam.html#a151fde09d08001ee2a615f25ec1acea7">set_translation_scale</a>(<span class="keywordtype">float</span> s);</div>
+<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; </div>
+<div class="line"><a name="l00179"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a9fe22cc3b933b12674a5b8f1b5c834ac"> 179</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_craft_cam.html#a9fe22cc3b933b12674a5b8f1b5c834ac">rotation_scale</a>();</div>
+<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; </div>
+<div class="line"><a name="l00185"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a352f5a42f6e88d2e599bd5acb42e5831"> 185</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_craft_cam.html#a352f5a42f6e88d2e599bd5acb42e5831">set_rotation_scale</a>(<span class="keywordtype">float</span> s);</div>
+<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; </div>
+<div class="line"><a name="l00190"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a96ba4a36029ca8234576cbf2791c5ccb"> 190</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_craft_cam.html#a96ba4a36029ca8234576cbf2791c5ccb">look_scale</a>();</div>
+<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; </div>
+<div class="line"><a name="l00195"></a><span class="lineno"><a class="line" href="classmingfx_1_1_craft_cam.html#a15092ae5de6920546e3ce79aeb196f44"> 195</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_craft_cam.html#a15092ae5de6920546e3ce79aeb196f44">set_look_scale</a>(<span class="keywordtype">float</span> s);</div>
+<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; </div>
+<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; </div>
+<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keywordtype">void</span> WalkForward(<span class="keywordtype">double</span> dt);</div>
+<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keywordtype">void</span> WalkBackward(<span class="keywordtype">double</span> dt);</div>
+<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="keywordtype">void</span> RotateLeft(<span class="keywordtype">double</span> dt);</div>
+<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordtype">void</span> RotateRight(<span class="keywordtype">double</span> dt);</div>
+<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordtype">void</span> LookWithMouse(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;mouse_delta);</div>
+<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; </div>
+<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordtype">float</span> t_scale_;</div>
+<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="keywordtype">float</span> r_scale_;</div>
+<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keywordtype">float</span> l_scale_;</div>
+<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="keywordtype">float</span> yaw_;</div>
+<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keywordtype">float</span> pitch_;</div>
+<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> base_head_;</div>
+<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> added_rot_;</div>
+<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;};</div>
+<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; </div>
+<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; </div>
+<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; </div>
+<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; </div>
+<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; </div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html">mingfx::CraftCam</a></div><div class="ttdoc">This implements a user interface for controlling the camera with the mouse.</div><div class="ttdef"><b>Definition:</b> <a href="craft__cam_8h_source.html#l00079">craft_cam.h:79</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a15092ae5de6920546e3ce79aeb196f44"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a15092ae5de6920546e3ce79aeb196f44">mingfx::CraftCam::set_look_scale</a></div><div class="ttdeci">void set_look_scale(float s)</div><div class="ttdoc">This is the scale factor used to speed up / slow down looking around when moving the head with the mo...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a151fde09d08001ee2a615f25ec1acea7"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a151fde09d08001ee2a615f25ec1acea7">mingfx::CraftCam::set_translation_scale</a></div><div class="ttdeci">void set_translation_scale(float s)</div><div class="ttdoc">This is the scale factor used to speed up / slow down forward/backward translation when walking for t...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a2b7808e489933b117583cf709fa46bc7"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7">mingfx::CraftCam::UpdateSimulation</a></div><div class="ttdeci">void UpdateSimulation(double dt, GLFWwindow *window_ptr)</div><div class="ttdoc">Call this from your app's UpdateSimulation() method. This tells the camera to simulate walking based ...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a2c7546bccfbf986eb9cd0a2784f74859"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a2c7546bccfbf986eb9cd0a2784f74859">mingfx::CraftCam::look</a></div><div class="ttdeci">Vector3 look()</div><div class="ttdoc">Returns the look direction (i.e., -Z axis of the camera matrix) in world space coordinates.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a352f5a42f6e88d2e599bd5acb42e5831"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a352f5a42f6e88d2e599bd5acb42e5831">mingfx::CraftCam::set_rotation_scale</a></div><div class="ttdeci">void set_rotation_scale(float s)</div><div class="ttdoc">This is the scale factor used to speed up / slow down left/right rotation when walking for the LEFT /...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a79a194be8675a0a968f14fe3dcd79da8"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8">mingfx::CraftCam::set_view_matrix</a></div><div class="ttdeci">void set_view_matrix(Matrix4 view_matrix)</div><div class="ttdoc">This is not required, but you may use this if you wish to set an initial view matrix or reset the vie...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a82a8e20596247e2986e5929c1ef7f150"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a82a8e20596247e2986e5929c1ef7f150">mingfx::CraftCam::eye</a></div><div class="ttdeci">Point3 eye()</div><div class="ttdoc">Returns the &quot;eye&quot; point (i.e., focal point) of the camera in world space coordinates.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a8366e9d8e9bb3b048d1dd14af2f76311"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311">mingfx::CraftCam::OnMouseMove</a></div><div class="ttdeci">void OnMouseMove(const Vector2 &amp;normalized_mouse_delta)</div><div class="ttdoc">Call this from your app's OnMouseMove() or On*MouseDrag() method. Use OnMouseMove() if you want to al...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a85ef9bebdd1595be1288bc104245f4ff"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a85ef9bebdd1595be1288bc104245f4ff">mingfx::CraftCam::~CraftCam</a></div><div class="ttdeci">virtual ~CraftCam()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a93567af7acbae2939d57cfd8a72bcef2"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a93567af7acbae2939d57cfd8a72bcef2">mingfx::CraftCam::translation_scale</a></div><div class="ttdeci">float translation_scale()</div><div class="ttdoc">This is the scale factor used to speed up / slow down forward/backward translation when walking for t...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a96ba4a36029ca8234576cbf2791c5ccb"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a96ba4a36029ca8234576cbf2791c5ccb">mingfx::CraftCam::look_scale</a></div><div class="ttdeci">float look_scale()</div><div class="ttdoc">This is the scale factor used to speed up / slow down looking around when moving the head with the mo...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_a9fe22cc3b933b12674a5b8f1b5c834ac"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#a9fe22cc3b933b12674a5b8f1b5c834ac">mingfx::CraftCam::rotation_scale</a></div><div class="ttdeci">float rotation_scale()</div><div class="ttdoc">This is the scale factor used to speed up / slow down left/right rotation when walking for the LEFT /...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_ab9e1864b5859c22d27ba809b1ba7a51f"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#ab9e1864b5859c22d27ba809b1ba7a51f">mingfx::CraftCam::CraftCam</a></div><div class="ttdeci">CraftCam(const Matrix4 &amp;initial_view_matrix)</div><div class="ttdoc">Creates a CraftCam object with the supplied initial view matrix.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_acccdadc08d8d8a0b7b9426f18209ff36"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36">mingfx::CraftCam::view_matrix</a></div><div class="ttdeci">Matrix4 view_matrix()</div><div class="ttdoc">Access the camera view matrix created by the CraftCam interactions via this method and use it to draw...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_ae0b0e8d75ffc69c6373a13f1f9c2f171"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171">mingfx::CraftCam::CraftCam</a></div><div class="ttdeci">CraftCam()</div><div class="ttdoc">Creates a CraftCam object with an initial view matrix = identity.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_craft_cam_html_ae3d9c7ea9307dbbadaa4b6e2f9933a7b"><div class="ttname"><a href="classmingfx_1_1_craft_cam.html#ae3d9c7ea9307dbbadaa4b6e2f9933a7b">mingfx::CraftCam::UpdateHeight</a></div><div class="ttdeci">void UpdateHeight(float new_y_value)</div><div class="ttdoc">Sets the y value of the camera (i.e., the height). If you want to set the entire view matrix,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html"><div class="ttname"><a href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></div><div class="ttdoc">A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...</div><div class="ttdef"><b>Definition:</b> <a href="matrix4_8h_source.html#l00050">matrix4.h:50</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html"><div class="ttname"><a href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></div><div class="ttdoc">A 2D Vector with floating point coordinates, used for storing 2D translations, mouse movements,...</div><div class="ttdef"><b>Definition:</b> <a href="vector2_8h_source.html#l00028">vector2.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="amatrix4_8h_html"><div class="ttname"><a href="matrix4_8h.html">matrix4.h</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="apoint2_8h_html"><div class="ttname"><a href="point2_8h.html">point2.h</a></div></div>
+<div class="ttc" id="avector2_8h_html"><div class="ttname"><a href="vector2_8h.html">vector2.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/customdoxygen.css b/dev/MinGfx/docs/html/customdoxygen.css
new file mode 100644
index 0000000..e1c976b
--- /dev/null
+++ b/dev/MinGfx/docs/html/customdoxygen.css
@@ -0,0 +1,524 @@
+body, table, div, p, dl {
+ font: 400 14px/22px "Helvetica", "Arial", sans-serif;
+ text-decoration: none;
+ font-weight: normal;
+}
+
+tr {
+ background-image: none;
+ background-color: #FFFFFF;
+}
+
+h1.groupheader {
+ font-size: 100%;
+ text-decoration: none;
+ font-weight: normal;
+}
+
+#titlearea
+{
+ padding: 10px;
+ margin: 0px;
+ width: 100%;
+ border-top: 5px solid black;
+ border-bottom: 5px solid black;
+}
+
+
+div.header
+{
+ background-image: none;
+ background-color: #FFFFFF;
+ margin: 0px;
+ border-bottom: none;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+
+
+.title {
+ font: 400 14px/28px "Helvetica", "Arial", sans-serif;
+ font-size: 150%;
+ font-weight: normal;
+ margin: 10px 2px;
+ background-image: none;
+ background-color: white;
+ text-transform:uppercase;
+}
+
+
+h2.groupheader {
+ border-bottom: 1px solid black;
+ color: black;
+ font-size: 110%;
+ font-weight: normal;
+ text-transform:uppercase;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1 {
+ font-size: 150%;
+ background-color: rgb(26, 93, 117);
+ color: white;
+ padding: 4px;
+ margin-top: 60px;
+ margin-bottom: 0px;
+}
+
+h2 {
+ font-size: 125%;
+ text-transform:uppercase;
+ margin-top: 50px;
+}
+
+h3 {
+ font-size: 110%;
+ margin-top: 40px;
+}
+
+h4 {
+ font-size: 100%;
+}
+
+h5 {
+ font-size: 100%;
+}
+
+h6 {
+ font-size: 100%;
+}
+
+
+
+h1, h2, h3, h4, h5, h6 {
+ font-weight: normal;
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: none;
+}
+
+dt {
+ padding-top: 20px;
+ font-weight: normal;
+ text-decoration: underline;
+}
+
+
+
+
+.tabs, .tabs2, .tabs3 {
+ text-transform:uppercase;
+ font-weight:normal;
+ color:rgb(190,190,190);
+ background-image: none;
+ background-color: black;
+ width: 100%;
+ z-index: 101;
+ font-size: 14px;
+ font-family: "Helvetica", "Arial", sans-serif;
+ text-shadow: none;
+}
+
+.tabs2 {
+ color: white;
+ border-top:1px solid rgb(150,150,150);
+ font-size: 10px;
+ text-shadow: none;
+}
+.tabs3 {
+ color: white;
+ font-size: 9px;
+ text-shadow: none;
+}
+
+.tablist {
+ margin: 0;
+ padding: 0;
+ display: table;
+ background-color: black;
+ font-weight: normal;
+ text-shadow: none;
+}
+
+.tablist li {
+ float: left;
+ display: table-cell;
+ background-image: none;
+ line-height: 30px;
+ list-style: none;
+ font-weight: normal;
+ text-shadow: none;
+}
+
+.tablist a {
+ display: block;
+ padding: 0 30px;
+ font-weight: normal;
+ background-image: none;
+ color:rgb(150,150,150);
+ text-decoration: none;
+ outline: none;
+ text-shadow: none;
+}
+
+.tabs3 .tablist a {
+ padding: 0 10px;
+ text-shadow: none;
+}
+
+.tablist a:hover {
+ background-image: none;
+ background-repeat:repeat-x;
+ color:white;
+ text-decoration: none;
+ font-weight: normal;
+ text-shadow: none;
+ text-decoration: underline;
+}
+
+.tablist li.current a {
+ background-image: none;
+ color: rgb(42, 153, 193);
+ text-shadow: none;
+}
+
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:white;
+ font-size: 12px;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: white;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:white;
+}
+
+
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 100%;
+ border-top:1px solid rgb(150,150,150);
+ background-color: black;
+}
+
+.navpath ul {
+ font-size: 11px;
+ background-image: none;
+ height: 20px;
+ line-height: 20px;
+ color: rgb(150,150,150);
+ border: none;
+ overflow: hidden;
+ margin: 0px;
+ padding: 0px;
+}
+
+.navpath li {
+ padding-left:30px;
+}
+
+.navpath li.navelem a {
+ height: 20px;
+ display: block;
+ text-decoration: none;
+ outline: none;
+ color: rgb(150,150,150);
+ font-family: "Helvetica", "Arial", sans-serif;
+ text-shadow: none;
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover {
+ background-image: none;
+ background-repeat:repeat-x;
+ color: white;
+ text-decoration: none;
+ font-weight: normal;
+ text-shadow: none;
+ text-decoration: underline;
+}
+
+a.el {
+ font-weight: normal;
+ color: rgb(42, 153, 193);
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid black;
+}
+
+hr.footer {
+ border-top: 0px;
+}
+
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: white;
+ border: none;
+ margin: 0px;
+ padding: 0 0 0 0;
+}
+
+.memItemLeft, .memItemRight {
+ padding-top: 8px;
+}
+
+
+
+.memSeparator {
+ border-bottom: 1px solid #EEEEEE;
+ line-height: 1px;
+ padding: 8px 0 0 0;
+}
+
+
+
+
+pre.fragment {
+ border: none;
+ border-left: 3px solid rgb(42, 153, 193);
+ background-color: white;
+ padding: 4px 6px;
+ margin: 4px 2px 4px 30px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 100%;
+}
+
+div.fragment {
+ border: none;
+ border-left: 3px solid rgb(42, 153, 193);
+ background-color: white;
+ padding: 4px 6px;
+ margin: 4px 2px 4px 30px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 100%;
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 100%;
+ min-height: 13px;
+ line-height: 1.0;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+span.comment {
+ color: #800000;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #068000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: white;
+ border: none;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.memname {
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #EEEEEE;
+ border-left: 1px solid #EEEEEE;
+ border-right: 1px solid #EEEEEE;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: normal;
+ text-shadow: none;
+ background-image: none;
+ background-repeat:repeat-x;
+ background-color: white;
+ /* opera specific markup */
+ box-shadow: none;
+ /* firefox specific markup */
+ -moz-box-shadow: none;
+ /* webkit specific markup */
+ -webkit-box-shadow: none;
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #EEEEEE;
+ border-left: 1px solid #EEEEEE;
+ border-right: 1px solid #EEEEEE;
+ padding: 6px 10px 2px 10px;
+ background-color: white;
+ border-top-width: 0;
+ background-image: none;
+ background-repeat:repeat-x;
+ /* opera specific markup */
+ box-shadow: none;
+ /* firefox specific markup */
+ -moz-box-shadow: none;
+ /* webkit specific markup */
+ -webkit-box-shadow: none;
+}
+
+.paramname {
+ color: #148caf;
+ white-space: nowrap;
+}
+
+
+a {
+ color: rgb(42, 153, 193);
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: rgb(42, 153, 193);
+}
+
+
+span.lineno {
+ width: 0px;
+ padding-right: 4px;
+ text-align: right;
+ border-right: 0px;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+
+#MSearchBox {
+ margin-top: 2px;
+}
+
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ width: 33%;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 0px solid #373737;
+ padding: 3px 7px 2px;
+ font-size: 110%;
+}
+
+table.doxtable th {
+ background-color: white;
+ color: black;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ font-weight: normal;
+ text-transform: uppercase;
+ text-align: left;
+}
+
+p code {
+ background-color: #E8E8E8;
+}
diff --git a/dev/MinGfx/docs/html/default__shader_8h.html b/dev/MinGfx/docs/html/default__shader_8h.html
new file mode 100644
index 0000000..ada0c55
--- /dev/null
+++ b/dev/MinGfx/docs/html/default__shader_8h.html
@@ -0,0 +1,122 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/default_shader.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">default_shader.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="color_8h_source.html">color.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="shader__program_8h_source.html">shader_program.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="texture2d_8h_source.html">texture2d.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector3_8h_source.html">vector3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="matrix4_8h_source.html">matrix4.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mesh_8h_source.html">mesh.h</a>&quot;</code><br />
+</div>
+<p><a href="default__shader_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A simple GLSL shader for textured per-fragment Phong shading with multiple light sources. <a href="classmingfx_1_1_default_shader.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html">mingfx::DefaultShader::MaterialProperties</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Small data structure to hold properties of the material to be lit. <a href="classmingfx_1_1_default_shader_1_1_material_properties.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html">mingfx::DefaultShader::LightProperties</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Small data structure to hold per-light properties. <a href="classmingfx_1_1_default_shader_1_1_light_properties.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/default__shader_8h_source.html b/dev/MinGfx/docs/html/default__shader_8h_source.html
new file mode 100644
index 0000000..374116c
--- /dev/null
+++ b/dev/MinGfx/docs/html/default__shader_8h_source.html
@@ -0,0 +1,240 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/default_shader.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">default_shader.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="default__shader_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_DEFAULT_SHADER_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_DEFAULT_SHADER_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="color_8h.html">color.h</a>&quot;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="shader__program_8h.html">shader_program.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="texture2d_8h.html">texture2d.h</a>&quot;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector3_8h.html">vector3.h</a>&quot;</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="matrix4_8h.html">matrix4.h</a>&quot;</span></div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="mesh_8h.html">mesh.h</a>&quot;</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; </div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; </div>
+<div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html"> 62</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_default_shader.html">DefaultShader</a> {</div>
+<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; </div>
+<div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24"> 66</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24">MAX_LIGHTS</a> = 10;</div>
+<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; </div>
+<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; </div>
+<div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_material_properties.html"> 70</a></span>&#160; <span class="keyword">class </span><a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html">MaterialProperties</a> {</div>
+<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad4db9a1b0636db84f57f022c51ce7657"> 72</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html">Color</a> <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad4db9a1b0636db84f57f022c51ce7657">ambient_reflectance</a>;</div>
+<div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa7b75f95a45d7a1030c297192b14014f"> 73</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html">Color</a> <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa7b75f95a45d7a1030c297192b14014f">diffuse_reflectance</a>;</div>
+<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_material_properties.html#acfd78796e08f527a24cce3c1e206148c"> 74</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html">Color</a> <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html#acfd78796e08f527a24cce3c1e206148c">specular_reflectance</a>;</div>
+<div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad77e4c78a2bf60776c673b91bc4c8a13"> 75</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad77e4c78a2bf60776c673b91bc4c8a13">shinniness</a>;</div>
+<div class="line"><a name="l00076"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ae26eed46a279c73e947880858763514e"> 76</a></span>&#160; <a class="code" href="classmingfx_1_1_texture2_d.html">Texture2D</a> <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ae26eed46a279c73e947880858763514e">surface_texture</a>;</div>
+<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="comment">// eventually, this might include a normal map, etc.</span></div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
+<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="comment">// defaults</span></div>
+<div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa24361a9c6eb0a87355d0ad00e47dd96"> 80</a></span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa24361a9c6eb0a87355d0ad00e47dd96">MaterialProperties</a>() :</div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad4db9a1b0636db84f57f022c51ce7657">ambient_reflectance</a>(0.25f, 0.25f, 0.25f),</div>
+<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa7b75f95a45d7a1030c297192b14014f">diffuse_reflectance</a>(0.6f, 0.6f, 0.6f),</div>
+<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html#acfd78796e08f527a24cce3c1e206148c">specular_reflectance</a>(0.4f, 0.4f, 0.4f),</div>
+<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad77e4c78a2bf60776c673b91bc4c8a13">shinniness</a>(20.0f) {}</div>
+<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; };</div>
+<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; </div>
+<div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_light_properties.html"> 88</a></span>&#160; <span class="keyword">class </span><a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a> {</div>
+<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a160b58a0e70294008b9dac8eb6291d3e"> 90</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a160b58a0e70294008b9dac8eb6291d3e">position</a>;</div>
+<div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a226c173b193459af291687dd45280fbb"> 91</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html">Color</a> <a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a226c173b193459af291687dd45280fbb">ambient_intensity</a>;</div>
+<div class="line"><a name="l00092"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a9a010057c15e3db5661b07a03d5176d7"> 92</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html">Color</a> <a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a9a010057c15e3db5661b07a03d5176d7">diffuse_intensity</a>;</div>
+<div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_light_properties.html#abef7666629dbb9da661b163e0584c9a4"> 93</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html">Color</a> <a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html#abef7666629dbb9da661b163e0584c9a4">specular_intensity</a>;</div>
+<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
+<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="comment">// defaults</span></div>
+<div class="line"><a name="l00096"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a582ceee332260b06cbf2ec607257aba3"> 96</a></span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a582ceee332260b06cbf2ec607257aba3">LightProperties</a>() :</div>
+<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a160b58a0e70294008b9dac8eb6291d3e">position</a>(10.0f, 10.0f, 10.0f),</div>
+<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a226c173b193459af291687dd45280fbb">ambient_intensity</a>(0.25f, 0.25f, 0.25f),</div>
+<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a9a010057c15e3db5661b07a03d5176d7">diffuse_intensity</a>(0.6f, 0.6f, 0.6f),</div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html#abef7666629dbb9da661b163e0584c9a4">specular_intensity</a>(0.6f, 0.6f, 0.6f) {}</div>
+<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; };</div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
+<div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428"> 106</a></span>&#160; <a class="code" href="classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428">DefaultShader</a>(<span class="keywordtype">bool</span> add_default_light=<span class="keyword">true</span>);</div>
+<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; </div>
+<div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html#a0fe7d605d039ecdbf17837bc5bbe0aba"> 108</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_default_shader.html#a0fe7d605d039ecdbf17837bc5bbe0aba">~DefaultShader</a>();</div>
+<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; </div>
+<div class="line"><a name="l00112"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html#af54a8e489d9fb34cfceb1c07562c6e2c"> 112</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_default_shader.html#af54a8e489d9fb34cfceb1c07562c6e2c">AddLight</a>(<a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a> <a class="code" href="classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316">light</a>);</div>
+<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; </div>
+<div class="line"><a name="l00115"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html#a41e74fb8af72a6b22c72b0916726b6d6"> 115</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_default_shader.html#a41e74fb8af72a6b22c72b0916726b6d6">SetLight</a>(<span class="keywordtype">int</span> i, <a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a> <a class="code" href="classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316">light</a>);</div>
+<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; </div>
+<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; </div>
+<div class="line"><a name="l00124"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3"> 124</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3">Init</a>();</div>
+<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; </div>
+<div class="line"><a name="l00130"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b"> 130</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b">Draw</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;model, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;view, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projection,</div>
+<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> *mesh, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html">MaterialProperties</a> &amp;material);</div>
+<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; </div>
+<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; </div>
+<div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0"> 138</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0">UseProgram</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;model, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;view, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projection,</div>
+<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html">MaterialProperties</a> &amp;material);</div>
+<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; </div>
+<div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67"> 143</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67">StopProgram</a>();</div>
+<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; </div>
+<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; </div>
+<div class="line"><a name="l00146"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html#ac5b779672a983df8aa67c9cbe026e0c2"> 146</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_default_shader.html#ac5b779672a983df8aa67c9cbe026e0c2">num_lights</a>();</div>
+<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; </div>
+<div class="line"><a name="l00148"></a><span class="lineno"><a class="line" href="classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316"> 148</a></span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_light_properties.html">LightProperties</a> <a class="code" href="classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316">light</a>(<span class="keywordtype">int</span> i);</div>
+<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; </div>
+<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; </div>
+<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; </div>
+<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; std::vector&lt;LightProperties&gt; lights_;</div>
+<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; </div>
+<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="comment">// cached raw float arrays store data to send directly to the gpu</span></div>
+<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="comment">// GLSL requires fixed size arrays for these</span></div>
+<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordtype">float</span> lightPositions_[3*<a class="code" href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24">MAX_LIGHTS</a>];</div>
+<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keywordtype">float</span> lightIas_[4*<a class="code" href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24">MAX_LIGHTS</a>];</div>
+<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keywordtype">float</span> lightIds_[4*<a class="code" href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24">MAX_LIGHTS</a>];</div>
+<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordtype">float</span> lightIss_[4*<a class="code" href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24">MAX_LIGHTS</a>];</div>
+<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keywordtype">void</span> update_light_arrays();</div>
+<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; </div>
+<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <a class="code" href="classmingfx_1_1_shader_program.html">ShaderProgram</a> phongShader_;</div>
+<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;};</div>
+<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; </div>
+<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; </div>
+<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html"><div class="ttname"><a href="classmingfx_1_1_color.html">mingfx::Color</a></div><div class="ttdoc">Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with Op...</div><div class="ttdef"><b>Definition:</b> <a href="color_8h_source.html#l00041">color.h:41</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_light_properties_html"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_light_properties.html">mingfx::DefaultShader::LightProperties</a></div><div class="ttdoc">Small data structure to hold per-light properties.</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00088">default_shader.h:88</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_light_properties_html_a160b58a0e70294008b9dac8eb6291d3e"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_light_properties.html#a160b58a0e70294008b9dac8eb6291d3e">mingfx::DefaultShader::LightProperties::position</a></div><div class="ttdeci">Point3 position</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00090">default_shader.h:90</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_light_properties_html_a226c173b193459af291687dd45280fbb"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_light_properties.html#a226c173b193459af291687dd45280fbb">mingfx::DefaultShader::LightProperties::ambient_intensity</a></div><div class="ttdeci">Color ambient_intensity</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00091">default_shader.h:91</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_light_properties_html_a582ceee332260b06cbf2ec607257aba3"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_light_properties.html#a582ceee332260b06cbf2ec607257aba3">mingfx::DefaultShader::LightProperties::LightProperties</a></div><div class="ttdeci">LightProperties()</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00096">default_shader.h:96</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_light_properties_html_a9a010057c15e3db5661b07a03d5176d7"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_light_properties.html#a9a010057c15e3db5661b07a03d5176d7">mingfx::DefaultShader::LightProperties::diffuse_intensity</a></div><div class="ttdeci">Color diffuse_intensity</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00092">default_shader.h:92</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_light_properties_html_abef7666629dbb9da661b163e0584c9a4"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_light_properties.html#abef7666629dbb9da661b163e0584c9a4">mingfx::DefaultShader::LightProperties::specular_intensity</a></div><div class="ttdeci">Color specular_intensity</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00093">default_shader.h:93</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_material_properties_html"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_material_properties.html">mingfx::DefaultShader::MaterialProperties</a></div><div class="ttdoc">Small data structure to hold properties of the material to be lit.</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00070">default_shader.h:70</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_material_properties_html_aa24361a9c6eb0a87355d0ad00e47dd96"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa24361a9c6eb0a87355d0ad00e47dd96">mingfx::DefaultShader::MaterialProperties::MaterialProperties</a></div><div class="ttdeci">MaterialProperties()</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00080">default_shader.h:80</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_material_properties_html_aa7b75f95a45d7a1030c297192b14014f"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa7b75f95a45d7a1030c297192b14014f">mingfx::DefaultShader::MaterialProperties::diffuse_reflectance</a></div><div class="ttdeci">Color diffuse_reflectance</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00073">default_shader.h:73</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_material_properties_html_acfd78796e08f527a24cce3c1e206148c"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_material_properties.html#acfd78796e08f527a24cce3c1e206148c">mingfx::DefaultShader::MaterialProperties::specular_reflectance</a></div><div class="ttdeci">Color specular_reflectance</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00074">default_shader.h:74</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_material_properties_html_ad4db9a1b0636db84f57f022c51ce7657"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad4db9a1b0636db84f57f022c51ce7657">mingfx::DefaultShader::MaterialProperties::ambient_reflectance</a></div><div class="ttdeci">Color ambient_reflectance</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00072">default_shader.h:72</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_material_properties_html_ad77e4c78a2bf60776c673b91bc4c8a13"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad77e4c78a2bf60776c673b91bc4c8a13">mingfx::DefaultShader::MaterialProperties::shinniness</a></div><div class="ttdeci">float shinniness</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00075">default_shader.h:75</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_material_properties_html_ae26eed46a279c73e947880858763514e"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_material_properties.html#ae26eed46a279c73e947880858763514e">mingfx::DefaultShader::MaterialProperties::surface_texture</a></div><div class="ttdeci">Texture2D surface_texture</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00076">default_shader.h:76</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html"><div class="ttname"><a href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></div><div class="ttdoc">A simple GLSL shader for textured per-fragment Phong shading with multiple light sources.</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00062">default_shader.h:62</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_a053599d8c7acd9920461aab8ce945ab0"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0">mingfx::DefaultShader::UseProgram</a></div><div class="ttdeci">void UseProgram(const Matrix4 &amp;model, const Matrix4 &amp;view, const Matrix4 &amp;projection, const MaterialProperties &amp;material)</div><div class="ttdoc">Only needed if you do not want to draw a Mesh. This does all of the same setup for drawing that the D...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_a0fe7d605d039ecdbf17837bc5bbe0aba"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#a0fe7d605d039ecdbf17837bc5bbe0aba">mingfx::DefaultShader::~DefaultShader</a></div><div class="ttdeci">virtual ~DefaultShader()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_a21c1fd93273eaf643e7ac9b05ba0fb24"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24">mingfx::DefaultShader::MAX_LIGHTS</a></div><div class="ttdeci">static const unsigned int MAX_LIGHTS</div><div class="ttdoc">If changed, this needs to also be changed in the glsl shader code.</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00066">default_shader.h:66</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_a2c188bc0fc5f7fc7405f04b036bd4d67"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67">mingfx::DefaultShader::StopProgram</a></div><div class="ttdeci">void StopProgram()</div><div class="ttdoc">Only needed if you do not want to draw a Mesh. Call this after UseProgram() and after drawing your ge...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_a41e74fb8af72a6b22c72b0916726b6d6"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#a41e74fb8af72a6b22c72b0916726b6d6">mingfx::DefaultShader::SetLight</a></div><div class="ttdeci">void SetLight(int i, LightProperties light)</div><div class="ttdoc">Changes the properties for a light that was already added.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_a5cb9f0a1709452268858ec338448a4c3"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3">mingfx::DefaultShader::Init</a></div><div class="ttdeci">void Init()</div><div class="ttdoc">This loads vertex and fragment shaders from files, compiles them, and links them. So,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_a652b3d00bb6ae2a806b1ca3e3d42242b"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b">mingfx::DefaultShader::Draw</a></div><div class="ttdeci">void Draw(const Matrix4 &amp;model, const Matrix4 &amp;view, const Matrix4 &amp;projection, Mesh *mesh, const MaterialProperties &amp;material)</div><div class="ttdoc">This starts the shader and sets its uniform variables based upon the current set of lights,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_aa2ed33efad35aefbb400be45250cd316"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316">mingfx::DefaultShader::light</a></div><div class="ttdeci">LightProperties light(int i)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_ac030575fd76a6076262bdd09bbb93428"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428">mingfx::DefaultShader::DefaultShader</a></div><div class="ttdeci">DefaultShader(bool add_default_light=true)</div><div class="ttdoc">The constructor defaults to adding a single white light to the scene at (10,10,10)....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_ac5b779672a983df8aa67c9cbe026e0c2"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#ac5b779672a983df8aa67c9cbe026e0c2">mingfx::DefaultShader::num_lights</a></div><div class="ttdeci">int num_lights()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html_af54a8e489d9fb34cfceb1c07562c6e2c"><div class="ttname"><a href="classmingfx_1_1_default_shader.html#af54a8e489d9fb34cfceb1c07562c6e2c">mingfx::DefaultShader::AddLight</a></div><div class="ttdeci">void AddLight(LightProperties light)</div><div class="ttdoc">Multiple lights are supported, this adds one to the end of the list. Up to MAX_LIGHTS can be added.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html"><div class="ttname"><a href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></div><div class="ttdoc">A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...</div><div class="ttdef"><b>Definition:</b> <a href="matrix4_8h_source.html#l00050">matrix4.h:50</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html"><div class="ttname"><a href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></div><div class="ttdoc">A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.</div><div class="ttdef"><b>Definition:</b> <a href="mesh_8h_source.html#l00127">mesh.h:127</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html"><div class="ttname"><a href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></div><div class="ttdoc">A wrapper around GLSL shader programs.</div><div class="ttdef"><b>Definition:</b> <a href="shader__program_8h_source.html#l00066">shader_program.h:66</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></div><div class="ttdoc">A wrapper around a 2D texture that supports loading images from files or setting texture color data d...</div><div class="ttdef"><b>Definition:</b> <a href="texture2d_8h_source.html#l00042">texture2d.h:42</a></div></div>
+<div class="ttc" id="acolor_8h_html"><div class="ttname"><a href="color_8h.html">color.h</a></div></div>
+<div class="ttc" id="amatrix4_8h_html"><div class="ttname"><a href="matrix4_8h.html">matrix4.h</a></div></div>
+<div class="ttc" id="amesh_8h_html"><div class="ttname"><a href="mesh_8h.html">mesh.h</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+<div class="ttc" id="ashader__program_8h_html"><div class="ttname"><a href="shader__program_8h.html">shader_program.h</a></div></div>
+<div class="ttc" id="atexture2d_8h_html"><div class="ttname"><a href="texture2d_8h.html">texture2d.h</a></div></div>
+<div class="ttc" id="avector3_8h_html"><div class="ttname"><a href="vector3_8h.html">vector3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/dev/MinGfx/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
new file mode 100644
index 0000000..af0d73f
--- /dev/null
+++ b/dev/MinGfx/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
@@ -0,0 +1,146 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">src Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:aabb_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="aabb_8h.html">aabb.h</a> <a href="aabb_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:bvh_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bvh_8h.html">bvh.h</a> <a href="bvh_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:color_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="color_8h.html">color.h</a> <a href="color_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:craft__cam_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="craft__cam_8h.html">craft_cam.h</a> <a href="craft__cam_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:default__shader_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="default__shader_8h.html">default_shader.h</a> <a href="default__shader_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gfxmath_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="gfxmath_8h.html">gfxmath.h</a> <a href="gfxmath_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:graphics__app_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="graphics__app_8h.html">graphics_app.h</a> <a href="graphics__app_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:matrix4_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="matrix4_8h.html">matrix4.h</a> <a href="matrix4_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mesh_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mesh_8h.html">mesh.h</a> <a href="mesh_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mingfx_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mingfx_8h.html">mingfx.h</a> <a href="mingfx_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:mingfx_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Includes the entire MinGfx library and calls using namespace mingfx. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mingfx__config_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mingfx__config_8h.html">mingfx_config.h</a> <a href="mingfx__config_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:opengl__headers_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="opengl__headers_8h.html">opengl_headers.h</a> <a href="opengl__headers_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:platform_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="platform_8h.html">platform.h</a> <a href="platform_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:point2_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="point2_8h.html">point2.h</a> <a href="point2_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:point3_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="point3_8h.html">point3.h</a> <a href="point3_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:quaternion_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="quaternion_8h.html">quaternion.h</a> <a href="quaternion_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:quick__shapes_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="quick__shapes_8h.html">quick_shapes.h</a> <a href="quick__shapes_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ray_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ray_8h.html">ray.h</a> <a href="ray_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:shader__program_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="shader__program_8h.html">shader_program.h</a> <a href="shader__program_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:stb__rect__pack_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stb__rect__pack_8h.html">stb_rect_pack.h</a> <a href="stb__rect__pack_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:text__shader_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text__shader_8h.html">text_shader.h</a> <a href="text__shader_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:texture2d_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="texture2d_8h.html">texture2d.h</a> <a href="texture2d_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:unicam_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unicam_8h.html">unicam.h</a> <a href="unicam_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:vector2_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vector2_8h.html">vector2.h</a> <a href="vector2_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:vector3_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vector3_8h.html">vector3.h</a> <a href="vector3_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/dir_e68e8157741866f444e17edd764ebbae.html b/dev/MinGfx/docs/html/dir_e68e8157741866f444e17edd764ebbae.html
new file mode 100644
index 0000000..d4e5a57
--- /dev/null
+++ b/dev/MinGfx/docs/html/dir_e68e8157741866f444e17edd764ebbae.html
@@ -0,0 +1,91 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: doc Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_e68e8157741866f444e17edd764ebbae.html">doc</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/doc.png b/dev/MinGfx/docs/html/doc.png
new file mode 100644
index 0000000..7728f70
--- /dev/null
+++ b/dev/MinGfx/docs/html/doc.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/doxygen.css b/dev/MinGfx/docs/html/doxygen.css
new file mode 100644
index 0000000..a64c4bf
--- /dev/null
+++ b/dev/MinGfx/docs/html/doxygen.css
@@ -0,0 +1,1793 @@
+/* The standard CSS for doxygen 1.9.1 */
+
+body, table, div, p, dl {
+ font: 400 14px/22px Roboto,sans-serif;
+}
+
+p.reference, p.definition {
+ font: 400 14px/22px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+ font-size: 150%;
+}
+
+.title {
+ font: 400 14px/28px Roboto,sans-serif;
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2.groupheader {
+ border-bottom: 1px solid #999999;
+ color: #444444;
+ font-size: 150%;
+ font-weight: normal;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: 0 0 15px cyan;
+}
+
+dt {
+ font-weight: bold;
+}
+
+ul.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+ column-count: 3;
+}
+
+p.startli, p.startdd {
+ margin-top: 2px;
+}
+
+th p.starttd, th p.intertd, th p.endtd {
+ font-size: 100%;
+ font-weight: 700;
+}
+
+p.starttd {
+ margin-top: 0px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+p.interli {
+}
+
+p.interdd {
+}
+
+p.intertd {
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.navtab {
+ border-right: 1px solid #B0B0B0;
+ padding-right: 15px;
+ text-align: right;
+ line-height: 110%;
+}
+
+div.navtab table {
+ border-spacing: 0;
+}
+
+td.navtab {
+ padding-right: 6px;
+ padding-left: 6px;
+}
+td.navtabHL {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ padding-right: 6px;
+ padding-left: 6px;
+}
+
+td.navtabHL a, td.navtabHL a:visited {
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+a.navtab {
+ font-weight: bold;
+}
+
+div.qindex{
+ text-align: center;
+ width: 100%;
+ line-height: 140%;
+ font-size: 130%;
+ color: #A0A0A0;
+}
+
+dt.alphachar{
+ font-size: 180%;
+ font-weight: bold;
+}
+
+.alphachar a{
+ color: black;
+}
+
+.alphachar a:hover, .alphachar a:visited{
+ text-decoration: none;
+}
+
+.classindex dl {
+ padding: 25px;
+ column-count:1
+}
+
+.classindex dd {
+ display:inline-block;
+ margin-left: 50px;
+ width: 90%;
+ line-height: 1.15em;
+}
+
+.classindex dl.odd {
+ background-color: #F9F9F9;
+}
+
+@media(min-width: 1120px) {
+ .classindex dl {
+ column-count:2
+ }
+}
+
+@media(min-width: 1320px) {
+ .classindex dl {
+ column-count:3
+ }
+}
+
+
+/* @group Link Styling */
+
+a {
+ color: #505050;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #606060;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+.contents a.qindexHL:visited {
+ color: #FFFFFF;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+ color: #606060;
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+ color: #606060;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+ul {
+ overflow: hidden; /*Fixed: list item bullets overlap floating elements*/
+}
+
+#side-nav ul {
+ overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */
+}
+
+#main-nav ul {
+ overflow: visible; /* reset ul rule for the navigation bar drop down lists */
+}
+
+.fragment {
+ text-align: left;
+ direction: ltr;
+ overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/
+ overflow-y: hidden;
+}
+
+pre.fragment {
+ border: 1px solid #CCCCCC;
+ background-color: #FCFCFC;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+div.fragment {
+ padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/
+ margin: 4px 8px 4px 2px;
+ background-color: #FCFCFC;
+ border: 1px solid #CCCCCC;
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.0;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+div.line:after {
+ content:"\000A";
+ white-space: pre;
+}
+
+div.line.glow {
+ background-color: cyan;
+ box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+ padding-right: 4px;
+ text-align: right;
+ border-right: 2px solid #0F0;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+span.lineno a {
+ background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+ background-color: #C8C8C8;
+}
+
+.lineno {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+div.ah, span.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #FFFFFF;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
+}
+
+div.classindex ul {
+ list-style: none;
+ padding-left: 0;
+}
+
+div.classindex span.ai {
+ display: inline-block;
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 12px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EEEEEE;
+ font-weight: bold;
+ border: 1px solid #CCCCCC;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EEEEEE;
+ border: 1px solid #CCCCCC;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #F0F0F0;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl, img.inline {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+blockquote {
+ background-color: #F8F8F8;
+ border-left: 2px solid #AAAAAA;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
+
+blockquote.DocNodeRTL {
+ border-left: 0;
+ border-right: 2px solid #AAAAAA;
+ margin: 0 4px 0 24px;
+ padding: 0 16px 0 12px;
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #B0B0B0;
+}
+
+th.dirtab {
+ background: #EEEEEE;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #666666;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: cyan;
+ box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #FAFAFA;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memSeparator {
+ border-bottom: 1px solid #E2E2E2;
+ line-height: 1px;
+ margin: 0px;
+ padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight, .memTemplItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #606060;
+ white-space: nowrap;
+ font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtitle {
+ padding: 8px;
+ border-top: 1px solid #B4B4B4;
+ border-left: 1px solid #B4B4B4;
+ border-right: 1px solid #B4B4B4;
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ margin-bottom: -1px;
+ background-image: url('nav_f.png');
+ background-repeat: repeat-x;
+ background-color: #E6E6E6;
+ line-height: 1.25;
+ font-weight: 300;
+ float:left;
+}
+
+.permalink
+{
+ font-size: 65%;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.memtemplate {
+ font-size: 80%;
+ color: #606060;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EEEEEE;
+ border: 1px solid #B0B0B0;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: box-shadow 0.5s linear;
+ -moz-transition: box-shadow 0.5s linear;
+ -ms-transition: box-shadow 0.5s linear;
+ -o-transition: box-shadow 0.5s linear;
+ transition: box-shadow 0.5s linear;
+ display: table !important;
+ width: 100%;
+}
+
+.memitem.glow {
+ box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+ font-weight: 400;
+ margin-left: 6px;
+}
+
+.memname td {
+ vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #B4B4B4;
+ border-left: 1px solid #B4B4B4;
+ border-right: 1px solid #B4B4B4;
+ padding: 6px 0px 6px 0px;
+ color: #2B2B2B;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ background-color: #E3E3E3;
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 4px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 4px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 4px;
+
+}
+
+.overload {
+ font-family: "courier new",courier,monospace;
+ font-size: 65%;
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #B4B4B4;
+ border-left: 1px solid #B4B4B4;
+ border-right: 1px solid #B4B4B4;
+ padding: 6px 10px 2px 10px;
+ background-color: #FCFCFC;
+ border-top-width: 0;
+ background-image:url('nav_g.png');
+ background-repeat:repeat-x;
+ background-color: #FFFFFF;
+ /* opera specific markup */
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+.paramname code {
+ line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype, .tparams .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir, .tparams .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+table.mlabels {
+ border-spacing: 0px;
+}
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px;
+}
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap;
+}
+
+span.mlabels {
+ margin-left: 8px;
+}
+
+span.mlabel {
+ background-color: #888888;
+ border-top:1px solid #707070;
+ border-left:1px solid #707070;
+ border-right:1px solid #CCCCCC;
+ border-bottom:1px solid #CCCCCC;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 2px 3px;
+ border-radius: 3px;
+ font-size: 7pt;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view inside a (index) page */
+
+div.directory {
+ margin: 10px 0px;
+ border-top: 1px solid #AAAAAA;
+ border-bottom: 1px solid #AAAAAA;
+ width: 100%;
+}
+
+.directory table {
+ border-collapse:collapse;
+}
+
+.directory td {
+ margin: 0px;
+ padding: 0px;
+ vertical-align: top;
+}
+
+.directory td.entry {
+ white-space: nowrap;
+ padding-right: 6px;
+ padding-top: 3px;
+}
+
+.directory td.entry a {
+ outline:none;
+}
+
+.directory td.entry a img {
+ border: none;
+}
+
+.directory td.desc {
+ width: 100%;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 3px;
+ border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+ padding-left: 6px;
+ background-color: #F8F8F8;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt;
+}
+
+.directory .levels span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #505050;
+}
+
+.arrow {
+ color: #AAAAAA;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ font-size: 80%;
+ display: inline-block;
+ width: 16px;
+ height: 22px;
+}
+
+.icon {
+ font-family: Arial, Helvetica;
+ font-weight: bold;
+ font-size: 12px;
+ height: 14px;
+ width: 16px;
+ display: inline-block;
+ background-color: #888888;
+ color: white;
+ text-align: center;
+ border-radius: 4px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+.icona {
+ width: 24px;
+ height: 22px;
+ display: inline-block;
+}
+
+.iconfopen {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderopen.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.iconfclosed {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderclosed.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.icondoc {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('doc.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+table.directory {
+ font: 400 14px Roboto,sans-serif;
+}
+
+/* @end */
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+address {
+ font-style: normal;
+ color: #333333;
+}
+
+table.doxtable caption {
+ caption-side: top;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #373737;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #474747;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+table.fieldtable {
+ /*width: 100%;*/
+ margin-bottom: 10px;
+ border: 1px solid #B4B4B4;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #B4B4B4;
+ border-bottom: 1px solid #B4B4B4;
+ vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+ padding-top: 3px;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #B4B4B4;
+ /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+ margin-top: 0px;
+}
+
+.fieldtable td.fielddoc p:last-child {
+ margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E6E6E6;
+ font-size: 90%;
+ color: #2B2B2B;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ font-weight: 400;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #B4B4B4;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ background-position: 0 -5px;
+ height:30px;
+ line-height:30px;
+ color:#9B9B9B;
+ border:solid 1px #CACACA;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#454545;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: #303030;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#808080;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#454545;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+table.classindex
+{
+ margin: 10px;
+ white-space: nowrap;
+ margin-left: 3%;
+ margin-right: 3%;
+ width: 94%;
+ border: 0;
+ border-spacing: 0;
+ padding: 0;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #FAFAFA;
+ margin: 0px;
+ border-bottom: 1px solid #CCCCCC;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+.PageDocRTL-title div.headertitle {
+ text-align: right;
+ direction: rtl;
+}
+
+dl {
+ padding: 0 0 0 0;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */
+dl.section {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+dl.section.DocNodeRTL {
+ margin-right: 0px;
+ padding-right: 0px;
+}
+
+dl.note {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #D0C000;
+}
+
+dl.note.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #FF0000;
+}
+
+dl.warning.DocNodeRTL, dl.attention.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #00D000;
+}
+
+dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #00D000;
+}
+
+dl.deprecated {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #505050;
+}
+
+dl.deprecated.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #505050;
+}
+
+dl.todo {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #00C0E0;
+}
+
+dl.todo.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #00C0E0;
+}
+
+dl.test {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #3030E0;
+}
+
+dl.test.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #3030E0;
+}
+
+dl.bug {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #C08050;
+}
+
+dl.bug.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #C08050;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectalign
+{
+ vertical-align: middle;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #707070;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.plantumlgraph
+{
+ text-align: center;
+}
+
+.diagraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #A0A0A0;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#404040;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+ text-align:right;
+ width:52px;
+}
+
+dl.citelist dd {
+ margin:2px 0 2px 72px;
+ padding:5px 0;
+}
+
+div.toc {
+ padding: 14px 25px;
+ background-color: #F6F6F6;
+ border: 1px solid #DDDDDD;
+ border-radius: 7px 7px 7px 7px;
+ float: right;
+ height: auto;
+ margin: 0 8px 10px 10px;
+ width: 200px;
+}
+
+.PageDocRTL-title div.toc {
+ float: left !important;
+ text-align: right;
+}
+
+div.toc li {
+ background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+ font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ margin-top: 5px;
+ padding-left: 10px;
+ padding-top: 2px;
+}
+
+.PageDocRTL-title div.toc li {
+ background-position-x: right !important;
+ padding-left: 0 !important;
+ padding-right: 10px;
+}
+
+div.toc h3 {
+ font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+ color: #606060;
+ border-bottom: 0 none;
+ margin: 0;
+}
+
+div.toc ul {
+ list-style: none outside none;
+ border: medium none;
+ padding: 0px;
+}
+
+div.toc li.level1 {
+ margin-left: 0px;
+}
+
+div.toc li.level2 {
+ margin-left: 15px;
+}
+
+div.toc li.level3 {
+ margin-left: 30px;
+}
+
+div.toc li.level4 {
+ margin-left: 45px;
+}
+
+span.emoji {
+ /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html
+ * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort;
+ */
+}
+
+.PageDocRTL-title div.toc li.level1 {
+ margin-left: 0 !important;
+ margin-right: 0;
+}
+
+.PageDocRTL-title div.toc li.level2 {
+ margin-left: 0 !important;
+ margin-right: 15px;
+}
+
+.PageDocRTL-title div.toc li.level3 {
+ margin-left: 0 !important;
+ margin-right: 30px;
+}
+
+.PageDocRTL-title div.toc li.level4 {
+ margin-left: 0 !important;
+ margin-right: 45px;
+}
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+ display: none;
+}
+
+tr.heading h2 {
+ margin-top: 12px;
+ margin-bottom: 4px;
+}
+
+/* tooltip related style info */
+
+.ttc {
+ position: absolute;
+ display: none;
+}
+
+#powerTip {
+ cursor: default;
+ white-space: nowrap;
+ background-color: white;
+ border: 1px solid gray;
+ border-radius: 4px 4px 4px 4px;
+ box-shadow: 1px 1px 7px gray;
+ display: none;
+ font-size: smaller;
+ max-width: 80%;
+ opacity: 0.9;
+ padding: 1ex 1em 1em;
+ position: absolute;
+ z-index: 2147483647;
+}
+
+#powerTip div.ttdoc {
+ color: grey;
+ font-style: italic;
+}
+
+#powerTip div.ttname a {
+ font-weight: bold;
+}
+
+#powerTip div.ttname {
+ font-weight: bold;
+}
+
+#powerTip div.ttdeci {
+ color: #006318;
+}
+
+#powerTip div {
+ margin: 0px;
+ padding: 0px;
+ font: 12px/16px Roboto,sans-serif;
+}
+
+#powerTip:before, #powerTip:after {
+ content: "";
+ position: absolute;
+ margin: 0px;
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.w:after, #powerTip.w:before,
+#powerTip.e:after, #powerTip.e:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.nw:after, #powerTip.nw:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+}
+
+#powerTip.n:after, #powerTip.s:after,
+#powerTip.w:after, #powerTip.e:after,
+#powerTip.nw:after, #powerTip.ne:after,
+#powerTip.sw:after, #powerTip.se:after {
+ border-color: rgba(255, 255, 255, 0);
+}
+
+#powerTip.n:before, #powerTip.s:before,
+#powerTip.w:before, #powerTip.e:before,
+#powerTip.nw:before, #powerTip.ne:before,
+#powerTip.sw:before, #powerTip.se:before {
+ border-color: rgba(128, 128, 128, 0);
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.nw:after, #powerTip.nw:before {
+ top: 100%;
+}
+
+#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
+ border-top-color: #FFFFFF;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+#powerTip.n:before {
+ border-top-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+#powerTip.n:after, #powerTip.n:before {
+ left: 50%;
+}
+
+#powerTip.nw:after, #powerTip.nw:before {
+ right: 14px;
+}
+
+#powerTip.ne:after, #powerTip.ne:before {
+ left: 14px;
+}
+
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ bottom: 100%;
+}
+
+#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
+ border-bottom-color: #FFFFFF;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+
+#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
+ border-bottom-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+
+#powerTip.s:after, #powerTip.s:before {
+ left: 50%;
+}
+
+#powerTip.sw:after, #powerTip.sw:before {
+ right: 14px;
+}
+
+#powerTip.se:after, #powerTip.se:before {
+ left: 14px;
+}
+
+#powerTip.e:after, #powerTip.e:before {
+ left: 100%;
+}
+#powerTip.e:after {
+ border-left-color: #FFFFFF;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.e:before {
+ border-left-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+#powerTip.w:after, #powerTip.w:before {
+ right: 100%;
+}
+#powerTip.w:after {
+ border-right-color: #FFFFFF;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.w:before {
+ border-right-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+}
+
+/* @group Markdown */
+
+table.markdownTable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+ border: 1px solid #373737;
+ padding: 3px 7px 2px;
+}
+
+table.markdownTable tr {
+}
+
+th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
+ background-color: #474747;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+th.markdownTableHeadLeft, td.markdownTableBodyLeft {
+ text-align: left
+}
+
+th.markdownTableHeadRight, td.markdownTableBodyRight {
+ text-align: right
+}
+
+th.markdownTableHeadCenter, td.markdownTableBodyCenter {
+ text-align: center
+}
+
+.DocNodeRTL {
+ text-align: right;
+ direction: rtl;
+}
+
+.DocNodeLTR {
+ text-align: left;
+ direction: ltr;
+}
+
+table.DocNodeRTL {
+ width: auto;
+ margin-right: 0;
+ margin-left: auto;
+}
+
+table.DocNodeLTR {
+ width: auto;
+ margin-right: auto;
+ margin-left: 0;
+}
+
+tt, code, kbd, samp
+{
+ display: inline-block;
+ direction:ltr;
+}
+/* @end */
+
+u {
+ text-decoration: underline;
+}
+
diff --git a/dev/MinGfx/docs/html/doxygen.svg b/dev/MinGfx/docs/html/doxygen.svg
new file mode 100644
index 0000000..ec0905b
--- /dev/null
+++ b/dev/MinGfx/docs/html/doxygen.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" viewBox="0 0 104 31" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <linearGradient id="a">
+ <stop stop-color="#707070" offset="0"/>
+ <stop stop-color="#909090" offset="1"/>
+ </linearGradient>
+ <linearGradient id="d" x1="31.474" x2="31.474" y1="24.821" y2="26.773" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="c" x1="31.474" x2="31.474" y1="24.821" y2="26.773" gradientTransform="matrix(.6816 0 0 1.0248 72.391 -.91809)" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="b" x1="56.295" x2="56.295" y1="24.622" y2="26.574" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="e" x1="49.067" x2="48.956" y1="19.719" y2="9.5227" gradientTransform="matrix(.97968 0 0 1.0207 -.25579 -.25579)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#C8C8C8" offset="0"/>
+ <stop stop-color="#F0F0F0" offset="1"/>
+ </linearGradient>
+ <filter id="f" x="-.010676" y="-.045304" width="1.0214" height="1.0906" color-interpolation-filters="sRGB">
+ <feGaussianBlur stdDeviation="0.45293203"/>
+ </filter>
+ </defs>
+ <g>
+ <path transform="translate(-2.5759 -27.848)" d="m13.609 32.203v6.8633h-0.05078c-0.40533-0.66867-0.96254-1.1715-1.6719-1.5059-0.69244-0.35193-1.4282-0.52734-2.2051-0.52734-0.96267 0-1.807 0.2027-2.5332 0.60742-0.72622 0.38713-1.3344 0.90556-1.8242 1.5566-0.47289 0.65108-0.83456 1.4092-1.0879 2.2715-0.23644 0.84464-0.35547 1.7236-0.35547 2.6387 0 0.95022 0.11902 1.8643 0.35547 2.7441 0.25333 0.87983 0.615 1.6633 1.0879 2.3496 0.48978 0.66867 1.1065 1.2066 1.8496 1.6113 0.74311 0.38713 1.6044 0.58008 2.584 0.58008 0.86133 0 1.6311-0.15787 2.3066-0.47461 0.69244-0.33434 1.2497-0.87227 1.6719-1.6113h0.05078v1.7422h3.4199v-18.846zm12.875 4.8301c-1.0302 0-1.9596 0.17541-2.7871 0.52734-0.82756 0.33434-1.5358 0.81965-2.127 1.4531-0.59111 0.61588-1.0483 1.3721-1.3691 2.2695-0.32089 0.87983-0.48047 1.866-0.48047 2.957s0.15958 2.0752 0.48047 2.9551c0.32089 0.87983 0.77803 1.6361 1.3691 2.2695 0.59111 0.61588 1.2994 1.0914 2.127 1.4258 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.0302 0 1.9596-0.16762 2.7871-0.50195 0.84444-0.33434 1.5612-0.8099 2.1523-1.4258 0.59111-0.63348 1.0483-1.3897 1.3691-2.2695 0.32089-0.87983 0.48047-1.8641 0.48047-2.9551s-0.15958-2.0772-0.48047-2.957c-0.32089-0.89743-0.77803-1.6536-1.3691-2.2695-0.59111-0.63348-1.3079-1.1188-2.1523-1.4531-0.82756-0.35193-1.7569-0.52734-2.7871-0.52734zm41.715 0c-0.912 0-1.7223 0.18516-2.4316 0.55469-0.69244 0.36953-1.2752 0.87043-1.748 1.5039-0.47289 0.61588-0.83651 1.337-1.0898 2.1641-0.23645 0.80944-0.35352 1.6553-0.35352 2.5352 0 0.93262 0.10007 1.8214 0.30273 2.666 0.21956 0.82704 0.55767 1.556 1.0137 2.1895 0.456 0.61588 1.0387 1.109 1.748 1.4785 0.70933 0.35193 1.5536 0.5293 2.5332 0.5293 0.79378 0 1.5446-0.16762 2.2539-0.50195 0.72622-0.35193 1.2834-0.88986 1.6719-1.6113h0.05078v1.7949c0.01689 0.96782-0.21071 1.7689-0.68359 2.4023-0.456 0.63348-1.1898 0.95117-2.2031 0.95117-0.64178 0-1.2075-0.14228-1.6973-0.42383-0.48978-0.26395-0.81939-0.74731-0.98828-1.4512h-3.5723c0.05067 0.77425 0.25276 1.435 0.60742 1.9805 0.37156 0.56309 0.8287 1.0192 1.3691 1.3711 0.55733 0.35193 1.1656 0.60726 1.8242 0.76562 0.67556 0.17597 1.3328 0.26562 1.9746 0.26562 1.5031 0 2.7025-0.21245 3.5977-0.63477 0.89511-0.42232 1.5798-0.94076 2.0527-1.5566 0.47289-0.59829 0.777-1.2493 0.91211-1.9531 0.152-0.70386 0.22656-1.3295 0.22656-1.875v-12.775h-3.4199v1.8223h-0.05078c-0.43911-0.79185-0.98782-1.3551-1.6465-1.6895-0.64178-0.33434-1.3926-0.50195-2.2539-0.50195zm16.523 0c-0.99644 0-1.9088 0.18516-2.7363 0.55469-0.81067 0.36953-1.5124 0.88018-2.1035 1.5312-0.59111 0.63348-1.0463 1.3897-1.3672 2.2695s-0.48047 1.831-0.48047 2.8516c0 1.0558 0.15108 2.0225 0.45508 2.9023 0.32089 0.87983 0.76758 1.6361 1.3418 2.2695 0.57422 0.63348 1.276 1.1266 2.1035 1.4785 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.4862 0 2.7517-0.35277 3.7988-1.0566 1.0471-0.70387 1.8254-1.8733 2.332-3.5098h-3.168c-0.11822 0.42232-0.43934 0.82772-0.96289 1.2148-0.52355 0.36953-1.1468 0.55274-1.873 0.55273-1.0133 0-1.7916-0.27286-2.332-0.81836-0.54044-0.5455-0.83605-1.4245-0.88672-2.6387h9.4492c0.06756-1.0558-0.01551-2.0673-0.25195-3.0352-0.23644-0.96782-0.62557-1.8293-1.166-2.5859-0.52356-0.75666-1.1998-1.355-2.0273-1.7949-0.82756-0.45751-1.7974-0.6875-2.9121-0.6875zm16.189 0c-0.76 0-1.5023 0.18516-2.2285 0.55469-0.72622 0.35193-1.3174 0.92299-1.7734 1.7148h-0.07617v-1.9004h-3.4199v13.646h3.5977v-7.1523c0-1.3901 0.21909-2.3841 0.6582-2.9824 0.43911-0.61588 1.1494-0.92383 2.1289-0.92383 0.86133 0 1.4611 0.28066 1.7988 0.84375 0.33777 0.5455 0.50586 1.3816 0.50586 2.5078v7.707h3.5976v-8.3926c0-0.84464-0.0765-1.6106-0.22851-2.2969-0.13511-0.70387-0.37971-1.2925-0.73438-1.7676-0.35466-0.49271-0.84386-0.87277-1.4688-1.1367-0.608-0.28155-1.3948-0.42188-2.3574-0.42188zm-66.063 0.36914 4.3066 6.4668-4.7129 7.1797h4.0293l2.7363-4.3027 2.7344 4.3027h4.1055l-4.8398-7.2578 4.3066-6.3887h-3.9766l-2.2793 3.5645-2.3066-3.5645zm13.275 0 4.584 12.803c0.10133 0.26395 0.15234 0.54461 0.15234 0.84375 0 0.40472-0.11707 0.77504-0.35352 1.1094-0.21956 0.33434-0.56617 0.52729-1.0391 0.58008-0.35467 0.0176-0.70979 0.0098-1.0645-0.02539-0.35467-0.03519-0.70128-0.07028-1.0391-0.10547v3.0879c0.37156 0.03519 0.73518 0.06051 1.0898 0.07813 0.37156 0.03519 0.74368 0.05273 1.1152 0.05273 1.2329 0 2.1943-0.23778 2.8867-0.71289 0.69244-0.47511 1.2326-1.2664 1.6211-2.375l5.4727-15.336h-3.7246l-2.8613 9.3438h-0.05078l-2.9648-9.3438zm-37.48 2.4551c0.59111 0 1.0823 0.12279 1.4707 0.36914 0.38844 0.24635 0.6991 0.57184 0.93555 0.97656 0.25333 0.38713 0.43187 0.84515 0.5332 1.373 0.10133 0.5103 0.15234 1.0482 0.15234 1.6113 0 0.56309-0.05101 1.1069-0.15234 1.6348-0.10133 0.5279-0.27137 1.0035-0.50781 1.4258-0.23644 0.40472-0.5556 0.73021-0.96094 0.97656-0.38844 0.24635-0.87959 0.36914-1.4707 0.36914-0.55733 0-1.038-0.12279-1.4434-0.36914-0.38844-0.26395-0.71806-0.59723-0.98828-1.002-0.25333-0.42232-0.43842-0.89788-0.55664-1.4258s-0.17773-1.0561-0.17773-1.584c-1e-7 -0.56309 0.05101-1.0991 0.15234-1.6094 0.11822-0.5279 0.29481-0.99567 0.53125-1.4004 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.24635 0.90303-0.36914 1.4941-0.36914zm15.84 0c0.608 0 1.1142 0.13253 1.5195 0.39648 0.42222 0.24635 0.75184 0.57184 0.98828 0.97656 0.25333 0.40472 0.42992 0.87054 0.53125 1.3984 0.10133 0.5279 0.15234 1.0658 0.15234 1.6113 0 0.5455-0.05101 1.0815-0.15234 1.6094-0.10134 0.5103-0.27792 0.97612-0.53125 1.3984-0.23644 0.40472-0.56606 0.73021-0.98828 0.97656-0.40533 0.24635-0.91153 0.36914-1.5195 0.36914-0.608 0-1.1142-0.12279-1.5195-0.36914s-0.73495-0.57184-0.98828-0.97656c-0.23644-0.42232-0.40648-0.88814-0.50781-1.3984-0.10133-0.5279-0.15234-1.0639-0.15234-1.6094 0-0.5455 0.05101-1.0834 0.15234-1.6113 0.10133-0.5279 0.27137-0.99371 0.50781-1.3984 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.26395 0.91153-0.39648 1.5195-0.39648zm42.602 0c0.59111 0 1.0803 0.11499 1.4688 0.34375 0.38844 0.22876 0.70105 0.5367 0.9375 0.92383 0.23644 0.38713 0.40648 0.8354 0.50781 1.3457 0.10133 0.49271 0.15039 1.0209 0.15039 1.584 0 0.4927-0.06606 0.96827-0.20117 1.4258-0.11822 0.43992-0.30526 0.83557-0.55859 1.1875-0.25333 0.35193-0.57445 0.63259-0.96289 0.84375-0.38844 0.21116-0.83513 0.31836-1.3418 0.31836-0.55733 0-1.021-0.12474-1.3926-0.37109-0.37156-0.24635-0.67566-0.56209-0.91211-0.94922-0.21956-0.38713-0.38109-0.81786-0.48242-1.293-0.08444-0.49271-0.12695-0.98581-0.12695-1.4785 0-0.5103 0.05101-0.99366 0.15234-1.4512 0.11822-0.47511 0.29676-0.89025 0.5332-1.2422 0.25333-0.36953 0.55744-0.65993 0.91211-0.87109 0.37156-0.21116 0.80974-0.31641 1.3164-0.31641zm15.535 0c0.87822 0 1.529 0.24753 1.9512 0.74023 0.43911 0.49271 0.74322 1.2138 0.91211 2.1641h-5.8535c0.01689-0.26395 0.0679-0.5641 0.15234-0.89844 0.10133-0.33434 0.26287-0.65008 0.48242-0.94922 0.23644-0.29914 0.54055-0.54667 0.91211-0.74023 0.38845-0.21116 0.86914-0.31641 1.4434-0.31641z" filter="url(#f)" opacity=".3" stroke="#969696" xlink:href="#path141"/>
+ <path d="m0.97202 24.161 43.605-0.0019 0.0508 3.3061-43.6 0.04174z" fill="url(#d)" stroke="#000" stroke-width=".5"/>
+ <path d="m10.283 3.5547v6.8633h-0.05078c-0.40533-0.66867-0.96254-1.1715-1.6719-1.5059-0.69244-0.35193-1.4282-0.52734-2.2051-0.52734-0.96267 0-1.807 0.2027-2.5332 0.60742-0.72622 0.38713-1.3344 0.90556-1.8242 1.5566-0.47289 0.65108-0.83456 1.4092-1.0879 2.2715-0.23644 0.84464-0.35547 1.7236-0.35547 2.6387 0 0.95022 0.11902 1.8643 0.35547 2.7441 0.25333 0.87983 0.615 1.6633 1.0879 2.3496 0.48978 0.66867 1.1065 1.2066 1.8496 1.6113 0.74311 0.38713 1.6044 0.58008 2.584 0.58008 0.86133 0 1.6311-0.15787 2.3066-0.47461 0.69244-0.33434 1.2497-0.87227 1.6719-1.6113h0.05078v1.7422h3.4199v-18.846zm12.875 4.8301c-1.0302 0-1.9596 0.17541-2.7871 0.52734-0.82756 0.33434-1.5358 0.81965-2.127 1.4531-0.59111 0.61588-1.0483 1.3721-1.3691 2.2695-0.32089 0.87983-0.48047 1.866-0.48047 2.957s0.15958 2.0752 0.48047 2.9551c0.32089 0.87983 0.77803 1.6361 1.3691 2.2695 0.59111 0.61588 1.2994 1.0914 2.127 1.4258 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.0302 0 1.9596-0.16762 2.7871-0.50195 0.84444-0.33434 1.5612-0.8099 2.1523-1.4258 0.59111-0.63348 1.0483-1.3897 1.3691-2.2695 0.32089-0.87983 0.48047-1.8641 0.48047-2.9551s-0.15958-2.0772-0.48047-2.957c-0.32089-0.89743-0.77803-1.6536-1.3691-2.2695-0.59111-0.63348-1.3079-1.1188-2.1523-1.4531-0.82756-0.35193-1.7569-0.52734-2.7871-0.52734zm41.715 0c-0.912 0-1.7223 0.18516-2.4316 0.55469-0.69244 0.36953-1.2752 0.87043-1.748 1.5039-0.47289 0.61588-0.83651 1.337-1.0898 2.1641-0.23644 0.80944-0.35352 1.6553-0.35352 2.5352 0 0.93262 0.10007 1.8214 0.30273 2.666 0.21956 0.82704 0.55767 1.556 1.0137 2.1895 0.456 0.61588 1.0387 1.109 1.748 1.4785 0.70933 0.35193 1.5536 0.5293 2.5332 0.5293 0.79378 0 1.5446-0.16762 2.2539-0.50195 0.72622-0.35193 1.2834-0.88986 1.6719-1.6113h0.05078v1.7949c0.01689 0.96782-0.21071 1.7689-0.68359 2.4023-0.456 0.63348-1.1898 0.95117-2.2031 0.95117-0.64178 0-1.2075-0.14228-1.6973-0.42383-0.48978-0.26395-0.81939-0.74731-0.98828-1.4512h-3.5723c0.05067 0.77425 0.25276 1.435 0.60742 1.9805 0.37156 0.56309 0.8287 1.0192 1.3691 1.3711 0.55733 0.35193 1.1656 0.60726 1.8242 0.76562 0.67556 0.17597 1.3328 0.26562 1.9746 0.26562 1.5031 0 2.7025-0.21245 3.5977-0.63477 0.89511-0.42232 1.5798-0.94076 2.0527-1.5566 0.47289-0.59829 0.777-1.2493 0.91211-1.9531 0.152-0.70386 0.22656-1.3295 0.22656-1.875v-12.775h-3.4199v1.8223h-0.05078c-0.43911-0.79185-0.98782-1.3551-1.6465-1.6895-0.64178-0.33434-1.3926-0.50195-2.2539-0.50195zm16.523 0c-0.99644 0-1.9088 0.18516-2.7363 0.55469-0.81067 0.36953-1.5124 0.88017-2.1035 1.5312-0.59111 0.63348-1.0463 1.3897-1.3672 2.2695s-0.48047 1.831-0.48047 2.8516c0 1.0558 0.15108 2.0225 0.45508 2.9023 0.32089 0.87983 0.76758 1.6361 1.3418 2.2695 0.57422 0.63348 1.276 1.1266 2.1035 1.4785 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.4862 0 2.7517-0.35278 3.7988-1.0566 1.0471-0.70386 1.8254-1.8733 2.332-3.5098h-3.168c-0.11822 0.42232-0.43934 0.82772-0.96289 1.2148-0.52355 0.36953-1.1468 0.55274-1.873 0.55273-1.0133 0-1.7916-0.27286-2.332-0.81836-0.54044-0.5455-0.83605-1.4245-0.88672-2.6387h9.4492c0.06756-1.0558-0.01551-2.0673-0.25195-3.0352-0.23644-0.96782-0.62557-1.8293-1.166-2.5859-0.52356-0.75666-1.1998-1.355-2.0273-1.7949-0.82756-0.45751-1.7974-0.6875-2.9121-0.6875zm16.189 0c-0.76 0-1.5023 0.18516-2.2285 0.55469-0.72622 0.35193-1.3174 0.923-1.7734 1.7148h-0.07617v-1.9004h-3.4199v13.646h3.5977v-7.1523c0-1.3901 0.21909-2.3841 0.6582-2.9824 0.43911-0.61588 1.1494-0.92383 2.1289-0.92383 0.86133 0 1.461 0.28066 1.7988 0.84375 0.33778 0.5455 0.50586 1.3816 0.50586 2.5078v7.707h3.5977v-8.3926c0-0.84464-0.0765-1.6106-0.22852-2.2969-0.13511-0.70387-0.3797-1.2925-0.73437-1.7676-0.35466-0.49271-0.84386-0.87277-1.4688-1.1367-0.608-0.28155-1.3948-0.42188-2.3574-0.42188zm-66.062 0.36914 4.3066 6.4668-4.7129 7.1797h4.0293l2.7363-4.3027 2.7344 4.3027h4.1055l-4.8398-7.2578 4.3066-6.3887h-3.9766l-2.2793 3.5645-2.3066-3.5645zm13.275 0 4.584 12.803c0.10133 0.26395 0.15234 0.54461 0.15234 0.84375 0 0.40472-0.11707 0.77504-0.35352 1.1094-0.21956 0.33434-0.56617 0.52729-1.0391 0.58008-0.35467 0.0176-0.70979 0.0098-1.0645-0.02539-0.35467-0.03519-0.70128-0.07027-1.0391-0.10547v3.0879c0.37156 0.03519 0.73518 0.06052 1.0898 0.07813 0.37156 0.03519 0.74368 0.05273 1.1152 0.05273 1.2329 0 2.1943-0.23778 2.8867-0.71289 0.69244-0.47511 1.2326-1.2664 1.6211-2.375l5.4727-15.336h-3.7246l-2.8613 9.3437h-0.05078l-2.9648-9.3437zm-37.48 2.4551c0.59111 0 1.0823 0.12279 1.4707 0.36914s0.6991 0.57184 0.93555 0.97656c0.25333 0.38713 0.43187 0.84515 0.5332 1.373 0.10133 0.5103 0.15234 1.0482 0.15234 1.6113 0 0.56309-0.05101 1.1069-0.15234 1.6348-0.10133 0.5279-0.27137 1.0035-0.50781 1.4258-0.23644 0.40472-0.5556 0.73021-0.96094 0.97656-0.38844 0.24635-0.87959 0.36914-1.4707 0.36914-0.55733 0-1.038-0.12279-1.4434-0.36914-0.38844-0.26395-0.71806-0.59723-0.98828-1.002-0.25333-0.42232-0.43842-0.89788-0.55664-1.4258s-0.17773-1.0561-0.17773-1.584c-1e-7 -0.56309 0.05101-1.0991 0.15234-1.6094 0.11822-0.5279 0.29481-0.99567 0.53125-1.4004 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.24635 0.90303-0.36914 1.4941-0.36914zm15.84 0c0.608 0 1.1142 0.13254 1.5195 0.39648 0.42222 0.24635 0.75184 0.57184 0.98828 0.97656 0.25333 0.40472 0.42992 0.87054 0.53125 1.3984 0.10133 0.5279 0.15234 1.0658 0.15234 1.6113 0 0.5455-0.05101 1.0815-0.15234 1.6094-0.10133 0.5103-0.27792 0.97612-0.53125 1.3984-0.23644 0.40472-0.56606 0.73021-0.98828 0.97656-0.40533 0.24635-0.91153 0.36914-1.5195 0.36914-0.608 0-1.1142-0.12279-1.5195-0.36914s-0.73495-0.57184-0.98828-0.97656c-0.23644-0.42232-0.40648-0.88813-0.50781-1.3984-0.10133-0.5279-0.15234-1.0639-0.15234-1.6094 0-0.5455 0.05101-1.0834 0.15234-1.6113 0.10133-0.5279 0.27137-0.99371 0.50781-1.3984 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.26395 0.91153-0.39648 1.5195-0.39648zm42.602 0c0.59111 0 1.0803 0.11499 1.4688 0.34375 0.38844 0.22876 0.70106 0.5367 0.9375 0.92383 0.23644 0.38713 0.40648 0.8354 0.50781 1.3457 0.10133 0.49271 0.15039 1.0209 0.15039 1.584 0 0.49271-0.06606 0.96827-0.20117 1.4258-0.11822 0.43992-0.30526 0.83557-0.55859 1.1875-0.25333 0.35193-0.57445 0.63259-0.96289 0.84375-0.38844 0.21116-0.83513 0.31836-1.3418 0.31836-0.55733 0-1.021-0.12474-1.3926-0.37109-0.37156-0.24635-0.67566-0.56209-0.91211-0.94922-0.21956-0.38713-0.38109-0.81786-0.48242-1.293-0.08444-0.49271-0.12695-0.98581-0.12695-1.4785 0-0.5103 0.05101-0.99366 0.15234-1.4512 0.11822-0.47511 0.29676-0.89026 0.5332-1.2422 0.25333-0.36953 0.55744-0.65993 0.91211-0.87109 0.37156-0.21116 0.80974-0.31641 1.3164-0.31641zm15.535 0c0.87822 0 1.529 0.24753 1.9512 0.74024 0.43911 0.49271 0.74322 1.2138 0.91211 2.1641h-5.8535c0.01689-0.26395 0.0679-0.5641 0.15234-0.89844 0.10133-0.33434 0.26287-0.65008 0.48242-0.94922 0.23644-0.29914 0.54055-0.54667 0.91211-0.74023 0.38845-0.21116 0.86914-0.31641 1.4434-0.31641z" fill="url(#e)" stroke="#606060" stroke-width=".7"/>
+ <path d="m52.988 27.291c0.99602-1.0359 1.3944-1.8725 1.7928-3.1076l3.8247-0.03984c0.3113 1.6096 0.82413 2.5137 1.6335 3.1474z" fill="url(#b)" stroke="#000" stroke-width=".5"/>
+ <path d="m73.89 24.04 28.885-0.2011-0.12476 3.3879-31.033 0.16229c1.2621-1.0234 1.9665-2.2859 2.2724-3.3491z" fill="url(#c)" stroke="#000" stroke-width=".41788"/>
+ </g>
+</svg>
diff --git a/dev/MinGfx/docs/html/dynsections.js b/dev/MinGfx/docs/html/dynsections.js
new file mode 100644
index 0000000..88f2c27
--- /dev/null
+++ b/dev/MinGfx/docs/html/dynsections.js
@@ -0,0 +1,128 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ 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.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+ */
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+ content.hide();
+ summary.show();
+ $(linkObj).addClass('closed').removeClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ content.show();
+ summary.hide();
+ $(linkObj).removeClass('closed').addClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+ return false;
+}
+
+function updateStripes()
+{
+ $('table.directory tr').
+ removeClass('even').filter(':visible:even').addClass('even');
+}
+
+function toggleLevel(level)
+{
+ $('table.directory tr').each(function() {
+ var l = this.id.split('_').length-1;
+ var i = $('#img'+this.id.substring(3));
+ var a = $('#arr'+this.id.substring(3));
+ if (l<level+1) {
+ i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
+ a.html('&#9660;');
+ $(this).show();
+ } else if (l==level+1) {
+ i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
+ a.html('&#9658;');
+ $(this).show();
+ } else {
+ $(this).hide();
+ }
+ });
+ updateStripes();
+}
+
+function toggleFolder(id)
+{
+ // the clicked row
+ var currentRow = $('#row_'+id);
+
+ // all rows after the clicked row
+ var rows = currentRow.nextAll("tr");
+
+ var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
+
+ // only match elements AFTER this one (can't hide elements before)
+ var childRows = rows.filter(function() { return this.id.match(re); });
+
+ // first row is visible we are HIDING
+ if (childRows.filter(':first').is(':visible')===true) {
+ // replace down arrow by right arrow for current row
+ var currentRowSpans = currentRow.find("span");
+ currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+ currentRowSpans.filter(".arrow").html('&#9658;');
+ rows.filter("[id^=row_"+id+"]").hide(); // hide all children
+ } else { // we are SHOWING
+ // replace right arrow by down arrow for current row
+ var currentRowSpans = currentRow.find("span");
+ currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
+ currentRowSpans.filter(".arrow").html('&#9660;');
+ // replace down arrows by right arrows for child rows
+ var childRowsSpans = childRows.find("span");
+ childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+ childRowsSpans.filter(".arrow").html('&#9658;');
+ childRows.show(); //show all children
+ }
+ updateStripes();
+}
+
+
+function toggleInherit(id)
+{
+ var rows = $('tr.inherit.'+id);
+ var img = $('tr.inherit_header.'+id+' img');
+ var src = $(img).attr('src');
+ if (rows.filter(':first').is(':visible')===true) {
+ rows.css('display','none');
+ $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ rows.css('display','table-row'); // using show() causes jump in firefox
+ $(img).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+}
+/* @license-end */
+
+$(document).ready(function() {
+ $('.code,.codeRef').each(function() {
+ $(this).data('powertip',$('#a'+$(this).attr('href').replace(/.*\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html());
+ $(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true });
+ });
+});
diff --git a/dev/MinGfx/docs/html/files.html b/dev/MinGfx/docs/html/files.html
new file mode 100644
index 0000000..37a546d
--- /dev/null
+++ b/dev/MinGfx/docs/html/files.html
@@ -0,0 +1,118 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: File List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">File List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="iconfclosed"></span><a class="el" href="dir_e68e8157741866f444e17edd764ebbae.html" target="_self">doc</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">&#9660;</span><span id="img_1_" class="iconfopen" onclick="toggleFolder('1_')">&#160;</span><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html" target="_self">src</a></td><td class="desc"></td></tr>
+<tr id="row_1_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="aabb_8h_source.html"><span class="icondoc"></span></a><a class="el" href="aabb_8h.html" target="_self">aabb.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="bvh_8h_source.html"><span class="icondoc"></span></a><a class="el" href="bvh_8h.html" target="_self">bvh.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="color_8h_source.html"><span class="icondoc"></span></a><a class="el" href="color_8h.html" target="_self">color.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_3_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="craft__cam_8h_source.html"><span class="icondoc"></span></a><a class="el" href="craft__cam_8h.html" target="_self">craft_cam.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="default__shader_8h_source.html"><span class="icondoc"></span></a><a class="el" href="default__shader_8h.html" target="_self">default_shader.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_5_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="gfxmath_8h_source.html"><span class="icondoc"></span></a><a class="el" href="gfxmath_8h.html" target="_self">gfxmath.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_6_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="graphics__app_8h_source.html"><span class="icondoc"></span></a><a class="el" href="graphics__app_8h.html" target="_self">graphics_app.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_7_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="matrix4_8h_source.html"><span class="icondoc"></span></a><a class="el" href="matrix4_8h.html" target="_self">matrix4.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_8_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="mesh_8h_source.html"><span class="icondoc"></span></a><a class="el" href="mesh_8h.html" target="_self">mesh.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_9_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="mingfx_8h_source.html"><span class="icondoc"></span></a><a class="el" href="mingfx_8h.html" target="_self">mingfx.h</a></td><td class="desc">Includes the entire MinGfx library and calls using namespace mingfx </td></tr>
+<tr id="row_1_10_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="mingfx__config_8h_source.html"><span class="icondoc"></span></a><a class="el" href="mingfx__config_8h.html" target="_self">mingfx_config.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_11_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="opengl__headers_8h_source.html"><span class="icondoc"></span></a><a class="el" href="opengl__headers_8h.html" target="_self">opengl_headers.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_12_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="platform_8h_source.html"><span class="icondoc"></span></a><a class="el" href="platform_8h.html" target="_self">platform.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_13_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="point2_8h_source.html"><span class="icondoc"></span></a><a class="el" href="point2_8h.html" target="_self">point2.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_14_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="point3_8h_source.html"><span class="icondoc"></span></a><a class="el" href="point3_8h.html" target="_self">point3.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_15_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="quaternion_8h_source.html"><span class="icondoc"></span></a><a class="el" href="quaternion_8h.html" target="_self">quaternion.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_16_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="quick__shapes_8h_source.html"><span class="icondoc"></span></a><a class="el" href="quick__shapes_8h.html" target="_self">quick_shapes.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_17_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="ray_8h_source.html"><span class="icondoc"></span></a><a class="el" href="ray_8h.html" target="_self">ray.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_18_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="shader__program_8h_source.html"><span class="icondoc"></span></a><a class="el" href="shader__program_8h.html" target="_self">shader_program.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_19_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="stb__rect__pack_8h_source.html"><span class="icondoc"></span></a><a class="el" href="stb__rect__pack_8h.html" target="_self">stb_rect_pack.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_20_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="text__shader_8h_source.html"><span class="icondoc"></span></a><a class="el" href="text__shader_8h.html" target="_self">text_shader.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_21_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="texture2d_8h_source.html"><span class="icondoc"></span></a><a class="el" href="texture2d_8h.html" target="_self">texture2d.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_22_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="unicam_8h_source.html"><span class="icondoc"></span></a><a class="el" href="unicam_8h.html" target="_self">unicam.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_23_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="vector2_8h_source.html"><span class="icondoc"></span></a><a class="el" href="vector2_8h.html" target="_self">vector2.h</a></td><td class="desc"></td></tr>
+<tr id="row_1_24_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="vector3_8h_source.html"><span class="icondoc"></span></a><a class="el" href="vector3_8h.html" target="_self">vector3.h</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/folderclosed.png b/dev/MinGfx/docs/html/folderclosed.png
new file mode 100644
index 0000000..44c8755
--- /dev/null
+++ b/dev/MinGfx/docs/html/folderclosed.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/folderopen.png b/dev/MinGfx/docs/html/folderopen.png
new file mode 100644
index 0000000..ed88e79
--- /dev/null
+++ b/dev/MinGfx/docs/html/folderopen.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/functions.html b/dev/MinGfx/docs/html/functions.html
new file mode 100644
index 0000000..7f04684
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions.html
@@ -0,0 +1,129 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>AABB()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#af7acb376dbda50fa1d8c30d1b5eb85fb">mingfx::AABB</a>
+</li>
+<li>active_head
+: <a class="el" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">stbrp_context</a>
+</li>
+<li>AddFragmentShaderFromFile()
+: <a class="el" href="classmingfx_1_1_shader_program.html#acd94fc12beb85fe57aa80d3b825018b0">mingfx::ShaderProgram</a>
+</li>
+<li>AddFragmentShaderFromSource()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a7a3063ec42798c076e1ab0c0e6411e9c">mingfx::ShaderProgram</a>
+</li>
+<li>AddLight()
+: <a class="el" href="classmingfx_1_1_default_shader.html#af54a8e489d9fb34cfceb1c07562c6e2c">mingfx::DefaultShader</a>
+</li>
+<li>AddTriangle()
+: <a class="el" href="classmingfx_1_1_mesh.html#a29eeb2e778704350789033ec4940d55a">mingfx::Mesh</a>
+</li>
+<li>AddVertexShaderFromFile()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a63ac061271fad9338e922389d4a179e5">mingfx::ShaderProgram</a>
+</li>
+<li>AddVertexShaderFromSource()
+: <a class="el" href="classmingfx_1_1_shader_program.html#ab5fed4904a59c6e83ebb43aebf4c043d">mingfx::ShaderProgram</a>
+</li>
+<li>AdvanceAnimation()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#aab253d966af52ac277ac51194745085c">mingfx::UniCam</a>
+</li>
+<li>Align()
+: <a class="el" href="classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d">mingfx::Matrix4</a>
+</li>
+<li>align
+: <a class="el" href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481">stbrp_context</a>
+</li>
+<li>ambient_intensity
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a226c173b193459af291687dd45280fbb">mingfx::DefaultShader::LightProperties</a>
+</li>
+<li>ambient_reflectance
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad4db9a1b0636db84f57f022c51ce7657">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+<li>aspect_ratio()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23">mingfx::GraphicsApp</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_b.html b/dev/MinGfx/docs/html/functions_b.html
new file mode 100644
index 0000000..b99bf1c
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_b.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>BindTexture()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a4e5a2659f66f29433b15748f36c61ea2">mingfx::ShaderProgram</a>
+</li>
+<li>BuildBVH()
+: <a class="el" href="classmingfx_1_1_mesh.html#a8d96c1b5985cd836f2aa2b2994af64c1">mingfx::Mesh</a>
+</li>
+<li>BVH()
+: <a class="el" href="classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75">mingfx::BVH</a>
+</li>
+<li>bvh_ptr()
+: <a class="el" href="classmingfx_1_1_mesh.html#a978b1341d5613d399a68e40c61c57ba4">mingfx::Mesh</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_c.html b/dev/MinGfx/docs/html/functions_c.html
new file mode 100644
index 0000000..6d7a3e6
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_c.html
@@ -0,0 +1,132 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_c"></a>- c -</h3><ul>
+<li>CalcPerFaceNormals()
+: <a class="el" href="classmingfx_1_1_mesh.html#a1a5cea9cfdf4c672ba0c781ee54718f7">mingfx::Mesh</a>
+</li>
+<li>CalcPerVertexNormals()
+: <a class="el" href="classmingfx_1_1_mesh.html#acc7df547b0a2175287cc9f509c04e93c">mingfx::Mesh</a>
+</li>
+<li>Clamp()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#af227209ec043b375497556ee2dcdf850">mingfx::GfxMath</a>
+</li>
+<li>ClosestPoint()
+: <a class="el" href="classmingfx_1_1_point3.html#a9dd5396f53b7006ec4cb63abffd90a7c">mingfx::Point3</a>
+</li>
+<li>ClosestPointOnPlane()
+: <a class="el" href="classmingfx_1_1_point3.html#ae31d5f91a03fabdf72b2fa54e177b743">mingfx::Point3</a>
+</li>
+<li>Cofactor()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a0d88ba8e15325d135157d115f2412e91">mingfx::Matrix4</a>
+</li>
+<li>Color()
+: <a class="el" href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">mingfx::Color</a>
+</li>
+<li>color
+: <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#af0483874ac3fcea58b6ff99ef6644ff7">mingfx::TextShader::TextFormat</a>
+</li>
+<li>ColumnToPoint3()
+: <a class="el" href="classmingfx_1_1_matrix4.html#ae991be2b3bca290b44e676a9f8dc13bd">mingfx::Matrix4</a>
+</li>
+<li>ColumnToVector3()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a7396dbff36cb732e1bd878020f52bbc3">mingfx::Matrix4</a>
+</li>
+<li>Conjugate()
+: <a class="el" href="classmingfx_1_1_quaternion.html#ab0e3e20f78e537de0187def78d808584">mingfx::Quaternion</a>
+</li>
+<li>CraftCam()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171">mingfx::CraftCam</a>
+</li>
+<li>CreateFromListOfBoxes()
+: <a class="el" href="classmingfx_1_1_b_v_h.html#a964420ca931fa93c420f0820e1b95942">mingfx::BVH</a>
+</li>
+<li>CreateFromMesh()
+: <a class="el" href="classmingfx_1_1_b_v_h.html#a8ed3e91ecd2a0585a0dbac605d6f2c71">mingfx::BVH</a>
+</li>
+<li>Cross()
+: <a class="el" href="classmingfx_1_1_vector3.html#a38cd4deed7d342464619b34b0ef95bec">mingfx::Vector3</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_d.html b/dev/MinGfx/docs/html/functions_d.html
new file mode 100644
index 0000000..58286eb
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_d.html
@@ -0,0 +1,163 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>default_shader()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#aa7564a49dc2ff8efd93dec13186cb75b">mingfx::QuickShapes</a>
+</li>
+<li>DefaultShader()
+: <a class="el" href="classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428">mingfx::DefaultShader</a>
+</li>
+<li>Determinant()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a0127ebae92b50e4f10ebee8565b0248c">mingfx::Matrix4</a>
+</li>
+<li>diffuse_intensity
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a9a010057c15e3db5661b07a03d5176d7">mingfx::DefaultShader::LightProperties</a>
+</li>
+<li>diffuse_reflectance
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa7b75f95a45d7a1030c297192b14014f">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+<li>Dimensions()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#a3bf7d5ffa3ccccf7111e98d88a3ffeec">mingfx::AABB</a>
+</li>
+<li>direction()
+: <a class="el" href="classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe">mingfx::Ray</a>
+</li>
+<li>DistanceToPlane()
+: <a class="el" href="classmingfx_1_1_point3.html#af554773b2d7f4492a0727e8e42efe002">mingfx::Point3</a>
+</li>
+<li>Dot()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a90a9b715d06c75ba60eb1164dc6e9c6f">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#ae2208539c6b29712c22f557dcfdd55d9">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a31692a459a8056fe220d115eb5addc88">mingfx::Vector3</a>
+</li>
+<li>Draw()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b">mingfx::DefaultShader</a>
+, <a class="el" href="classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c">mingfx::Mesh</a>
+, <a class="el" href="classmingfx_1_1_uni_cam.html#ae45f3c80c205a539baeb4f1b8787777d">mingfx::UniCam</a>
+</li>
+<li>Draw3D()
+: <a class="el" href="classmingfx_1_1_text_shader.html#a2caaaf2decfac523b476951474e9a359">mingfx::TextShader</a>
+</li>
+<li>DrawArrow()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#aebe27814a826558ac0475fef3d4481eb">mingfx::QuickShapes</a>
+</li>
+<li>DrawAxes()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a637876fdc13e84282922350b53dab5f8">mingfx::QuickShapes</a>
+</li>
+<li>DrawBrush()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#ab24811cfd980b3f2ec4ebccf6c0e8b30">mingfx::QuickShapes</a>
+</li>
+<li>DrawCone()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a1880f6dd3e794cd9f6e5d9138f93a424">mingfx::QuickShapes</a>
+</li>
+<li>DrawCube()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#adad98f87a40650ff7c605a94b6d937af">mingfx::QuickShapes</a>
+</li>
+<li>DrawCylinder()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a69c442154f800c6bb3f6ffa8395e2844">mingfx::QuickShapes</a>
+</li>
+<li>DrawFullscreenTexture()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#abec2513648c1238f36c41cf3c85dd868">mingfx::QuickShapes</a>
+</li>
+<li>DrawLines()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#af59ae8d8c5bd0447f3bb7f56112400bf">mingfx::QuickShapes</a>
+</li>
+<li>DrawLineSegment()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a0feae19a04d9f315a39e2bdbf659bd7e">mingfx::QuickShapes</a>
+</li>
+<li>DrawSphere()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#aa5f4f64e3708630a6d58f6b4ca7d2744">mingfx::QuickShapes</a>
+</li>
+<li>DrawSquare()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a4350ea23b8b9e0e8119310423d641ab3">mingfx::QuickShapes</a>
+</li>
+<li>DrawUsingNanoVG()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0">mingfx::GraphicsApp</a>
+</li>
+<li>DrawUsingOpenGL()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca">mingfx::GraphicsApp</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_e.html b/dev/MinGfx/docs/html/functions_e.html
new file mode 100644
index 0000000..0125b04
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_e.html
@@ -0,0 +1,94 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>extra
+: <a class="el" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">stbrp_context</a>
+</li>
+<li>eye()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a82a8e20596247e2986e5929c1ef7f150">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_uni_cam.html#a65d5735b4b3a8e38f2b30df4133cadd2">mingfx::UniCam</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_enum.html b/dev/MinGfx/docs/html/functions_enum.html
new file mode 100644
index 0000000..a963b42
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_enum.html
@@ -0,0 +1,94 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Enumerations</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>HorizAlign
+: <a class="el" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c">mingfx::TextShader</a>
+</li>
+<li>LinesType
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603">mingfx::QuickShapes</a>
+</li>
+<li>VertAlign
+: <a class="el" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a">mingfx::TextShader</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_f.html b/dev/MinGfx/docs/html/functions_f.html
new file mode 100644
index 0000000..2b80c54
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_f.html
@@ -0,0 +1,126 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_f"></a>- f -</h3><ul>
+<li>FastIntersectMesh()
+: <a class="el" href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc">mingfx::Ray</a>
+</li>
+<li>FileExists()
+: <a class="el" href="classmingfx_1_1_platform.html#a045007efda73123a7f4019837d83bc92">mingfx::Platform</a>
+</li>
+<li>filter_mode()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#af0052203fcfd9bbb903a40d14700b13b">mingfx::Texture2D</a>
+</li>
+<li>FindFile()
+: <a class="el" href="classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1">mingfx::Platform</a>
+</li>
+<li>FindMinGfxDataFile()
+: <a class="el" href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b">mingfx::Platform</a>
+</li>
+<li>FindMinGfxShaderFile()
+: <a class="el" href="classmingfx_1_1_platform.html#af12cd63e1ede33529d8c282d7d916169">mingfx::Platform</a>
+</li>
+<li>framebuffer_height()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#af58153eb104f53216a3e67de2a472f32">mingfx::GraphicsApp</a>
+</li>
+<li>framebuffer_width()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ad596e69d030e7689ad91eaaec6975696">mingfx::GraphicsApp</a>
+</li>
+<li>free_head
+: <a class="el" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">stbrp_context</a>
+</li>
+<li>FromAxisAngle()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a5bacec2f9a3cbbcf24572f9c8eeb480c">mingfx::Quaternion</a>
+</li>
+<li>FromEulerAnglesZYX()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18">mingfx::Quaternion</a>
+</li>
+<li>FromRowMajorElements()
+: <a class="el" href="classmingfx_1_1_matrix4.html#add98bfa1cf6a10dbae0e8ae8defe728b">mingfx::Matrix4</a>
+</li>
+<li>Frustum()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a8e2f7b50cd2c8853e007829df9863722">mingfx::Matrix4</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func.html b/dev/MinGfx/docs/html/functions_func.html
new file mode 100644
index 0000000..d0ce7f9
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func.html
@@ -0,0 +1,117 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>AABB()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#af7acb376dbda50fa1d8c30d1b5eb85fb">mingfx::AABB</a>
+</li>
+<li>AddFragmentShaderFromFile()
+: <a class="el" href="classmingfx_1_1_shader_program.html#acd94fc12beb85fe57aa80d3b825018b0">mingfx::ShaderProgram</a>
+</li>
+<li>AddFragmentShaderFromSource()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a7a3063ec42798c076e1ab0c0e6411e9c">mingfx::ShaderProgram</a>
+</li>
+<li>AddLight()
+: <a class="el" href="classmingfx_1_1_default_shader.html#af54a8e489d9fb34cfceb1c07562c6e2c">mingfx::DefaultShader</a>
+</li>
+<li>AddTriangle()
+: <a class="el" href="classmingfx_1_1_mesh.html#a29eeb2e778704350789033ec4940d55a">mingfx::Mesh</a>
+</li>
+<li>AddVertexShaderFromFile()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a63ac061271fad9338e922389d4a179e5">mingfx::ShaderProgram</a>
+</li>
+<li>AddVertexShaderFromSource()
+: <a class="el" href="classmingfx_1_1_shader_program.html#ab5fed4904a59c6e83ebb43aebf4c043d">mingfx::ShaderProgram</a>
+</li>
+<li>AdvanceAnimation()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#aab253d966af52ac277ac51194745085c">mingfx::UniCam</a>
+</li>
+<li>Align()
+: <a class="el" href="classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d">mingfx::Matrix4</a>
+</li>
+<li>aspect_ratio()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23">mingfx::GraphicsApp</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_b.html b/dev/MinGfx/docs/html/functions_func_b.html
new file mode 100644
index 0000000..cb37680
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_b.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>BindTexture()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a4e5a2659f66f29433b15748f36c61ea2">mingfx::ShaderProgram</a>
+</li>
+<li>BuildBVH()
+: <a class="el" href="classmingfx_1_1_mesh.html#a8d96c1b5985cd836f2aa2b2994af64c1">mingfx::Mesh</a>
+</li>
+<li>BVH()
+: <a class="el" href="classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75">mingfx::BVH</a>
+</li>
+<li>bvh_ptr()
+: <a class="el" href="classmingfx_1_1_mesh.html#a978b1341d5613d399a68e40c61c57ba4">mingfx::Mesh</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_c.html b/dev/MinGfx/docs/html/functions_func_c.html
new file mode 100644
index 0000000..34df742
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_c.html
@@ -0,0 +1,129 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_c"></a>- c -</h3><ul>
+<li>CalcPerFaceNormals()
+: <a class="el" href="classmingfx_1_1_mesh.html#a1a5cea9cfdf4c672ba0c781ee54718f7">mingfx::Mesh</a>
+</li>
+<li>CalcPerVertexNormals()
+: <a class="el" href="classmingfx_1_1_mesh.html#acc7df547b0a2175287cc9f509c04e93c">mingfx::Mesh</a>
+</li>
+<li>Clamp()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#af227209ec043b375497556ee2dcdf850">mingfx::GfxMath</a>
+</li>
+<li>ClosestPoint()
+: <a class="el" href="classmingfx_1_1_point3.html#a9dd5396f53b7006ec4cb63abffd90a7c">mingfx::Point3</a>
+</li>
+<li>ClosestPointOnPlane()
+: <a class="el" href="classmingfx_1_1_point3.html#ae31d5f91a03fabdf72b2fa54e177b743">mingfx::Point3</a>
+</li>
+<li>Cofactor()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a0d88ba8e15325d135157d115f2412e91">mingfx::Matrix4</a>
+</li>
+<li>Color()
+: <a class="el" href="classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d">mingfx::Color</a>
+</li>
+<li>ColumnToPoint3()
+: <a class="el" href="classmingfx_1_1_matrix4.html#ae991be2b3bca290b44e676a9f8dc13bd">mingfx::Matrix4</a>
+</li>
+<li>ColumnToVector3()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a7396dbff36cb732e1bd878020f52bbc3">mingfx::Matrix4</a>
+</li>
+<li>Conjugate()
+: <a class="el" href="classmingfx_1_1_quaternion.html#ab0e3e20f78e537de0187def78d808584">mingfx::Quaternion</a>
+</li>
+<li>CraftCam()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171">mingfx::CraftCam</a>
+</li>
+<li>CreateFromListOfBoxes()
+: <a class="el" href="classmingfx_1_1_b_v_h.html#a964420ca931fa93c420f0820e1b95942">mingfx::BVH</a>
+</li>
+<li>CreateFromMesh()
+: <a class="el" href="classmingfx_1_1_b_v_h.html#a8ed3e91ecd2a0585a0dbac605d6f2c71">mingfx::BVH</a>
+</li>
+<li>Cross()
+: <a class="el" href="classmingfx_1_1_vector3.html#a38cd4deed7d342464619b34b0ef95bec">mingfx::Vector3</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_d.html b/dev/MinGfx/docs/html/functions_func_d.html
new file mode 100644
index 0000000..8192d7f
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_d.html
@@ -0,0 +1,157 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>default_shader()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#aa7564a49dc2ff8efd93dec13186cb75b">mingfx::QuickShapes</a>
+</li>
+<li>DefaultShader()
+: <a class="el" href="classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428">mingfx::DefaultShader</a>
+</li>
+<li>Determinant()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a0127ebae92b50e4f10ebee8565b0248c">mingfx::Matrix4</a>
+</li>
+<li>Dimensions()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#a3bf7d5ffa3ccccf7111e98d88a3ffeec">mingfx::AABB</a>
+</li>
+<li>direction()
+: <a class="el" href="classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe">mingfx::Ray</a>
+</li>
+<li>DistanceToPlane()
+: <a class="el" href="classmingfx_1_1_point3.html#af554773b2d7f4492a0727e8e42efe002">mingfx::Point3</a>
+</li>
+<li>Dot()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a90a9b715d06c75ba60eb1164dc6e9c6f">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#ae2208539c6b29712c22f557dcfdd55d9">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a31692a459a8056fe220d115eb5addc88">mingfx::Vector3</a>
+</li>
+<li>Draw()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b">mingfx::DefaultShader</a>
+, <a class="el" href="classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c">mingfx::Mesh</a>
+, <a class="el" href="classmingfx_1_1_uni_cam.html#ae45f3c80c205a539baeb4f1b8787777d">mingfx::UniCam</a>
+</li>
+<li>Draw3D()
+: <a class="el" href="classmingfx_1_1_text_shader.html#a2caaaf2decfac523b476951474e9a359">mingfx::TextShader</a>
+</li>
+<li>DrawArrow()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#aebe27814a826558ac0475fef3d4481eb">mingfx::QuickShapes</a>
+</li>
+<li>DrawAxes()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a637876fdc13e84282922350b53dab5f8">mingfx::QuickShapes</a>
+</li>
+<li>DrawBrush()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#ab24811cfd980b3f2ec4ebccf6c0e8b30">mingfx::QuickShapes</a>
+</li>
+<li>DrawCone()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a1880f6dd3e794cd9f6e5d9138f93a424">mingfx::QuickShapes</a>
+</li>
+<li>DrawCube()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#adad98f87a40650ff7c605a94b6d937af">mingfx::QuickShapes</a>
+</li>
+<li>DrawCylinder()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a69c442154f800c6bb3f6ffa8395e2844">mingfx::QuickShapes</a>
+</li>
+<li>DrawFullscreenTexture()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#abec2513648c1238f36c41cf3c85dd868">mingfx::QuickShapes</a>
+</li>
+<li>DrawLines()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#af59ae8d8c5bd0447f3bb7f56112400bf">mingfx::QuickShapes</a>
+</li>
+<li>DrawLineSegment()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a0feae19a04d9f315a39e2bdbf659bd7e">mingfx::QuickShapes</a>
+</li>
+<li>DrawSphere()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#aa5f4f64e3708630a6d58f6b4ca7d2744">mingfx::QuickShapes</a>
+</li>
+<li>DrawSquare()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a4350ea23b8b9e0e8119310423d641ab3">mingfx::QuickShapes</a>
+</li>
+<li>DrawUsingNanoVG()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0">mingfx::GraphicsApp</a>
+</li>
+<li>DrawUsingOpenGL()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca">mingfx::GraphicsApp</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_e.html b/dev/MinGfx/docs/html/functions_func_e.html
new file mode 100644
index 0000000..706b50e
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_e.html
@@ -0,0 +1,91 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>eye()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a82a8e20596247e2986e5929c1ef7f150">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_uni_cam.html#a65d5735b4b3a8e38f2b30df4133cadd2">mingfx::UniCam</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_f.html b/dev/MinGfx/docs/html/functions_func_f.html
new file mode 100644
index 0000000..d7c92ad
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_f.html
@@ -0,0 +1,123 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_f"></a>- f -</h3><ul>
+<li>FastIntersectMesh()
+: <a class="el" href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc">mingfx::Ray</a>
+</li>
+<li>FileExists()
+: <a class="el" href="classmingfx_1_1_platform.html#a045007efda73123a7f4019837d83bc92">mingfx::Platform</a>
+</li>
+<li>filter_mode()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#af0052203fcfd9bbb903a40d14700b13b">mingfx::Texture2D</a>
+</li>
+<li>FindFile()
+: <a class="el" href="classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1">mingfx::Platform</a>
+</li>
+<li>FindMinGfxDataFile()
+: <a class="el" href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b">mingfx::Platform</a>
+</li>
+<li>FindMinGfxShaderFile()
+: <a class="el" href="classmingfx_1_1_platform.html#af12cd63e1ede33529d8c282d7d916169">mingfx::Platform</a>
+</li>
+<li>framebuffer_height()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#af58153eb104f53216a3e67de2a472f32">mingfx::GraphicsApp</a>
+</li>
+<li>framebuffer_width()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ad596e69d030e7689ad91eaaec6975696">mingfx::GraphicsApp</a>
+</li>
+<li>FromAxisAngle()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a5bacec2f9a3cbbcf24572f9c8eeb480c">mingfx::Quaternion</a>
+</li>
+<li>FromEulerAnglesZYX()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18">mingfx::Quaternion</a>
+</li>
+<li>FromRowMajorElements()
+: <a class="el" href="classmingfx_1_1_matrix4.html#add98bfa1cf6a10dbae0e8ae8defe728b">mingfx::Matrix4</a>
+</li>
+<li>Frustum()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a8e2f7b50cd2c8853e007829df9863722">mingfx::Matrix4</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_g.html b/dev/MinGfx/docs/html/functions_func_g.html
new file mode 100644
index 0000000..bc2d2b1
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_g.html
@@ -0,0 +1,90 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_g"></a>- g -</h3><ul>
+<li>GraphicsApp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b">mingfx::GraphicsApp</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_h.html b/dev/MinGfx/docs/html/functions_func_h.html
new file mode 100644
index 0000000..ecc0de4
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_h.html
@@ -0,0 +1,90 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>height()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88">mingfx::Texture2D</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_i.html b/dev/MinGfx/docs/html/functions_func_i.html
new file mode 100644
index 0000000..0de5c8a
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_i.html
@@ -0,0 +1,152 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>iLerp()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#af255bde64498e9b55be466abeea97f4d">mingfx::GfxMath</a>
+</li>
+<li>Init()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3">mingfx::DefaultShader</a>
+, <a class="el" href="classmingfx_1_1_text_shader.html#ad60a8b572adc30dad47e2d163dc603a3">mingfx::TextShader</a>
+</li>
+<li>InitFromBytes()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#aba57b01065096fe9f6483e8f68622944">mingfx::Texture2D</a>
+</li>
+<li>InitFromFile()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a8eded044ccdf9bd3e1e5bcfe74526bdc">mingfx::Texture2D</a>
+</li>
+<li>InitFromFloats()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#aee8a0aad1795680cb840ffcf544ed7b8">mingfx::Texture2D</a>
+</li>
+<li>InitGraphicsContext()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a04beb462aa04371dc86d807838f999e1">mingfx::GraphicsApp</a>
+</li>
+<li>initialized()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a2eddd93e446ad2079d1c57676655ffbe">mingfx::ShaderProgram</a>
+, <a class="el" href="classmingfx_1_1_texture2_d.html#a15d5c319cf7e012e703668f4d4e7be87">mingfx::Texture2D</a>
+</li>
+<li>InitNanoGUI()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a">mingfx::GraphicsApp</a>
+</li>
+<li>InitOpenGL()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3">mingfx::GraphicsApp</a>
+</li>
+<li>IntersectAABB()
+: <a class="el" href="classmingfx_1_1_ray.html#a57d3ee10518ed361ae02d9cbdef842b7">mingfx::Ray</a>
+</li>
+<li>IntersectAndReturnUserData()
+: <a class="el" href="classmingfx_1_1_b_v_h.html#afad54f50a29e8b3aace6cdec5c792c56">mingfx::BVH</a>
+</li>
+<li>IntersectMesh()
+: <a class="el" href="classmingfx_1_1_ray.html#a79caa1df0839d13339575d3d5527ae6f">mingfx::Ray</a>
+</li>
+<li>IntersectPlane()
+: <a class="el" href="classmingfx_1_1_ray.html#a8707604031eb9437c449345d85d69d24">mingfx::Ray</a>
+</li>
+<li>IntersectQuad()
+: <a class="el" href="classmingfx_1_1_ray.html#a37689523a0b73d3d3288ce60bdcb7ae3">mingfx::Ray</a>
+</li>
+<li>IntersectSphere()
+: <a class="el" href="classmingfx_1_1_ray.html#a970c7dbc19167be625967fabfb39b4ff">mingfx::Ray</a>
+</li>
+<li>IntersectTriangle()
+: <a class="el" href="classmingfx_1_1_ray.html#a1a6130616c4e4eebe9d09181b0f8b734">mingfx::Ray</a>
+</li>
+<li>Inverse()
+: <a class="el" href="classmingfx_1_1_matrix4.html#ab3f360906e15730eee621826b5f0bbc5">mingfx::Matrix4</a>
+</li>
+<li>IsKeyDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a60688614e5dfeaabf57f8825cdaa08ac">mingfx::GraphicsApp</a>
+</li>
+<li>IsLeftMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a5b78d79192180a6ef5271d2a2b2d1cc7">mingfx::GraphicsApp</a>
+</li>
+<li>IsMiddleMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a941f7598400073bfa93aa194a3773434">mingfx::GraphicsApp</a>
+</li>
+<li>IsRightMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a4aa30e3d33731178a9162454a81be08d">mingfx::GraphicsApp</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_l.html b/dev/MinGfx/docs/html/functions_func_l.html
new file mode 100644
index 0000000..bc8c345
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_l.html
@@ -0,0 +1,123 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>Length()
+: <a class="el" href="classmingfx_1_1_quaternion.html#af6527ae19f31be2b265b8b8c4b34b77a">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_ray.html#a3c926e2da6dfd1b0a435577617eae984">mingfx::Ray</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a71b90903d00cdc318ea42f593db6dbb9">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a7633dc1625b1f2e6b381438e896b45a3">mingfx::Vector3</a>
+</li>
+<li>Lerp()
+: <a class="el" href="classmingfx_1_1_color.html#abdec9bbfdd82ed75afc45b103c8bbcf4">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_gfx_math.html#ace452fb6b86eb638897b474e9dd51647">mingfx::GfxMath</a>
+, <a class="el" href="classmingfx_1_1_point2.html#a900567ad5e3c0e6de217b52167c49fd6">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a228a1f3754b8ee82b9bb148ce183fc5b">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a5813ffa3c185551eec1927e1daa4cb17">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a8dafc21c64a4964bac27519972d909b6">mingfx::Vector3</a>
+</li>
+<li>light()
+: <a class="el" href="classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316">mingfx::DefaultShader</a>
+</li>
+<li>LightProperties()
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a582ceee332260b06cbf2ec607257aba3">mingfx::DefaultShader::LightProperties</a>
+</li>
+<li>LinkProgram()
+: <a class="el" href="classmingfx_1_1_shader_program.html#ad14c3a9a4ee1eef39f933bc46260c794">mingfx::ShaderProgram</a>
+</li>
+<li>LoadFromOBJ()
+: <a class="el" href="classmingfx_1_1_mesh.html#a8d05faf18ef8d170fc3c2a343075823f">mingfx::Mesh</a>
+</li>
+<li>look()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a2c7546bccfbf986eb9cd0a2784f74859">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_uni_cam.html#a8363576bf0f85c74d80ced697bd73d40">mingfx::UniCam</a>
+</li>
+<li>look_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a96ba4a36029ca8234576cbf2791c5ccb">mingfx::CraftCam</a>
+</li>
+<li>LookAt()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">mingfx::Matrix4</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_m.html b/dev/MinGfx/docs/html/functions_func_m.html
new file mode 100644
index 0000000..7a702cd
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_m.html
@@ -0,0 +1,105 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>material()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#ac8b702a25296cfea15eef1e185333272">mingfx::QuickShapes</a>
+</li>
+<li>MaterialProperties()
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa24361a9c6eb0a87355d0ad00e47dd96">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+<li>Matrix4()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">mingfx::Matrix4</a>
+</li>
+<li>max()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#abac247fedc82467c6b058ed4fe77d2a4">mingfx::AABB</a>
+</li>
+<li>Mesh()
+: <a class="el" href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9">mingfx::Mesh</a>
+</li>
+<li>min()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#a3b46cdd39ffed26b7982d641b53158e6">mingfx::AABB</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_n.html b/dev/MinGfx/docs/html/functions_func_n.html
new file mode 100644
index 0000000..b8ff31f
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_n.html
@@ -0,0 +1,107 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>native_font_size()
+: <a class="el" href="classmingfx_1_1_text_shader.html#a707b2b36547db78d19139575003c8a0d">mingfx::TextShader</a>
+</li>
+<li>Normalize()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a05def5c8eb729037b3d9522711a5c2a2">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a632ddd5b06c48fa0f6f39550e91082c0">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a9b8e9ecbe10477adec527842f62d0dca">mingfx::Vector3</a>
+</li>
+<li>NormalizedDeviceCoordsToPixels()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a6141ec6adc29572ee99ca26cf90e6248">mingfx::GraphicsApp</a>
+</li>
+<li>num_lights()
+: <a class="el" href="classmingfx_1_1_default_shader.html#ac5b779672a983df8aa67c9cbe026e0c2">mingfx::DefaultShader</a>
+</li>
+<li>num_triangles()
+: <a class="el" href="classmingfx_1_1_mesh.html#ab3f3779506e15e3888ccbb8b9b572b8f">mingfx::Mesh</a>
+</li>
+<li>num_vertices()
+: <a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d">mingfx::Mesh</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_o.html b/dev/MinGfx/docs/html/functions_func_o.html
new file mode 100644
index 0000000..117b733
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_o.html
@@ -0,0 +1,208 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_o"></a>- o -</h3><ul>
+<li>OnButtonDown()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#a85afba6e8792636f3c6ba2433db1c52f">mingfx::UniCam</a>
+</li>
+<li>OnButtonUp()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#a2a9431dc3943c8dc485994d88ce2a58a">mingfx::UniCam</a>
+</li>
+<li>OnDrag()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#a33f1b41fcf53ea78ca2b3640902c5bbe">mingfx::UniCam</a>
+</li>
+<li>One()
+: <a class="el" href="classmingfx_1_1_point2.html#a38149d8797bf7406fc34cab0ea5a3ac8">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a2cfcbefe652720779e0d7beff1c86ece">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a5b51e62f03e95d6be1262f037aecf0fd">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#af71b12760516a9cc4837ba9e1dee28db">mingfx::Vector3</a>
+</li>
+<li>OnKeyDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a002560456139e537877d079978db4b01">mingfx::GraphicsApp</a>
+</li>
+<li>OnKeyRepeat()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a1d5831953b37fae615fbd1bf527214b0">mingfx::GraphicsApp</a>
+</li>
+<li>OnKeyUp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a8376ef8eb0840b229a2301f995db3f6c">mingfx::GraphicsApp</a>
+</li>
+<li>OnLeftMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ae12d9b192a2167a71e0c103405addb17">mingfx::GraphicsApp</a>
+</li>
+<li>OnLeftMouseDrag()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a56d350a8b030998709a51630753d509b">mingfx::GraphicsApp</a>
+</li>
+<li>OnLeftMouseUp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a536dbadf0b8a11ef59d7e855ca43f613">mingfx::GraphicsApp</a>
+</li>
+<li>OnMiddleMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a588315d5c45490b440a764af2bc5bd48">mingfx::GraphicsApp</a>
+</li>
+<li>OnMiddleMouseDrag()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ac7628fece754c0ac4875791e19712dc6">mingfx::GraphicsApp</a>
+</li>
+<li>OnMiddleMouseUp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a378b8a102775eeb01a6da9dd68482d08">mingfx::GraphicsApp</a>
+</li>
+<li>OnMouseMove()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f">mingfx::GraphicsApp</a>
+</li>
+<li>OnRightMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c">mingfx::GraphicsApp</a>
+</li>
+<li>OnRightMouseDrag()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7">mingfx::GraphicsApp</a>
+</li>
+<li>OnRightMouseUp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3">mingfx::GraphicsApp</a>
+</li>
+<li>OnSpecialKeyDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#abcf1935e92550bcda311cac62f312952">mingfx::GraphicsApp</a>
+</li>
+<li>OnSpecialKeyRepeat()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a8362762489e287edfa59617a6602db22">mingfx::GraphicsApp</a>
+</li>
+<li>OnSpecialKeyUp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a0deb6da45fc0d3980e44556a861c7a14">mingfx::GraphicsApp</a>
+</li>
+<li>OnWindowResize()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#adafdc4631db256fefce3c4ffdfd5086a">mingfx::GraphicsApp</a>
+</li>
+<li>opengl_id()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#ad4e0faadfe016e6ee501e66fc0244504">mingfx::Texture2D</a>
+</li>
+<li>operator!=()
+: <a class="el" href="classmingfx_1_1_color.html#acf92f9f413cf11639b73dc0d7d431244">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#ab186b0ae1ae669346c0718c2489cd71b">mingfx::Matrix4</a>
+, <a class="el" href="classmingfx_1_1_point2.html#a5b99fcf93a0c6d2b247290f5564f8a84">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#acccf9d3fca27174c18ada3b33209c71e">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#ad72c021d2d1fa543c96ac4a8b360dd2e">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_ray.html#ab62fa6ea1c20870f67c58401aefe3eff">mingfx::Ray</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a1cf3488f1f14a9bf7f6e1278c1c63cdb">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#ab93acb916c310920b9c011159eaaa016">mingfx::Vector3</a>
+</li>
+<li>operator()()
+: <a class="el" href="classmingfx_1_1_matrix4.html#aa324d0cec02c452fb938af28725d5df9">mingfx::Matrix4</a>
+</li>
+<li>operator=()
+: <a class="el" href="classmingfx_1_1_color.html#ae51a066a9bb018e4f050d9b8cc7f330e">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#a9ad8a8bc180ce213956d6d7d3fa19770">mingfx::Matrix4</a>
+, <a class="el" href="classmingfx_1_1_point2.html#afc68153cce7dc528e95cf5ad81c63902">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a8e54b18bfaa39f4b7048b85c9ca43c3d">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#ac5f82b7ed1d620c3c15f57aca028fcdd">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a28c44a323e5bd1a251dee9e00e2e1769">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#aa5b1c05c285fad7f2709f6f351a63608">mingfx::Vector3</a>
+</li>
+<li>operator==()
+: <a class="el" href="classmingfx_1_1_color.html#a5411077527ff2a12d18ce1ae52688cf0">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#a9ec2ee167a450cd7b992384e4cc5bb73">mingfx::Matrix4</a>
+, <a class="el" href="classmingfx_1_1_point2.html#ae8729260293b993bbf3cb31c0a33edfa">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#ab22d5cc4631f26274ada550c90d39699">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#aa89165641485cf9337cd6279df40a403">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_ray.html#a87b07c4f7c9f33189efade7e519b5d9d">mingfx::Ray</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#ad7acc2cf4dcd2eca210899c846bb7dfe">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a85486d0a355417fe4b41fa64146c9e98">mingfx::Vector3</a>
+</li>
+<li>operator[]()
+: <a class="el" href="classmingfx_1_1_color.html#aa879c4f6e90c419a2c121e323ce31500">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#acd64f0db45e255d61dde4f6fa10a4127">mingfx::Matrix4</a>
+, <a class="el" href="classmingfx_1_1_point2.html#af4c0cc334dfbfe8e8068156e6da16542">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a3a586db5b58d5f1fdaddb1e33e84d566">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#a548d09ecd25788241d734240c0dd7ea8">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#ae1fc0ce3ca1af3d0546af32742e13000">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#aa37b1fc4b1df9f72726d981c08cd0d1b">mingfx::Vector3</a>
+</li>
+<li>Origin()
+: <a class="el" href="classmingfx_1_1_point2.html#a24d7a5121fceba01b46f3ba0f6525630">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#aecb7c3137356cd4470851c54a47c7930">mingfx::Point3</a>
+</li>
+<li>origin()
+: <a class="el" href="classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe">mingfx::Ray</a>
+</li>
+<li>Orthonormal()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a9ad5c85784e84fa0a941361eaaae0250">mingfx::Matrix4</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_p.html b/dev/MinGfx/docs/html/functions_func_p.html
new file mode 100644
index 0000000..0c5d771
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_p.html
@@ -0,0 +1,102 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>Perspective()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">mingfx::Matrix4</a>
+</li>
+<li>Pixel()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b">mingfx::Texture2D</a>
+</li>
+<li>PixelsToNormalizedDeviceCoords()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a94b19404e61411ef64c0ddde8ad6c07a">mingfx::GraphicsApp</a>
+</li>
+<li>Point2()
+: <a class="el" href="classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1">mingfx::Point2</a>
+</li>
+<li>Point3()
+: <a class="el" href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">mingfx::Point3</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_q.html b/dev/MinGfx/docs/html/functions_func_q.html
new file mode 100644
index 0000000..bc614d6
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_q.html
@@ -0,0 +1,93 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_q"></a>- q -</h3><ul>
+<li>Quaternion()
+: <a class="el" href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165">mingfx::Quaternion</a>
+</li>
+<li>QuickShapes()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a5764a0953013ece013bf3e2a72e4afa2">mingfx::QuickShapes</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_r.html b/dev/MinGfx/docs/html/functions_func_r.html
new file mode 100644
index 0000000..0d8c4ee
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_r.html
@@ -0,0 +1,129 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>Ray()
+: <a class="el" href="classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda">mingfx::Ray</a>
+</li>
+<li>read_color_data()
+: <a class="el" href="classmingfx_1_1_mesh.html#ac5fc517fd8ea4cea8459d3f4d5d6ced3">mingfx::Mesh</a>
+</li>
+<li>read_normal_data()
+: <a class="el" href="classmingfx_1_1_mesh.html#a439361e454ca63c35f564aed5cd0de65">mingfx::Mesh</a>
+</li>
+<li>read_tex_coords_data()
+: <a class="el" href="classmingfx_1_1_mesh.html#a51aaa8d6a80af46f22ea9dfecd2f0b31">mingfx::Mesh</a>
+</li>
+<li>read_triangle_indices_data()
+: <a class="el" href="classmingfx_1_1_mesh.html#a15d79cbc48a6ef72ef1208d734cc2f8a">mingfx::Mesh</a>
+</li>
+<li>read_vertex_data()
+: <a class="el" href="classmingfx_1_1_mesh.html#ada9371e85aa0b61df79b26fc880b1863">mingfx::Mesh</a>
+</li>
+<li>ReadZValueAtPixel()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a471951dbf45ffa88027cb92707443646">mingfx::GraphicsApp</a>
+</li>
+<li>ResizeWindow()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5">mingfx::GraphicsApp</a>
+</li>
+<li>Rotation()
+: <a class="el" href="classmingfx_1_1_matrix4.html#acf4abaf4a45826f14b435edf80a8d0e0">mingfx::Matrix4</a>
+</li>
+<li>rotation_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a9fe22cc3b933b12674a5b8f1b5c834ac">mingfx::CraftCam</a>
+</li>
+<li>RotationX()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a48615deb30590055c0aa9f207eee7f08">mingfx::Matrix4</a>
+</li>
+<li>RotationY()
+: <a class="el" href="classmingfx_1_1_matrix4.html#aef94f0e9d298a7ba57e0119ef09b71b6">mingfx::Matrix4</a>
+</li>
+<li>RotationZ()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a4bf1dced8875fdc5827b5b8869e9de93">mingfx::Matrix4</a>
+</li>
+<li>Run()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9">mingfx::GraphicsApp</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_s.html b/dev/MinGfx/docs/html/functions_func_s.html
new file mode 100644
index 0000000..aa2955b
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_s.html
@@ -0,0 +1,179 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>Scale()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e">mingfx::Matrix4</a>
+</li>
+<li>screen()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16">mingfx::GraphicsApp</a>
+</li>
+<li>ScreenToDepthPlane()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#aaa6af7c0de01fdad46d48d43efb6aa67">mingfx::GfxMath</a>
+</li>
+<li>ScreenToNearPlane()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0">mingfx::GfxMath</a>
+</li>
+<li>ScreenToWorld()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#a24048d7b688ae46317c3e8de8a701273">mingfx::GfxMath</a>
+</li>
+<li>set()
+: <a class="el" href="classmingfx_1_1_ray.html#a75593293307b4eead15a876bf3597071">mingfx::Ray</a>
+</li>
+<li>set_default_depth()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#a71e0351ac19a18b9c02215a60dc51068">mingfx::UniCam</a>
+</li>
+<li>set_filter_mode()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a4a3b2b550fefdf79f0fb392b04e7b013">mingfx::Texture2D</a>
+</li>
+<li>set_look_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a15092ae5de6920546e3ce79aeb196f44">mingfx::CraftCam</a>
+</li>
+<li>set_rotation_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a352f5a42f6e88d2e599bd5acb42e5831">mingfx::CraftCam</a>
+</li>
+<li>set_translation_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a151fde09d08001ee2a615f25ec1acea7">mingfx::CraftCam</a>
+</li>
+<li>set_user_data()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#ade89d21e799a97e7d82be5d593ee2e4b">mingfx::AABB</a>
+</li>
+<li>set_view_matrix()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_uni_cam.html#a6b17bab82595ca468a3c638512011e5b">mingfx::UniCam</a>
+</li>
+<li>set_wrap_mode()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#aa5cbe3396e4560ec0746e91dbc55bc9f">mingfx::Texture2D</a>
+</li>
+<li>SetColors()
+: <a class="el" href="classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f">mingfx::Mesh</a>
+</li>
+<li>SetIndices()
+: <a class="el" href="classmingfx_1_1_mesh.html#a1f94c9ca7867b65e04f7e02813a06581">mingfx::Mesh</a>
+</li>
+<li>SetInstanceTransforms()
+: <a class="el" href="classmingfx_1_1_mesh.html#a7175238f5874929e2258458b98421d87">mingfx::Mesh</a>
+</li>
+<li>SetLight()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a41e74fb8af72a6b22c72b0916726b6d6">mingfx::DefaultShader</a>
+</li>
+<li>SetNormals()
+: <a class="el" href="classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903">mingfx::Mesh</a>
+</li>
+<li>SetTexCoords()
+: <a class="el" href="classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3">mingfx::Mesh</a>
+</li>
+<li>SetUniform()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a">mingfx::ShaderProgram</a>
+</li>
+<li>SetUniformArray1()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a51cd1c1d194b2f5c07e81d4f579f2f2b">mingfx::ShaderProgram</a>
+</li>
+<li>SetUniformArray2()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a9bab504c74a1c4258258b91afe9a9623">mingfx::ShaderProgram</a>
+</li>
+<li>SetUniformArray3()
+: <a class="el" href="classmingfx_1_1_shader_program.html#ac582a2aa74a83095e0b8e359ce432511">mingfx::ShaderProgram</a>
+</li>
+<li>SetUniformArray4()
+: <a class="el" href="classmingfx_1_1_shader_program.html#ab06ef4682f801fca080a8f67dc6345ba">mingfx::ShaderProgram</a>
+</li>
+<li>SetVertices()
+: <a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6">mingfx::Mesh</a>
+</li>
+<li>ShaderProgram()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700">mingfx::ShaderProgram</a>
+</li>
+<li>Slerp()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a0290914928a2618f7faaa40989113d22">mingfx::Quaternion</a>
+</li>
+<li>StopProgram()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67">mingfx::DefaultShader</a>
+, <a class="el" href="classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da">mingfx::ShaderProgram</a>
+</li>
+<li>SubDeterminant()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a3d9898bfac2510a695df6b033054e481">mingfx::Matrix4</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_t.html b/dev/MinGfx/docs/html/functions_func_t.html
new file mode 100644
index 0000000..a2fff4e
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_t.html
@@ -0,0 +1,126 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>TextExtents()
+: <a class="el" href="classmingfx_1_1_text_shader.html#ac4e9a150311fe6d74e9f6214ebeb6b28">mingfx::TextShader</a>
+</li>
+<li>TextFormat()
+: <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#a2b7d7e2e540c881952b97b8948b49fcb">mingfx::TextShader::TextFormat</a>
+</li>
+<li>TextShader()
+: <a class="el" href="classmingfx_1_1_text_shader.html#a0ec5a6ba22abb3f86c611107925fca67">mingfx::TextShader</a>
+</li>
+<li>Texture2D()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d">mingfx::Texture2D</a>
+</li>
+<li>ToDegrees()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3">mingfx::GfxMath</a>
+</li>
+<li>ToEulerAnglesZYX()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a033f05ed7e7215a5c3c4cd26548c8007">mingfx::Quaternion</a>
+</li>
+<li>ToRadians()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">mingfx::GfxMath</a>
+</li>
+<li>ToUnit()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a3572b35419c51332204adb5bf35f0b03">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a70f9f612a99017bf051e40ebd7fa7f83">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a3caef3c6f24b90730ef70c84ce0e0d71">mingfx::Vector3</a>
+</li>
+<li>ToVector()
+: <a class="el" href="classmingfx_1_1_color.html#ae7371e464c4af7ac93d9edd4c0772c2b">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#a4e9433f0482b5e9688c12398900608db">mingfx::Matrix4</a>
+</li>
+<li>Translation()
+: <a class="el" href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">mingfx::Matrix4</a>
+</li>
+<li>translation_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a93567af7acbae2939d57cfd8a72bcef2">mingfx::CraftCam</a>
+</li>
+<li>Transpose()
+: <a class="el" href="classmingfx_1_1_matrix4.html#afd1030205567d23d4a2d1240d8214850">mingfx::Matrix4</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_u.html b/dev/MinGfx/docs/html/functions_func_u.html
new file mode 100644
index 0000000..32ef019
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_u.html
@@ -0,0 +1,127 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>UniCam()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e">mingfx::UniCam</a>
+</li>
+<li>UnitX()
+: <a class="el" href="classmingfx_1_1_vector2.html#a8ef6e0525ec34aaee9cf35bab098ecdb">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#ae8d822fdea67f63580b4e1f78f5b8922">mingfx::Vector3</a>
+</li>
+<li>UnitY()
+: <a class="el" href="classmingfx_1_1_vector2.html#ab7b3ba42a5a63c512bd7b32fd4cc0db0">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a8d31e433d1ac04aaceea1b1dcd1643df">mingfx::Vector3</a>
+</li>
+<li>UnitZ()
+: <a class="el" href="classmingfx_1_1_vector3.html#a4b696b0d1143d6e30a34a2f889d2ca61">mingfx::Vector3</a>
+</li>
+<li>UpdateFromBytes()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a0783ad70829ef353aa92344d320b107c">mingfx::Texture2D</a>
+</li>
+<li>UpdateFromFloats()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#ad7640f0cbda6398a6bb80202b80dd693">mingfx::Texture2D</a>
+</li>
+<li>UpdateGPUMemory()
+: <a class="el" href="classmingfx_1_1_mesh.html#ac74345bf4b2994de4ee1c509bcc6840e">mingfx::Mesh</a>
+</li>
+<li>UpdateHeight()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#ae3d9c7ea9307dbbadaa4b6e2f9933a7b">mingfx::CraftCam</a>
+</li>
+<li>UpdateSimulation()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa">mingfx::GraphicsApp</a>
+</li>
+<li>UpdateTriangle()
+: <a class="el" href="classmingfx_1_1_mesh.html#a3e0ac86714f6b7c3f62761ef3952a044">mingfx::Mesh</a>
+</li>
+<li>UseProgram()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0">mingfx::DefaultShader</a>
+, <a class="el" href="classmingfx_1_1_shader_program.html#af1c968f1c79f70e183c9d1239d3d205e">mingfx::ShaderProgram</a>
+</li>
+<li>user_data()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#a35def5a4ee2ecd287f5c71436b2c5843">mingfx::AABB</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_v.html b/dev/MinGfx/docs/html/functions_func_v.html
new file mode 100644
index 0000000..e3d1082
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_v.html
@@ -0,0 +1,109 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_v"></a>- v -</h3><ul>
+<li>value_ptr()
+: <a class="el" href="classmingfx_1_1_color.html#aa3a93033db8e00aff817a125eb5b54a0">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#a2b7b30f23f08d70e83c7b7e01945dd3c">mingfx::Matrix4</a>
+, <a class="el" href="classmingfx_1_1_point2.html#a027b2412f1c36242ccb06cf37c7e29bc">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#af0557bdc07452cf335e2b7e04fc0aa3c">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#abca597e756f257dc33838734ae19baf9">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a80ef53519d50a6a6f158f66755c040d1">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#aa7ddfd662e866c019a772ba66eae7331">mingfx::Vector3</a>
+</li>
+<li>Vector2()
+: <a class="el" href="classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f">mingfx::Vector2</a>
+</li>
+<li>Vector3()
+: <a class="el" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">mingfx::Vector3</a>
+</li>
+<li>view_matrix()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3">mingfx::UniCam</a>
+</li>
+<li>Volume()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#a1ea0cf1c4051185b3f4296d20dd330c9">mingfx::AABB</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_w.html b/dev/MinGfx/docs/html/functions_func_w.html
new file mode 100644
index 0000000..83d8abd
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_w.html
@@ -0,0 +1,109 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>w()
+: <a class="el" href="classmingfx_1_1_point2.html#ab00e35eccdc4b7deae8172f5954a86e8">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#abbf85b5749b37869f4c1b98443ebbd9e">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#a8aa53f71892f02c981d98d100a8b57c7">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a267e6749091f23263d1620f801f0a831">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">mingfx::Vector3</a>
+</li>
+<li>width()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869">mingfx::Texture2D</a>
+</li>
+<li>window()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">mingfx::GraphicsApp</a>
+</li>
+<li>window_height()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016">mingfx::GraphicsApp</a>
+</li>
+<li>window_width()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0">mingfx::GraphicsApp</a>
+</li>
+<li>wrap_mode()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a1c8827426f43343c0ad171e181a741ea">mingfx::Texture2D</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_x.html b/dev/MinGfx/docs/html/functions_func_x.html
new file mode 100644
index 0000000..222055f
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_x.html
@@ -0,0 +1,94 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_x"></a>- x -</h3><ul>
+<li>x()
+: <a class="el" href="classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#a85464500e1d3c8ba10f1968426dc24ae">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">mingfx::Vector3</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_y.html b/dev/MinGfx/docs/html/functions_func_y.html
new file mode 100644
index 0000000..c75e688
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_y.html
@@ -0,0 +1,94 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_y"></a>- y -</h3><ul>
+<li>y()
+: <a class="el" href="classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#adb294449db2a80bd11426148592d9e0b">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">mingfx::Vector3</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_z.html b/dev/MinGfx/docs/html/functions_func_z.html
new file mode 100644
index 0000000..da9279e
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_z.html
@@ -0,0 +1,98 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_z"></a>- z -</h3><ul>
+<li>z()
+: <a class="el" href="classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#a75ec001cbbf08cf5c4e1f8978082a55f">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6">mingfx::Vector3</a>
+</li>
+<li>Zero()
+: <a class="el" href="classmingfx_1_1_point2.html#a60a2b348deab631b51caca3eb715461f">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a9983b62979f9ac5a11efea08d9d283ed">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a7cb11f9fe8962ff9092fc1e5736faacf">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a52bf8582baa71e7d6f80c412687d9714">mingfx::Vector3</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_func_~.html b/dev/MinGfx/docs/html/functions_func_~.html
new file mode 100644
index 0000000..537d422
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_func_~.html
@@ -0,0 +1,144 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index__7E"></a>- ~ -</h3><ul>
+<li>~AABB()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#aeb63c176a2f2408e803d9a2f6848eee5">mingfx::AABB</a>
+</li>
+<li>~BVH()
+: <a class="el" href="classmingfx_1_1_b_v_h.html#af81906830adcf4648cc8cf4e214b4269">mingfx::BVH</a>
+</li>
+<li>~Color()
+: <a class="el" href="classmingfx_1_1_color.html#ab1a90432dd7fd7b2adf41d747be85378">mingfx::Color</a>
+</li>
+<li>~CraftCam()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a85ef9bebdd1595be1288bc104245f4ff">mingfx::CraftCam</a>
+</li>
+<li>~DefaultShader()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a0fe7d605d039ecdbf17837bc5bbe0aba">mingfx::DefaultShader</a>
+</li>
+<li>~GraphicsApp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#aab7925c6b844e6bef428feacf4aa9afb">mingfx::GraphicsApp</a>
+</li>
+<li>~Matrix4()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a8853a6b3fd0d08f1def5c9921bd47933">mingfx::Matrix4</a>
+</li>
+<li>~Mesh()
+: <a class="el" href="classmingfx_1_1_mesh.html#ace7b23730dbcb581c4886cf2b9998327">mingfx::Mesh</a>
+</li>
+<li>~Point2()
+: <a class="el" href="classmingfx_1_1_point2.html#a7e5b2dcd7e079bdd00354e7ccf9c5c2a">mingfx::Point2</a>
+</li>
+<li>~Point3()
+: <a class="el" href="classmingfx_1_1_point3.html#aa55aef76986cc7424c2a535d6fd1ab7a">mingfx::Point3</a>
+</li>
+<li>~Quaternion()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a1f9ddd82678ccf51a462e4e03a02c7cc">mingfx::Quaternion</a>
+</li>
+<li>~QuickShapes()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a3a75dde188ec076ea46a6319ed1ca046">mingfx::QuickShapes</a>
+</li>
+<li>~Ray()
+: <a class="el" href="classmingfx_1_1_ray.html#ac20909f30c07d5375598876c6d294625">mingfx::Ray</a>
+</li>
+<li>~ShaderProgram()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a96da0dede354f2511084eeb25428edb4">mingfx::ShaderProgram</a>
+</li>
+<li>~TextShader()
+: <a class="el" href="classmingfx_1_1_text_shader.html#a457f7a42eceb957cdb103664dd864feb">mingfx::TextShader</a>
+</li>
+<li>~Texture2D()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#aab734dbbcf6211507ab65d5bb94a4ef9">mingfx::Texture2D</a>
+</li>
+<li>~UniCam()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#af98022627bcb52dbf54779cfaeb6ff7e">mingfx::UniCam</a>
+</li>
+<li>~Vector2()
+: <a class="el" href="classmingfx_1_1_vector2.html#ac49b009c4b6052ebe71d5cf4ce241b1f">mingfx::Vector2</a>
+</li>
+<li>~Vector3()
+: <a class="el" href="classmingfx_1_1_vector3.html#a6e0d09d774615bcfde5645c22a645969">mingfx::Vector3</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_g.html b/dev/MinGfx/docs/html/functions_g.html
new file mode 100644
index 0000000..40b9b2d
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_g.html
@@ -0,0 +1,90 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_g"></a>- g -</h3><ul>
+<li>GraphicsApp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b">mingfx::GraphicsApp</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_h.html b/dev/MinGfx/docs/html/functions_h.html
new file mode 100644
index 0000000..2f010db
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_h.html
@@ -0,0 +1,106 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>h
+: <a class="el" href="structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398">stbrp_rect</a>
+</li>
+<li>h_align
+: <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#acde55d28b0446e788e6c68b85df83066">mingfx::TextShader::TextFormat</a>
+</li>
+<li>HALF_PI
+: <a class="el" href="classmingfx_1_1_gfx_math.html#ab5ba8ba54257d86dcf95bd2bbeb534c0">mingfx::GfxMath</a>
+</li>
+<li>height()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88">mingfx::Texture2D</a>
+, <a class="el" href="structstbrp__context.html#af3715a6f3faecfb4fac8f6ccbb71f9c7">stbrp_context</a>
+</li>
+<li>heuristic
+: <a class="el" href="structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a">stbrp_context</a>
+</li>
+<li>HorizAlign
+: <a class="el" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c">mingfx::TextShader</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_i.html b/dev/MinGfx/docs/html/functions_i.html
new file mode 100644
index 0000000..1504c56
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_i.html
@@ -0,0 +1,158 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>id
+: <a class="el" href="structstbrp__rect.html#a92da8626bc99df041c0c3bfd01c25f7a">stbrp_rect</a>
+</li>
+<li>iLerp()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#af255bde64498e9b55be466abeea97f4d">mingfx::GfxMath</a>
+</li>
+<li>Init()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3">mingfx::DefaultShader</a>
+, <a class="el" href="classmingfx_1_1_text_shader.html#ad60a8b572adc30dad47e2d163dc603a3">mingfx::TextShader</a>
+</li>
+<li>init_mode
+: <a class="el" href="structstbrp__context.html#a007509feee322404083034e4c2d3dc5d">stbrp_context</a>
+</li>
+<li>InitFromBytes()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#aba57b01065096fe9f6483e8f68622944">mingfx::Texture2D</a>
+</li>
+<li>InitFromFile()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a8eded044ccdf9bd3e1e5bcfe74526bdc">mingfx::Texture2D</a>
+</li>
+<li>InitFromFloats()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#aee8a0aad1795680cb840ffcf544ed7b8">mingfx::Texture2D</a>
+</li>
+<li>InitGraphicsContext()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a04beb462aa04371dc86d807838f999e1">mingfx::GraphicsApp</a>
+</li>
+<li>initialized()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a2eddd93e446ad2079d1c57676655ffbe">mingfx::ShaderProgram</a>
+, <a class="el" href="classmingfx_1_1_texture2_d.html#a15d5c319cf7e012e703668f4d4e7be87">mingfx::Texture2D</a>
+</li>
+<li>InitNanoGUI()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a">mingfx::GraphicsApp</a>
+</li>
+<li>InitOpenGL()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3">mingfx::GraphicsApp</a>
+</li>
+<li>IntersectAABB()
+: <a class="el" href="classmingfx_1_1_ray.html#a57d3ee10518ed361ae02d9cbdef842b7">mingfx::Ray</a>
+</li>
+<li>IntersectAndReturnUserData()
+: <a class="el" href="classmingfx_1_1_b_v_h.html#afad54f50a29e8b3aace6cdec5c792c56">mingfx::BVH</a>
+</li>
+<li>IntersectMesh()
+: <a class="el" href="classmingfx_1_1_ray.html#a79caa1df0839d13339575d3d5527ae6f">mingfx::Ray</a>
+</li>
+<li>IntersectPlane()
+: <a class="el" href="classmingfx_1_1_ray.html#a8707604031eb9437c449345d85d69d24">mingfx::Ray</a>
+</li>
+<li>IntersectQuad()
+: <a class="el" href="classmingfx_1_1_ray.html#a37689523a0b73d3d3288ce60bdcb7ae3">mingfx::Ray</a>
+</li>
+<li>IntersectSphere()
+: <a class="el" href="classmingfx_1_1_ray.html#a970c7dbc19167be625967fabfb39b4ff">mingfx::Ray</a>
+</li>
+<li>IntersectTriangle()
+: <a class="el" href="classmingfx_1_1_ray.html#a1a6130616c4e4eebe9d09181b0f8b734">mingfx::Ray</a>
+</li>
+<li>Inverse()
+: <a class="el" href="classmingfx_1_1_matrix4.html#ab3f360906e15730eee621826b5f0bbc5">mingfx::Matrix4</a>
+</li>
+<li>IsKeyDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a60688614e5dfeaabf57f8825cdaa08ac">mingfx::GraphicsApp</a>
+</li>
+<li>IsLeftMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a5b78d79192180a6ef5271d2a2b2d1cc7">mingfx::GraphicsApp</a>
+</li>
+<li>IsMiddleMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a941f7598400073bfa93aa194a3773434">mingfx::GraphicsApp</a>
+</li>
+<li>IsRightMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a4aa30e3d33731178a9162454a81be08d">mingfx::GraphicsApp</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_l.html b/dev/MinGfx/docs/html/functions_l.html
new file mode 100644
index 0000000..cf3d91b
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_l.html
@@ -0,0 +1,126 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>Length()
+: <a class="el" href="classmingfx_1_1_quaternion.html#af6527ae19f31be2b265b8b8c4b34b77a">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_ray.html#a3c926e2da6dfd1b0a435577617eae984">mingfx::Ray</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a71b90903d00cdc318ea42f593db6dbb9">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a7633dc1625b1f2e6b381438e896b45a3">mingfx::Vector3</a>
+</li>
+<li>Lerp()
+: <a class="el" href="classmingfx_1_1_color.html#abdec9bbfdd82ed75afc45b103c8bbcf4">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_gfx_math.html#ace452fb6b86eb638897b474e9dd51647">mingfx::GfxMath</a>
+, <a class="el" href="classmingfx_1_1_point2.html#a900567ad5e3c0e6de217b52167c49fd6">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a228a1f3754b8ee82b9bb148ce183fc5b">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a5813ffa3c185551eec1927e1daa4cb17">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a8dafc21c64a4964bac27519972d909b6">mingfx::Vector3</a>
+</li>
+<li>light()
+: <a class="el" href="classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316">mingfx::DefaultShader</a>
+</li>
+<li>LightProperties()
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a582ceee332260b06cbf2ec607257aba3">mingfx::DefaultShader::LightProperties</a>
+</li>
+<li>LinesType
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603">mingfx::QuickShapes</a>
+</li>
+<li>LinkProgram()
+: <a class="el" href="classmingfx_1_1_shader_program.html#ad14c3a9a4ee1eef39f933bc46260c794">mingfx::ShaderProgram</a>
+</li>
+<li>LoadFromOBJ()
+: <a class="el" href="classmingfx_1_1_mesh.html#a8d05faf18ef8d170fc3c2a343075823f">mingfx::Mesh</a>
+</li>
+<li>look()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a2c7546bccfbf986eb9cd0a2784f74859">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_uni_cam.html#a8363576bf0f85c74d80ced697bd73d40">mingfx::UniCam</a>
+</li>
+<li>look_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a96ba4a36029ca8234576cbf2791c5ccb">mingfx::CraftCam</a>
+</li>
+<li>LookAt()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">mingfx::Matrix4</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_m.html b/dev/MinGfx/docs/html/functions_m.html
new file mode 100644
index 0000000..8bb9d7d
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_m.html
@@ -0,0 +1,108 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>material()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#ac8b702a25296cfea15eef1e185333272">mingfx::QuickShapes</a>
+</li>
+<li>MaterialProperties()
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa24361a9c6eb0a87355d0ad00e47dd96">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+<li>Matrix4()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">mingfx::Matrix4</a>
+</li>
+<li>max()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#abac247fedc82467c6b058ed4fe77d2a4">mingfx::AABB</a>
+</li>
+<li>MAX_LIGHTS
+: <a class="el" href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24">mingfx::DefaultShader</a>
+</li>
+<li>Mesh()
+: <a class="el" href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9">mingfx::Mesh</a>
+</li>
+<li>min()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#a3b46cdd39ffed26b7982d641b53158e6">mingfx::AABB</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_n.html b/dev/MinGfx/docs/html/functions_n.html
new file mode 100644
index 0000000..2b572fb
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_n.html
@@ -0,0 +1,113 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>native_font_size()
+: <a class="el" href="classmingfx_1_1_text_shader.html#a707b2b36547db78d19139575003c8a0d">mingfx::TextShader</a>
+</li>
+<li>next
+: <a class="el" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">stbrp_node</a>
+</li>
+<li>Normalize()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a05def5c8eb729037b3d9522711a5c2a2">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a632ddd5b06c48fa0f6f39550e91082c0">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a9b8e9ecbe10477adec527842f62d0dca">mingfx::Vector3</a>
+</li>
+<li>NormalizedDeviceCoordsToPixels()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a6141ec6adc29572ee99ca26cf90e6248">mingfx::GraphicsApp</a>
+</li>
+<li>num_lights()
+: <a class="el" href="classmingfx_1_1_default_shader.html#ac5b779672a983df8aa67c9cbe026e0c2">mingfx::DefaultShader</a>
+</li>
+<li>num_nodes
+: <a class="el" href="structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58">stbrp_context</a>
+</li>
+<li>num_triangles()
+: <a class="el" href="classmingfx_1_1_mesh.html#ab3f3779506e15e3888ccbb8b9b572b8f">mingfx::Mesh</a>
+</li>
+<li>num_vertices()
+: <a class="el" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d">mingfx::Mesh</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_o.html b/dev/MinGfx/docs/html/functions_o.html
new file mode 100644
index 0000000..b8fb50c
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_o.html
@@ -0,0 +1,211 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_o"></a>- o -</h3><ul>
+<li>OnButtonDown()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#a85afba6e8792636f3c6ba2433db1c52f">mingfx::UniCam</a>
+</li>
+<li>OnButtonUp()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#a2a9431dc3943c8dc485994d88ce2a58a">mingfx::UniCam</a>
+</li>
+<li>OnDrag()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#a33f1b41fcf53ea78ca2b3640902c5bbe">mingfx::UniCam</a>
+</li>
+<li>One()
+: <a class="el" href="classmingfx_1_1_point2.html#a38149d8797bf7406fc34cab0ea5a3ac8">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a2cfcbefe652720779e0d7beff1c86ece">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a5b51e62f03e95d6be1262f037aecf0fd">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#af71b12760516a9cc4837ba9e1dee28db">mingfx::Vector3</a>
+</li>
+<li>OnKeyDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a002560456139e537877d079978db4b01">mingfx::GraphicsApp</a>
+</li>
+<li>OnKeyRepeat()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a1d5831953b37fae615fbd1bf527214b0">mingfx::GraphicsApp</a>
+</li>
+<li>OnKeyUp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a8376ef8eb0840b229a2301f995db3f6c">mingfx::GraphicsApp</a>
+</li>
+<li>OnLeftMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ae12d9b192a2167a71e0c103405addb17">mingfx::GraphicsApp</a>
+</li>
+<li>OnLeftMouseDrag()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a56d350a8b030998709a51630753d509b">mingfx::GraphicsApp</a>
+</li>
+<li>OnLeftMouseUp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a536dbadf0b8a11ef59d7e855ca43f613">mingfx::GraphicsApp</a>
+</li>
+<li>OnMiddleMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a588315d5c45490b440a764af2bc5bd48">mingfx::GraphicsApp</a>
+</li>
+<li>OnMiddleMouseDrag()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ac7628fece754c0ac4875791e19712dc6">mingfx::GraphicsApp</a>
+</li>
+<li>OnMiddleMouseUp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a378b8a102775eeb01a6da9dd68482d08">mingfx::GraphicsApp</a>
+</li>
+<li>OnMouseMove()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f">mingfx::GraphicsApp</a>
+</li>
+<li>OnRightMouseDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c">mingfx::GraphicsApp</a>
+</li>
+<li>OnRightMouseDrag()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7">mingfx::GraphicsApp</a>
+</li>
+<li>OnRightMouseUp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3">mingfx::GraphicsApp</a>
+</li>
+<li>OnSpecialKeyDown()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#abcf1935e92550bcda311cac62f312952">mingfx::GraphicsApp</a>
+</li>
+<li>OnSpecialKeyRepeat()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a8362762489e287edfa59617a6602db22">mingfx::GraphicsApp</a>
+</li>
+<li>OnSpecialKeyUp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a0deb6da45fc0d3980e44556a861c7a14">mingfx::GraphicsApp</a>
+</li>
+<li>OnWindowResize()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#adafdc4631db256fefce3c4ffdfd5086a">mingfx::GraphicsApp</a>
+</li>
+<li>opengl_id()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#ad4e0faadfe016e6ee501e66fc0244504">mingfx::Texture2D</a>
+</li>
+<li>operator!=()
+: <a class="el" href="classmingfx_1_1_color.html#acf92f9f413cf11639b73dc0d7d431244">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#ab186b0ae1ae669346c0718c2489cd71b">mingfx::Matrix4</a>
+, <a class="el" href="classmingfx_1_1_point2.html#a5b99fcf93a0c6d2b247290f5564f8a84">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#acccf9d3fca27174c18ada3b33209c71e">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#ad72c021d2d1fa543c96ac4a8b360dd2e">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_ray.html#ab62fa6ea1c20870f67c58401aefe3eff">mingfx::Ray</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a1cf3488f1f14a9bf7f6e1278c1c63cdb">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#ab93acb916c310920b9c011159eaaa016">mingfx::Vector3</a>
+</li>
+<li>operator()()
+: <a class="el" href="classmingfx_1_1_matrix4.html#aa324d0cec02c452fb938af28725d5df9">mingfx::Matrix4</a>
+</li>
+<li>operator+
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#a60e301aa632dd49eccdc27bab7c6d231">mingfx::AABB</a>
+</li>
+<li>operator=()
+: <a class="el" href="classmingfx_1_1_color.html#ae51a066a9bb018e4f050d9b8cc7f330e">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#a9ad8a8bc180ce213956d6d7d3fa19770">mingfx::Matrix4</a>
+, <a class="el" href="classmingfx_1_1_point2.html#afc68153cce7dc528e95cf5ad81c63902">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a8e54b18bfaa39f4b7048b85c9ca43c3d">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#ac5f82b7ed1d620c3c15f57aca028fcdd">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a28c44a323e5bd1a251dee9e00e2e1769">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#aa5b1c05c285fad7f2709f6f351a63608">mingfx::Vector3</a>
+</li>
+<li>operator==()
+: <a class="el" href="classmingfx_1_1_color.html#a5411077527ff2a12d18ce1ae52688cf0">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#a9ec2ee167a450cd7b992384e4cc5bb73">mingfx::Matrix4</a>
+, <a class="el" href="classmingfx_1_1_point2.html#ae8729260293b993bbf3cb31c0a33edfa">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#ab22d5cc4631f26274ada550c90d39699">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#aa89165641485cf9337cd6279df40a403">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_ray.html#a87b07c4f7c9f33189efade7e519b5d9d">mingfx::Ray</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#ad7acc2cf4dcd2eca210899c846bb7dfe">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a85486d0a355417fe4b41fa64146c9e98">mingfx::Vector3</a>
+</li>
+<li>operator[]()
+: <a class="el" href="classmingfx_1_1_color.html#aa879c4f6e90c419a2c121e323ce31500">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#acd64f0db45e255d61dde4f6fa10a4127">mingfx::Matrix4</a>
+, <a class="el" href="classmingfx_1_1_point2.html#af4c0cc334dfbfe8e8068156e6da16542">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a3a586db5b58d5f1fdaddb1e33e84d566">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#a548d09ecd25788241d734240c0dd7ea8">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#ae1fc0ce3ca1af3d0546af32742e13000">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#aa37b1fc4b1df9f72726d981c08cd0d1b">mingfx::Vector3</a>
+</li>
+<li>Origin()
+: <a class="el" href="classmingfx_1_1_point2.html#a24d7a5121fceba01b46f3ba0f6525630">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#aecb7c3137356cd4470851c54a47c7930">mingfx::Point3</a>
+</li>
+<li>origin()
+: <a class="el" href="classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe">mingfx::Ray</a>
+</li>
+<li>Orthonormal()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a9ad5c85784e84fa0a941361eaaae0250">mingfx::Matrix4</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_p.html b/dev/MinGfx/docs/html/functions_p.html
new file mode 100644
index 0000000..f2c3c17
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_p.html
@@ -0,0 +1,108 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>Perspective()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">mingfx::Matrix4</a>
+</li>
+<li>PI
+: <a class="el" href="classmingfx_1_1_gfx_math.html#aaa14e60a5f7c158db443f8b6d87958b4">mingfx::GfxMath</a>
+</li>
+<li>Pixel()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b">mingfx::Texture2D</a>
+</li>
+<li>PixelsToNormalizedDeviceCoords()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a94b19404e61411ef64c0ddde8ad6c07a">mingfx::GraphicsApp</a>
+</li>
+<li>Point2()
+: <a class="el" href="classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1">mingfx::Point2</a>
+</li>
+<li>Point3()
+: <a class="el" href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">mingfx::Point3</a>
+</li>
+<li>position
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a160b58a0e70294008b9dac8eb6291d3e">mingfx::DefaultShader::LightProperties</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_q.html b/dev/MinGfx/docs/html/functions_q.html
new file mode 100644
index 0000000..cc25a2a
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_q.html
@@ -0,0 +1,93 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_q"></a>- q -</h3><ul>
+<li>Quaternion()
+: <a class="el" href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165">mingfx::Quaternion</a>
+</li>
+<li>QuickShapes()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a5764a0953013ece013bf3e2a72e4afa2">mingfx::QuickShapes</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_r.html b/dev/MinGfx/docs/html/functions_r.html
new file mode 100644
index 0000000..a0d84bf
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_r.html
@@ -0,0 +1,129 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>Ray()
+: <a class="el" href="classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda">mingfx::Ray</a>
+</li>
+<li>read_color_data()
+: <a class="el" href="classmingfx_1_1_mesh.html#ac5fc517fd8ea4cea8459d3f4d5d6ced3">mingfx::Mesh</a>
+</li>
+<li>read_normal_data()
+: <a class="el" href="classmingfx_1_1_mesh.html#a439361e454ca63c35f564aed5cd0de65">mingfx::Mesh</a>
+</li>
+<li>read_tex_coords_data()
+: <a class="el" href="classmingfx_1_1_mesh.html#a51aaa8d6a80af46f22ea9dfecd2f0b31">mingfx::Mesh</a>
+</li>
+<li>read_triangle_indices_data()
+: <a class="el" href="classmingfx_1_1_mesh.html#a15d79cbc48a6ef72ef1208d734cc2f8a">mingfx::Mesh</a>
+</li>
+<li>read_vertex_data()
+: <a class="el" href="classmingfx_1_1_mesh.html#ada9371e85aa0b61df79b26fc880b1863">mingfx::Mesh</a>
+</li>
+<li>ReadZValueAtPixel()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a471951dbf45ffa88027cb92707443646">mingfx::GraphicsApp</a>
+</li>
+<li>ResizeWindow()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5">mingfx::GraphicsApp</a>
+</li>
+<li>Rotation()
+: <a class="el" href="classmingfx_1_1_matrix4.html#acf4abaf4a45826f14b435edf80a8d0e0">mingfx::Matrix4</a>
+</li>
+<li>rotation_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a9fe22cc3b933b12674a5b8f1b5c834ac">mingfx::CraftCam</a>
+</li>
+<li>RotationX()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a48615deb30590055c0aa9f207eee7f08">mingfx::Matrix4</a>
+</li>
+<li>RotationY()
+: <a class="el" href="classmingfx_1_1_matrix4.html#aef94f0e9d298a7ba57e0119ef09b71b6">mingfx::Matrix4</a>
+</li>
+<li>RotationZ()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a4bf1dced8875fdc5827b5b8869e9de93">mingfx::Matrix4</a>
+</li>
+<li>Run()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9">mingfx::GraphicsApp</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_rela.html b/dev/MinGfx/docs/html/functions_rela.html
new file mode 100644
index 0000000..b29d900
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_rela.html
@@ -0,0 +1,88 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Related Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>operator+
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#a60e301aa632dd49eccdc27bab7c6d231">mingfx::AABB</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_s.html b/dev/MinGfx/docs/html/functions_s.html
new file mode 100644
index 0000000..6d5c357
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_s.html
@@ -0,0 +1,194 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>Scale()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e">mingfx::Matrix4</a>
+</li>
+<li>screen()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16">mingfx::GraphicsApp</a>
+</li>
+<li>ScreenToDepthPlane()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#aaa6af7c0de01fdad46d48d43efb6aa67">mingfx::GfxMath</a>
+</li>
+<li>ScreenToNearPlane()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0">mingfx::GfxMath</a>
+</li>
+<li>ScreenToWorld()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#a24048d7b688ae46317c3e8de8a701273">mingfx::GfxMath</a>
+</li>
+<li>set()
+: <a class="el" href="classmingfx_1_1_ray.html#a75593293307b4eead15a876bf3597071">mingfx::Ray</a>
+</li>
+<li>set_default_depth()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#a71e0351ac19a18b9c02215a60dc51068">mingfx::UniCam</a>
+</li>
+<li>set_filter_mode()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a4a3b2b550fefdf79f0fb392b04e7b013">mingfx::Texture2D</a>
+</li>
+<li>set_look_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a15092ae5de6920546e3ce79aeb196f44">mingfx::CraftCam</a>
+</li>
+<li>set_rotation_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a352f5a42f6e88d2e599bd5acb42e5831">mingfx::CraftCam</a>
+</li>
+<li>set_translation_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a151fde09d08001ee2a615f25ec1acea7">mingfx::CraftCam</a>
+</li>
+<li>set_user_data()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#ade89d21e799a97e7d82be5d593ee2e4b">mingfx::AABB</a>
+</li>
+<li>set_view_matrix()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_uni_cam.html#a6b17bab82595ca468a3c638512011e5b">mingfx::UniCam</a>
+</li>
+<li>set_wrap_mode()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#aa5cbe3396e4560ec0746e91dbc55bc9f">mingfx::Texture2D</a>
+</li>
+<li>SetColors()
+: <a class="el" href="classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f">mingfx::Mesh</a>
+</li>
+<li>SetIndices()
+: <a class="el" href="classmingfx_1_1_mesh.html#a1f94c9ca7867b65e04f7e02813a06581">mingfx::Mesh</a>
+</li>
+<li>SetInstanceTransforms()
+: <a class="el" href="classmingfx_1_1_mesh.html#a7175238f5874929e2258458b98421d87">mingfx::Mesh</a>
+</li>
+<li>SetLight()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a41e74fb8af72a6b22c72b0916726b6d6">mingfx::DefaultShader</a>
+</li>
+<li>SetNormals()
+: <a class="el" href="classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903">mingfx::Mesh</a>
+</li>
+<li>SetTexCoords()
+: <a class="el" href="classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3">mingfx::Mesh</a>
+</li>
+<li>SetUniform()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a">mingfx::ShaderProgram</a>
+</li>
+<li>SetUniformArray1()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a51cd1c1d194b2f5c07e81d4f579f2f2b">mingfx::ShaderProgram</a>
+</li>
+<li>SetUniformArray2()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a9bab504c74a1c4258258b91afe9a9623">mingfx::ShaderProgram</a>
+</li>
+<li>SetUniformArray3()
+: <a class="el" href="classmingfx_1_1_shader_program.html#ac582a2aa74a83095e0b8e359ce432511">mingfx::ShaderProgram</a>
+</li>
+<li>SetUniformArray4()
+: <a class="el" href="classmingfx_1_1_shader_program.html#ab06ef4682f801fca080a8f67dc6345ba">mingfx::ShaderProgram</a>
+</li>
+<li>SetVertices()
+: <a class="el" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6">mingfx::Mesh</a>
+</li>
+<li>ShaderProgram()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700">mingfx::ShaderProgram</a>
+</li>
+<li>shinniness
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad77e4c78a2bf60776c673b91bc4c8a13">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+<li>size
+: <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#aeecda817624276f0cfb812ddcdbbc2f0">mingfx::TextShader::TextFormat</a>
+</li>
+<li>Slerp()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a0290914928a2618f7faaa40989113d22">mingfx::Quaternion</a>
+</li>
+<li>specular_intensity
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#abef7666629dbb9da661b163e0584c9a4">mingfx::DefaultShader::LightProperties</a>
+</li>
+<li>specular_reflectance
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#acfd78796e08f527a24cce3c1e206148c">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+<li>StopProgram()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67">mingfx::DefaultShader</a>
+, <a class="el" href="classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da">mingfx::ShaderProgram</a>
+</li>
+<li>SubDeterminant()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a3d9898bfac2510a695df6b033054e481">mingfx::Matrix4</a>
+</li>
+<li>surface_texture
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ae26eed46a279c73e947880858763514e">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_t.html b/dev/MinGfx/docs/html/functions_t.html
new file mode 100644
index 0000000..5ab26a1
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_t.html
@@ -0,0 +1,129 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>TextExtents()
+: <a class="el" href="classmingfx_1_1_text_shader.html#ac4e9a150311fe6d74e9f6214ebeb6b28">mingfx::TextShader</a>
+</li>
+<li>TextFormat()
+: <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#a2b7d7e2e540c881952b97b8948b49fcb">mingfx::TextShader::TextFormat</a>
+</li>
+<li>TextShader()
+: <a class="el" href="classmingfx_1_1_text_shader.html#a0ec5a6ba22abb3f86c611107925fca67">mingfx::TextShader</a>
+</li>
+<li>Texture2D()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d">mingfx::Texture2D</a>
+</li>
+<li>ToDegrees()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3">mingfx::GfxMath</a>
+</li>
+<li>ToEulerAnglesZYX()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a033f05ed7e7215a5c3c4cd26548c8007">mingfx::Quaternion</a>
+</li>
+<li>ToRadians()
+: <a class="el" href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">mingfx::GfxMath</a>
+</li>
+<li>ToUnit()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a3572b35419c51332204adb5bf35f0b03">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a70f9f612a99017bf051e40ebd7fa7f83">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a3caef3c6f24b90730ef70c84ce0e0d71">mingfx::Vector3</a>
+</li>
+<li>ToVector()
+: <a class="el" href="classmingfx_1_1_color.html#ae7371e464c4af7ac93d9edd4c0772c2b">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#a4e9433f0482b5e9688c12398900608db">mingfx::Matrix4</a>
+</li>
+<li>Translation()
+: <a class="el" href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">mingfx::Matrix4</a>
+</li>
+<li>translation_scale()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a93567af7acbae2939d57cfd8a72bcef2">mingfx::CraftCam</a>
+</li>
+<li>Transpose()
+: <a class="el" href="classmingfx_1_1_matrix4.html#afd1030205567d23d4a2d1240d8214850">mingfx::Matrix4</a>
+</li>
+<li>TWO_PI
+: <a class="el" href="classmingfx_1_1_gfx_math.html#a0e5c7562116babf11c61f4c7f20f8b69">mingfx::GfxMath</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_u.html b/dev/MinGfx/docs/html/functions_u.html
new file mode 100644
index 0000000..4ffce53
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_u.html
@@ -0,0 +1,127 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>UniCam()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e">mingfx::UniCam</a>
+</li>
+<li>UnitX()
+: <a class="el" href="classmingfx_1_1_vector2.html#a8ef6e0525ec34aaee9cf35bab098ecdb">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#ae8d822fdea67f63580b4e1f78f5b8922">mingfx::Vector3</a>
+</li>
+<li>UnitY()
+: <a class="el" href="classmingfx_1_1_vector2.html#ab7b3ba42a5a63c512bd7b32fd4cc0db0">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a8d31e433d1ac04aaceea1b1dcd1643df">mingfx::Vector3</a>
+</li>
+<li>UnitZ()
+: <a class="el" href="classmingfx_1_1_vector3.html#a4b696b0d1143d6e30a34a2f889d2ca61">mingfx::Vector3</a>
+</li>
+<li>UpdateFromBytes()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a0783ad70829ef353aa92344d320b107c">mingfx::Texture2D</a>
+</li>
+<li>UpdateFromFloats()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#ad7640f0cbda6398a6bb80202b80dd693">mingfx::Texture2D</a>
+</li>
+<li>UpdateGPUMemory()
+: <a class="el" href="classmingfx_1_1_mesh.html#ac74345bf4b2994de4ee1c509bcc6840e">mingfx::Mesh</a>
+</li>
+<li>UpdateHeight()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#ae3d9c7ea9307dbbadaa4b6e2f9933a7b">mingfx::CraftCam</a>
+</li>
+<li>UpdateSimulation()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa">mingfx::GraphicsApp</a>
+</li>
+<li>UpdateTriangle()
+: <a class="el" href="classmingfx_1_1_mesh.html#a3e0ac86714f6b7c3f62761ef3952a044">mingfx::Mesh</a>
+</li>
+<li>UseProgram()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0">mingfx::DefaultShader</a>
+, <a class="el" href="classmingfx_1_1_shader_program.html#af1c968f1c79f70e183c9d1239d3d205e">mingfx::ShaderProgram</a>
+</li>
+<li>user_data()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#a35def5a4ee2ecd287f5c71436b2c5843">mingfx::AABB</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_v.html b/dev/MinGfx/docs/html/functions_v.html
new file mode 100644
index 0000000..13a6cda
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_v.html
@@ -0,0 +1,115 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_v"></a>- v -</h3><ul>
+<li>v_align
+: <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#a8455382a6829022020eb307ae9168bd7">mingfx::TextShader::TextFormat</a>
+</li>
+<li>value_ptr()
+: <a class="el" href="classmingfx_1_1_color.html#aa3a93033db8e00aff817a125eb5b54a0">mingfx::Color</a>
+, <a class="el" href="classmingfx_1_1_matrix4.html#a2b7b30f23f08d70e83c7b7e01945dd3c">mingfx::Matrix4</a>
+, <a class="el" href="classmingfx_1_1_point2.html#a027b2412f1c36242ccb06cf37c7e29bc">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#af0557bdc07452cf335e2b7e04fc0aa3c">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#abca597e756f257dc33838734ae19baf9">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a80ef53519d50a6a6f158f66755c040d1">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#aa7ddfd662e866c019a772ba66eae7331">mingfx::Vector3</a>
+</li>
+<li>Vector2()
+: <a class="el" href="classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f">mingfx::Vector2</a>
+</li>
+<li>Vector3()
+: <a class="el" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">mingfx::Vector3</a>
+</li>
+<li>VertAlign
+: <a class="el" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a">mingfx::TextShader</a>
+</li>
+<li>view_matrix()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36">mingfx::CraftCam</a>
+, <a class="el" href="classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3">mingfx::UniCam</a>
+</li>
+<li>Volume()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#a1ea0cf1c4051185b3f4296d20dd330c9">mingfx::AABB</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_vars.html b/dev/MinGfx/docs/html/functions_vars.html
new file mode 100644
index 0000000..123e549
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_vars.html
@@ -0,0 +1,248 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>active_head
+: <a class="el" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">stbrp_context</a>
+</li>
+<li>align
+: <a class="el" href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481">stbrp_context</a>
+</li>
+<li>ambient_intensity
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a226c173b193459af291687dd45280fbb">mingfx::DefaultShader::LightProperties</a>
+</li>
+<li>ambient_reflectance
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad4db9a1b0636db84f57f022c51ce7657">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+</ul>
+
+
+<h3><a id="index_c"></a>- c -</h3><ul>
+<li>color
+: <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#af0483874ac3fcea58b6ff99ef6644ff7">mingfx::TextShader::TextFormat</a>
+</li>
+</ul>
+
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>diffuse_intensity
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a9a010057c15e3db5661b07a03d5176d7">mingfx::DefaultShader::LightProperties</a>
+</li>
+<li>diffuse_reflectance
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#aa7b75f95a45d7a1030c297192b14014f">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+</ul>
+
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>extra
+: <a class="el" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">stbrp_context</a>
+</li>
+</ul>
+
+
+<h3><a id="index_f"></a>- f -</h3><ul>
+<li>free_head
+: <a class="el" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">stbrp_context</a>
+</li>
+</ul>
+
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>h
+: <a class="el" href="structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398">stbrp_rect</a>
+</li>
+<li>h_align
+: <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#acde55d28b0446e788e6c68b85df83066">mingfx::TextShader::TextFormat</a>
+</li>
+<li>HALF_PI
+: <a class="el" href="classmingfx_1_1_gfx_math.html#ab5ba8ba54257d86dcf95bd2bbeb534c0">mingfx::GfxMath</a>
+</li>
+<li>height
+: <a class="el" href="structstbrp__context.html#af3715a6f3faecfb4fac8f6ccbb71f9c7">stbrp_context</a>
+</li>
+<li>heuristic
+: <a class="el" href="structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a">stbrp_context</a>
+</li>
+</ul>
+
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>id
+: <a class="el" href="structstbrp__rect.html#a92da8626bc99df041c0c3bfd01c25f7a">stbrp_rect</a>
+</li>
+<li>init_mode
+: <a class="el" href="structstbrp__context.html#a007509feee322404083034e4c2d3dc5d">stbrp_context</a>
+</li>
+</ul>
+
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>MAX_LIGHTS
+: <a class="el" href="classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24">mingfx::DefaultShader</a>
+</li>
+</ul>
+
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>next
+: <a class="el" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">stbrp_node</a>
+</li>
+<li>num_nodes
+: <a class="el" href="structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58">stbrp_context</a>
+</li>
+</ul>
+
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>PI
+: <a class="el" href="classmingfx_1_1_gfx_math.html#aaa14e60a5f7c158db443f8b6d87958b4">mingfx::GfxMath</a>
+</li>
+<li>position
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#a160b58a0e70294008b9dac8eb6291d3e">mingfx::DefaultShader::LightProperties</a>
+</li>
+</ul>
+
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>shinniness
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ad77e4c78a2bf60776c673b91bc4c8a13">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+<li>size
+: <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#aeecda817624276f0cfb812ddcdbbc2f0">mingfx::TextShader::TextFormat</a>
+</li>
+<li>specular_intensity
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_light_properties.html#abef7666629dbb9da661b163e0584c9a4">mingfx::DefaultShader::LightProperties</a>
+</li>
+<li>specular_reflectance
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#acfd78796e08f527a24cce3c1e206148c">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+<li>surface_texture
+: <a class="el" href="classmingfx_1_1_default_shader_1_1_material_properties.html#ae26eed46a279c73e947880858763514e">mingfx::DefaultShader::MaterialProperties</a>
+</li>
+</ul>
+
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>TWO_PI
+: <a class="el" href="classmingfx_1_1_gfx_math.html#a0e5c7562116babf11c61f4c7f20f8b69">mingfx::GfxMath</a>
+</li>
+</ul>
+
+
+<h3><a id="index_v"></a>- v -</h3><ul>
+<li>v_align
+: <a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html#a8455382a6829022020eb307ae9168bd7">mingfx::TextShader::TextFormat</a>
+</li>
+</ul>
+
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>w
+: <a class="el" href="structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5">stbrp_rect</a>
+</li>
+<li>was_packed
+: <a class="el" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">stbrp_rect</a>
+</li>
+<li>width
+: <a class="el" href="structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2">stbrp_context</a>
+</li>
+</ul>
+
+
+<h3><a id="index_x"></a>- x -</h3><ul>
+<li>x
+: <a class="el" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">stbrp_node</a>
+, <a class="el" href="structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18">stbrp_rect</a>
+</li>
+</ul>
+
+
+<h3><a id="index_y"></a>- y -</h3><ul>
+<li>y
+: <a class="el" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">stbrp_node</a>
+, <a class="el" href="structstbrp__rect.html#ae3034c1fbf86043b568f5a4dddf946fa">stbrp_rect</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_w.html b/dev/MinGfx/docs/html/functions_w.html
new file mode 100644
index 0000000..e1e4f81
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_w.html
@@ -0,0 +1,114 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>w()
+: <a class="el" href="classmingfx_1_1_point2.html#ab00e35eccdc4b7deae8172f5954a86e8">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#abbf85b5749b37869f4c1b98443ebbd9e">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#a8aa53f71892f02c981d98d100a8b57c7">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a267e6749091f23263d1620f801f0a831">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">mingfx::Vector3</a>
+, <a class="el" href="structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5">stbrp_rect</a>
+</li>
+<li>was_packed
+: <a class="el" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">stbrp_rect</a>
+</li>
+<li>width()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869">mingfx::Texture2D</a>
+, <a class="el" href="structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2">stbrp_context</a>
+</li>
+<li>window()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">mingfx::GraphicsApp</a>
+</li>
+<li>window_height()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016">mingfx::GraphicsApp</a>
+</li>
+<li>window_width()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0">mingfx::GraphicsApp</a>
+</li>
+<li>wrap_mode()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#a1c8827426f43343c0ad171e181a741ea">mingfx::Texture2D</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_x.html b/dev/MinGfx/docs/html/functions_x.html
new file mode 100644
index 0000000..b0d8f5e
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_x.html
@@ -0,0 +1,96 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_x"></a>- x -</h3><ul>
+<li>x()
+: <a class="el" href="classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#a85464500e1d3c8ba10f1968426dc24ae">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">mingfx::Vector3</a>
+, <a class="el" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">stbrp_node</a>
+, <a class="el" href="structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18">stbrp_rect</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_y.html b/dev/MinGfx/docs/html/functions_y.html
new file mode 100644
index 0000000..db734ed
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_y.html
@@ -0,0 +1,96 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_y"></a>- y -</h3><ul>
+<li>y()
+: <a class="el" href="classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#adb294449db2a80bd11426148592d9e0b">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">mingfx::Vector3</a>
+, <a class="el" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">stbrp_node</a>
+, <a class="el" href="structstbrp__rect.html#ae3034c1fbf86043b568f5a4dddf946fa">stbrp_rect</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_z.html b/dev/MinGfx/docs/html/functions_z.html
new file mode 100644
index 0000000..0349076
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_z.html
@@ -0,0 +1,98 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index_z"></a>- z -</h3><ul>
+<li>z()
+: <a class="el" href="classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_quaternion.html#a75ec001cbbf08cf5c4e1f8978082a55f">mingfx::Quaternion</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6">mingfx::Vector3</a>
+</li>
+<li>Zero()
+: <a class="el" href="classmingfx_1_1_point2.html#a60a2b348deab631b51caca3eb715461f">mingfx::Point2</a>
+, <a class="el" href="classmingfx_1_1_point3.html#a9983b62979f9ac5a11efea08d9d283ed">mingfx::Point3</a>
+, <a class="el" href="classmingfx_1_1_vector2.html#a7cb11f9fe8962ff9092fc1e5736faacf">mingfx::Vector2</a>
+, <a class="el" href="classmingfx_1_1_vector3.html#a52bf8582baa71e7d6f80c412687d9714">mingfx::Vector3</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/functions_~.html b/dev/MinGfx/docs/html/functions_~.html
new file mode 100644
index 0000000..bda6078
--- /dev/null
+++ b/dev/MinGfx/docs/html/functions_~.html
@@ -0,0 +1,144 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a id="index__7E"></a>- ~ -</h3><ul>
+<li>~AABB()
+: <a class="el" href="classmingfx_1_1_a_a_b_b.html#aeb63c176a2f2408e803d9a2f6848eee5">mingfx::AABB</a>
+</li>
+<li>~BVH()
+: <a class="el" href="classmingfx_1_1_b_v_h.html#af81906830adcf4648cc8cf4e214b4269">mingfx::BVH</a>
+</li>
+<li>~Color()
+: <a class="el" href="classmingfx_1_1_color.html#ab1a90432dd7fd7b2adf41d747be85378">mingfx::Color</a>
+</li>
+<li>~CraftCam()
+: <a class="el" href="classmingfx_1_1_craft_cam.html#a85ef9bebdd1595be1288bc104245f4ff">mingfx::CraftCam</a>
+</li>
+<li>~DefaultShader()
+: <a class="el" href="classmingfx_1_1_default_shader.html#a0fe7d605d039ecdbf17837bc5bbe0aba">mingfx::DefaultShader</a>
+</li>
+<li>~GraphicsApp()
+: <a class="el" href="classmingfx_1_1_graphics_app.html#aab7925c6b844e6bef428feacf4aa9afb">mingfx::GraphicsApp</a>
+</li>
+<li>~Matrix4()
+: <a class="el" href="classmingfx_1_1_matrix4.html#a8853a6b3fd0d08f1def5c9921bd47933">mingfx::Matrix4</a>
+</li>
+<li>~Mesh()
+: <a class="el" href="classmingfx_1_1_mesh.html#ace7b23730dbcb581c4886cf2b9998327">mingfx::Mesh</a>
+</li>
+<li>~Point2()
+: <a class="el" href="classmingfx_1_1_point2.html#a7e5b2dcd7e079bdd00354e7ccf9c5c2a">mingfx::Point2</a>
+</li>
+<li>~Point3()
+: <a class="el" href="classmingfx_1_1_point3.html#aa55aef76986cc7424c2a535d6fd1ab7a">mingfx::Point3</a>
+</li>
+<li>~Quaternion()
+: <a class="el" href="classmingfx_1_1_quaternion.html#a1f9ddd82678ccf51a462e4e03a02c7cc">mingfx::Quaternion</a>
+</li>
+<li>~QuickShapes()
+: <a class="el" href="classmingfx_1_1_quick_shapes.html#a3a75dde188ec076ea46a6319ed1ca046">mingfx::QuickShapes</a>
+</li>
+<li>~Ray()
+: <a class="el" href="classmingfx_1_1_ray.html#ac20909f30c07d5375598876c6d294625">mingfx::Ray</a>
+</li>
+<li>~ShaderProgram()
+: <a class="el" href="classmingfx_1_1_shader_program.html#a96da0dede354f2511084eeb25428edb4">mingfx::ShaderProgram</a>
+</li>
+<li>~TextShader()
+: <a class="el" href="classmingfx_1_1_text_shader.html#a457f7a42eceb957cdb103664dd864feb">mingfx::TextShader</a>
+</li>
+<li>~Texture2D()
+: <a class="el" href="classmingfx_1_1_texture2_d.html#aab734dbbcf6211507ab65d5bb94a4ef9">mingfx::Texture2D</a>
+</li>
+<li>~UniCam()
+: <a class="el" href="classmingfx_1_1_uni_cam.html#af98022627bcb52dbf54779cfaeb6ff7e">mingfx::UniCam</a>
+</li>
+<li>~Vector2()
+: <a class="el" href="classmingfx_1_1_vector2.html#ac49b009c4b6052ebe71d5cf4ce241b1f">mingfx::Vector2</a>
+</li>
+<li>~Vector3()
+: <a class="el" href="classmingfx_1_1_vector3.html#a6e0d09d774615bcfde5645c22a645969">mingfx::Vector3</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/gfxmath_8h.html b/dev/MinGfx/docs/html/gfxmath_8h.html
new file mode 100644
index 0000000..95d2bda
--- /dev/null
+++ b/dev/MinGfx/docs/html/gfxmath_8h.html
@@ -0,0 +1,113 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/gfxmath.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">gfxmath.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="point2_8h_source.html">point2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector3_8h_source.html">vector3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="matrix4_8h_source.html">matrix4.h</a>&quot;</code><br />
+</div>
+<p><a href="gfxmath_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This class holds a variety of static math functions that are useful to have defined with creating graphics programs. <a href="classmingfx_1_1_gfx_math.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/gfxmath_8h_source.html b/dev/MinGfx/docs/html/gfxmath_8h_source.html
new file mode 100644
index 0000000..b3150d9
--- /dev/null
+++ b/dev/MinGfx/docs/html/gfxmath_8h_source.html
@@ -0,0 +1,172 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/gfxmath.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">gfxmath.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="gfxmath_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_GFXMATH_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_GFXMATH_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point2_8h.html">point2.h</a>&quot;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector3_8h.html">vector3.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="matrix4_8h.html">matrix4.h</a>&quot;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; </div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; </div>
+<div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html"> 28</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_gfx_math.html">GfxMath</a> {</div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; </div>
+<div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#af227209ec043b375497556ee2dcdf850"> 32</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_gfx_math.html#af227209ec043b375497556ee2dcdf850">Clamp</a>(<span class="keywordtype">float</span> x, <span class="keywordtype">float</span> a, <span class="keywordtype">float</span> b);</div>
+<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; </div>
+<div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637"> 34</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">ToRadians</a>(<span class="keywordtype">float</span> degrees);</div>
+<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; </div>
+<div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3"> 36</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3">ToDegrees</a>(<span class="keywordtype">float</span> radians);</div>
+<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; </div>
+<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#a38927f1f8ea4625d909e64efa93c5190"> 38</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_gfx_math.html#a38927f1f8ea4625d909e64efa93c5190">ToRadians</a>(<a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> degrees);</div>
+<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; </div>
+<div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#aa5411a7d8bfc8e47d596362a328dbde8"> 40</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_gfx_math.html#aa5411a7d8bfc8e47d596362a328dbde8">ToDegrees</a>(<a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> radians);</div>
+<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; </div>
+<div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#ace452fb6b86eb638897b474e9dd51647"> 42</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_gfx_math.html#ace452fb6b86eb638897b474e9dd51647">Lerp</a>(<span class="keywordtype">float</span> a, <span class="keywordtype">float</span> b, <span class="keywordtype">float</span> alpha);</div>
+<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; </div>
+<div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#af255bde64498e9b55be466abeea97f4d"> 44</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_gfx_math.html#af255bde64498e9b55be466abeea97f4d">iLerp</a>(<span class="keywordtype">int</span> a, <span class="keywordtype">int</span> b, <span class="keywordtype">float</span> alpha);</div>
+<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; </div>
+<div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0"> 55</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0">ScreenToNearPlane</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projMatrix, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedScreenPt);</div>
+<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
+<div class="line"><a name="l00060"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#aaa6af7c0de01fdad46d48d43efb6aa67"> 60</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_gfx_math.html#aaa6af7c0de01fdad46d48d43efb6aa67">ScreenToDepthPlane</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projMatrix, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedScreenPt, <span class="keywordtype">float</span> planeDepth);</div>
+<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; </div>
+<div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#a24048d7b688ae46317c3e8de8a701273"> 69</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_gfx_math.html#a24048d7b688ae46317c3e8de8a701273">ScreenToWorld</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projMatrix, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedScreenPt, <span class="keywordtype">float</span> normalizedZ);</div>
+<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; </div>
+<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; </div>
+<div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#aaa14e60a5f7c158db443f8b6d87958b4"> 72</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_gfx_math.html#aaa14e60a5f7c158db443f8b6d87958b4">PI</a>;</div>
+<div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#a0e5c7562116babf11c61f4c7f20f8b69"> 73</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_gfx_math.html#a0e5c7562116babf11c61f4c7f20f8b69">TWO_PI</a>;</div>
+<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classmingfx_1_1_gfx_math.html#ab5ba8ba54257d86dcf95bd2bbeb534c0"> 74</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_gfx_math.html#ab5ba8ba54257d86dcf95bd2bbeb534c0">HALF_PI</a>;</div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;};</div>
+<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; </div>
+<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; </div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
+<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; </div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html">mingfx::GfxMath</a></div><div class="ttdoc">This class holds a variety of static math functions that are useful to have defined with creating gra...</div><div class="ttdef"><b>Definition:</b> <a href="gfxmath_8h_source.html#l00028">gfxmath.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a0e5c7562116babf11c61f4c7f20f8b69"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a0e5c7562116babf11c61f4c7f20f8b69">mingfx::GfxMath::TWO_PI</a></div><div class="ttdeci">static const float TWO_PI</div><div class="ttdef"><b>Definition:</b> <a href="gfxmath_8h_source.html#l00073">gfxmath.h:73</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a1336de2695bc3bb750b23fb0ea211637"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637">mingfx::GfxMath::ToRadians</a></div><div class="ttdeci">static float ToRadians(float degrees)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a2086a2f885f887fb53da8a5adb5860f0"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0">mingfx::GfxMath::ScreenToNearPlane</a></div><div class="ttdeci">static Point3 ScreenToNearPlane(const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projMatrix, const Point2 &amp;normalizedScreenPt)</div><div class="ttdoc">Converts a 2D point on the filmplane represented in Normalized Device Coorindates,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a24048d7b688ae46317c3e8de8a701273"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a24048d7b688ae46317c3e8de8a701273">mingfx::GfxMath::ScreenToWorld</a></div><div class="ttdeci">static Point3 ScreenToWorld(const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projMatrix, const Point2 &amp;normalizedScreenPt, float normalizedZ)</div><div class="ttdoc">Converts a 2D point on the filmplane represented in Normalized Device Coorindates,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a38927f1f8ea4625d909e64efa93c5190"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a38927f1f8ea4625d909e64efa93c5190">mingfx::GfxMath::ToRadians</a></div><div class="ttdeci">static Vector3 ToRadians(Vector3 degrees)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_a39a2b5973249fb3aefc210b18b0fdff3"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3">mingfx::GfxMath::ToDegrees</a></div><div class="ttdeci">static float ToDegrees(float radians)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_aa5411a7d8bfc8e47d596362a328dbde8"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#aa5411a7d8bfc8e47d596362a328dbde8">mingfx::GfxMath::ToDegrees</a></div><div class="ttdeci">static Vector3 ToDegrees(Vector3 radians)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_aaa14e60a5f7c158db443f8b6d87958b4"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#aaa14e60a5f7c158db443f8b6d87958b4">mingfx::GfxMath::PI</a></div><div class="ttdeci">static const float PI</div><div class="ttdef"><b>Definition:</b> <a href="gfxmath_8h_source.html#l00072">gfxmath.h:72</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_aaa6af7c0de01fdad46d48d43efb6aa67"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#aaa6af7c0de01fdad46d48d43efb6aa67">mingfx::GfxMath::ScreenToDepthPlane</a></div><div class="ttdeci">static Point3 ScreenToDepthPlane(const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projMatrix, const Point2 &amp;normalizedScreenPt, float planeDepth)</div><div class="ttdoc">Similar to filmplane2D_to_nearplane3D() but here rather than using the nearplane, you specify the dep...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_ab5ba8ba54257d86dcf95bd2bbeb534c0"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#ab5ba8ba54257d86dcf95bd2bbeb534c0">mingfx::GfxMath::HALF_PI</a></div><div class="ttdeci">static const float HALF_PI</div><div class="ttdef"><b>Definition:</b> <a href="gfxmath_8h_source.html#l00074">gfxmath.h:74</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_ace452fb6b86eb638897b474e9dd51647"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#ace452fb6b86eb638897b474e9dd51647">mingfx::GfxMath::Lerp</a></div><div class="ttdeci">static float Lerp(float a, float b, float alpha)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_af227209ec043b375497556ee2dcdf850"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#af227209ec043b375497556ee2dcdf850">mingfx::GfxMath::Clamp</a></div><div class="ttdeci">static float Clamp(float x, float a, float b)</div><div class="ttdoc">Returns a if x is less than a and b if x is greater than b.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_gfx_math_html_af255bde64498e9b55be466abeea97f4d"><div class="ttname"><a href="classmingfx_1_1_gfx_math.html#af255bde64498e9b55be466abeea97f4d">mingfx::GfxMath::iLerp</a></div><div class="ttdeci">static int iLerp(int a, int b, float alpha)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html"><div class="ttname"><a href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></div><div class="ttdoc">A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...</div><div class="ttdef"><b>Definition:</b> <a href="matrix4_8h_source.html#l00050">matrix4.h:50</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html"><div class="ttname"><a href="classmingfx_1_1_point2.html">mingfx::Point2</a></div><div class="ttdoc">A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...</div><div class="ttdef"><b>Definition:</b> <a href="point2_8h_source.html#l00028">point2.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="amatrix4_8h_html"><div class="ttname"><a href="matrix4_8h.html">matrix4.h</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="apoint2_8h_html"><div class="ttname"><a href="point2_8h.html">point2.h</a></div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+<div class="ttc" id="avector3_8h_html"><div class="ttname"><a href="vector3_8h.html">vector3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/globals.html b/dev/MinGfx/docs/html/globals.html
new file mode 100644
index 0000000..2d170a0
--- /dev/null
+++ b/dev/MinGfx/docs/html/globals.html
@@ -0,0 +1,140 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div><ul>
+<li>MINGFX_DATA_DIR_BUILD
+: <a class="el" href="mingfx__config_8h.html#a9ab97d1e09bf7a864495329de5dc7e03">mingfx_config.h</a>
+</li>
+<li>MINGFX_DATA_DIR_INSTALL
+: <a class="el" href="mingfx__config_8h.html#a1e44357d7f17eb50f842d9e39e55e398">mingfx_config.h</a>
+</li>
+<li>MINGFX_MATH_EPSILON
+: <a class="el" href="point2_8h.html#a432350d21fbc10d5e65eeeb6859511ea">point2.h</a>
+, <a class="el" href="point3_8h.html#a432350d21fbc10d5e65eeeb6859511ea">point3.h</a>
+</li>
+<li>MINGFX_SHADERS_DIR_BUILD
+: <a class="el" href="mingfx__config_8h.html#a1908456b5481e0dbbe2b8252fa71d23f">mingfx_config.h</a>
+</li>
+<li>MINGFX_SHADERS_DIR_INSTALL
+: <a class="el" href="mingfx__config_8h.html#ab431df904057e50ac94550595473f5f4">mingfx_config.h</a>
+</li>
+<li>STB_RECT_PACK_VERSION
+: <a class="el" href="stb__rect__pack_8h.html#af2f15dfcc6ad60b1df4f5902e2cc25ce">stb_rect_pack.h</a>
+</li>
+<li>stbrp_context
+: <a class="el" href="stb__rect__pack_8h.html#a0455046a8d5457bbc4f3f3ec995c338f">stb_rect_pack.h</a>
+</li>
+<li>stbrp_coord
+: <a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stb_rect_pack.h</a>
+</li>
+<li>STBRP_DEF
+: <a class="el" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">stb_rect_pack.h</a>
+</li>
+<li>STBRP_HEURISTIC_Skyline_BF_sortHeight
+: <a class="el" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c">stb_rect_pack.h</a>
+</li>
+<li>STBRP_HEURISTIC_Skyline_BL_sortHeight
+: <a class="el" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a">stb_rect_pack.h</a>
+</li>
+<li>STBRP_HEURISTIC_Skyline_default
+: <a class="el" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525">stb_rect_pack.h</a>
+</li>
+<li>stbrp_init_target()
+: <a class="el" href="stb__rect__pack_8h.html#a8b32f5ad458f614f5d419ef26cef5b3c">stb_rect_pack.h</a>
+</li>
+<li>stbrp_node
+: <a class="el" href="stb__rect__pack_8h.html#ae8f871c209d2e6218baf9c0e2a209ea1">stb_rect_pack.h</a>
+</li>
+<li>stbrp_pack_rects()
+: <a class="el" href="stb__rect__pack_8h.html#af038ae1b98573f24736c9a3eed0478ba">stb_rect_pack.h</a>
+</li>
+<li>stbrp_rect
+: <a class="el" href="stb__rect__pack_8h.html#a7c4a99b31ea2207a0b2bbcbdab8f3840">stb_rect_pack.h</a>
+</li>
+<li>stbrp_setup_allow_out_of_mem()
+: <a class="el" href="stb__rect__pack_8h.html#a1babd70b223e571305fd9753a83a4fda">stb_rect_pack.h</a>
+</li>
+<li>stbrp_setup_heuristic()
+: <a class="el" href="stb__rect__pack_8h.html#a5a8223866c146933da3e152066bf61a1">stb_rect_pack.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/globals_defs.html b/dev/MinGfx/docs/html/globals_defs.html
new file mode 100644
index 0000000..e15c19b
--- /dev/null
+++ b/dev/MinGfx/docs/html/globals_defs.html
@@ -0,0 +1,107 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>MINGFX_DATA_DIR_BUILD
+: <a class="el" href="mingfx__config_8h.html#a9ab97d1e09bf7a864495329de5dc7e03">mingfx_config.h</a>
+</li>
+<li>MINGFX_DATA_DIR_INSTALL
+: <a class="el" href="mingfx__config_8h.html#a1e44357d7f17eb50f842d9e39e55e398">mingfx_config.h</a>
+</li>
+<li>MINGFX_MATH_EPSILON
+: <a class="el" href="point2_8h.html#a432350d21fbc10d5e65eeeb6859511ea">point2.h</a>
+, <a class="el" href="point3_8h.html#a432350d21fbc10d5e65eeeb6859511ea">point3.h</a>
+</li>
+<li>MINGFX_SHADERS_DIR_BUILD
+: <a class="el" href="mingfx__config_8h.html#a1908456b5481e0dbbe2b8252fa71d23f">mingfx_config.h</a>
+</li>
+<li>MINGFX_SHADERS_DIR_INSTALL
+: <a class="el" href="mingfx__config_8h.html#ab431df904057e50ac94550595473f5f4">mingfx_config.h</a>
+</li>
+<li>STB_RECT_PACK_VERSION
+: <a class="el" href="stb__rect__pack_8h.html#af2f15dfcc6ad60b1df4f5902e2cc25ce">stb_rect_pack.h</a>
+</li>
+<li>STBRP_DEF
+: <a class="el" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">stb_rect_pack.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/globals_eval.html b/dev/MinGfx/docs/html/globals_eval.html
new file mode 100644
index 0000000..58a8beb
--- /dev/null
+++ b/dev/MinGfx/docs/html/globals_eval.html
@@ -0,0 +1,94 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>STBRP_HEURISTIC_Skyline_BF_sortHeight
+: <a class="el" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c">stb_rect_pack.h</a>
+</li>
+<li>STBRP_HEURISTIC_Skyline_BL_sortHeight
+: <a class="el" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a">stb_rect_pack.h</a>
+</li>
+<li>STBRP_HEURISTIC_Skyline_default
+: <a class="el" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525">stb_rect_pack.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/globals_func.html b/dev/MinGfx/docs/html/globals_func.html
new file mode 100644
index 0000000..4faf44b
--- /dev/null
+++ b/dev/MinGfx/docs/html/globals_func.html
@@ -0,0 +1,97 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>stbrp_init_target()
+: <a class="el" href="stb__rect__pack_8h.html#a8b32f5ad458f614f5d419ef26cef5b3c">stb_rect_pack.h</a>
+</li>
+<li>stbrp_pack_rects()
+: <a class="el" href="stb__rect__pack_8h.html#af038ae1b98573f24736c9a3eed0478ba">stb_rect_pack.h</a>
+</li>
+<li>stbrp_setup_allow_out_of_mem()
+: <a class="el" href="stb__rect__pack_8h.html#a1babd70b223e571305fd9753a83a4fda">stb_rect_pack.h</a>
+</li>
+<li>stbrp_setup_heuristic()
+: <a class="el" href="stb__rect__pack_8h.html#a5a8223866c146933da3e152066bf61a1">stb_rect_pack.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/globals_type.html b/dev/MinGfx/docs/html/globals_type.html
new file mode 100644
index 0000000..930e8e7
--- /dev/null
+++ b/dev/MinGfx/docs/html/globals_type.html
@@ -0,0 +1,97 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>stbrp_context
+: <a class="el" href="stb__rect__pack_8h.html#a0455046a8d5457bbc4f3f3ec995c338f">stb_rect_pack.h</a>
+</li>
+<li>stbrp_coord
+: <a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stb_rect_pack.h</a>
+</li>
+<li>stbrp_node
+: <a class="el" href="stb__rect__pack_8h.html#ae8f871c209d2e6218baf9c0e2a209ea1">stb_rect_pack.h</a>
+</li>
+<li>stbrp_rect
+: <a class="el" href="stb__rect__pack_8h.html#a7c4a99b31ea2207a0b2bbcbdab8f3840">stb_rect_pack.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/graphics__app_8h.html b/dev/MinGfx/docs/html/graphics__app_8h.html
new file mode 100644
index 0000000..d790913
--- /dev/null
+++ b/dev/MinGfx/docs/html/graphics__app_8h.html
@@ -0,0 +1,113 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/graphics_app.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">graphics_app.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;nanogui/nanogui.h&gt;</code><br />
+<code>#include &lt;iostream&gt;</code><br />
+<code>#include &quot;<a class="el" href="point2_8h_source.html">point2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector2_8h_source.html">vector2.h</a>&quot;</code><br />
+</div>
+<p><a href="graphics__app_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This is the main application base class for the MinGfx Toolkit. <a href="classmingfx_1_1_graphics_app.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/graphics__app_8h_source.html b/dev/MinGfx/docs/html/graphics__app_8h_source.html
new file mode 100644
index 0000000..2353eb8
--- /dev/null
+++ b/dev/MinGfx/docs/html/graphics__app_8h_source.html
@@ -0,0 +1,358 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/graphics_app.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">graphics_app.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="graphics__app_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2017, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ... </span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#ifndef SRC_GRAPHICS_APP_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#define SRC_GRAPHICS_APP_H_</span></div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; </div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// disable warnings for this 3rd party code</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#pragma warning ( push, 0 )</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &lt;nanogui/nanogui.h&gt;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#pragma warning ( pop )</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; </div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point2_8h.html">point2.h</a>&quot;</span></div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector2_8h.html">vector2.h</a>&quot;</span></div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; </div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; </div>
+<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; </div>
+<div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html"> 135</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_graphics_app.html">GraphicsApp</a> {</div>
+<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; </div>
+<div class="line"><a name="l00144"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b"> 144</a></span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b">GraphicsApp</a>(<span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height, <span class="keyword">const</span> std::string &amp;caption);</div>
+<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; </div>
+<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; </div>
+<div class="line"><a name="l00148"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#aab7925c6b844e6bef428feacf4aa9afb"> 148</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_graphics_app.html#aab7925c6b844e6bef428feacf4aa9afb">~GraphicsApp</a>();</div>
+<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; </div>
+<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; </div>
+<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="comment">// Callback methods -- override these and fill in to respond to user</span></div>
+<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="comment">// input events.</span></div>
+<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; </div>
+<div class="line"><a name="l00165"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f"> 165</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f">OnMouseMove</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;delta) {}</div>
+<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; </div>
+<div class="line"><a name="l00174"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#ae12d9b192a2167a71e0c103405addb17"> 174</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#ae12d9b192a2167a71e0c103405addb17">OnLeftMouseDown</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos) {}</div>
+<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; </div>
+<div class="line"><a name="l00187"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a56d350a8b030998709a51630753d509b"> 187</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a56d350a8b030998709a51630753d509b">OnLeftMouseDrag</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;delta) {}</div>
+<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; </div>
+<div class="line"><a name="l00196"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a536dbadf0b8a11ef59d7e855ca43f613"> 196</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a536dbadf0b8a11ef59d7e855ca43f613">OnLeftMouseUp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos) {}</div>
+<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; </div>
+<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; </div>
+<div class="line"><a name="l00200"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a588315d5c45490b440a764af2bc5bd48"> 200</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a588315d5c45490b440a764af2bc5bd48">OnMiddleMouseDown</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos) {}</div>
+<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; </div>
+<div class="line"><a name="l00203"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#ac7628fece754c0ac4875791e19712dc6"> 203</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#ac7628fece754c0ac4875791e19712dc6">OnMiddleMouseDrag</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;delta) {}</div>
+<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; </div>
+<div class="line"><a name="l00206"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a378b8a102775eeb01a6da9dd68482d08"> 206</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a378b8a102775eeb01a6da9dd68482d08">OnMiddleMouseUp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos) {}</div>
+<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; </div>
+<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; </div>
+<div class="line"><a name="l00210"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c"> 210</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c">OnRightMouseDown</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos) {}</div>
+<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; </div>
+<div class="line"><a name="l00213"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7"> 213</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7">OnRightMouseDrag</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;delta) {}</div>
+<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; </div>
+<div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3"> 216</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3">OnRightMouseUp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos) {}</div>
+<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; </div>
+<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; </div>
+<div class="line"><a name="l00225"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a002560456139e537877d079978db4b01"> 225</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a002560456139e537877d079978db4b01">OnKeyDown</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *c, <span class="keywordtype">int</span> modifiers) {}</div>
+<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; </div>
+<div class="line"><a name="l00233"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a1d5831953b37fae615fbd1bf527214b0"> 233</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a1d5831953b37fae615fbd1bf527214b0">OnKeyRepeat</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *c, <span class="keywordtype">int</span> modifiers) {}</div>
+<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; </div>
+<div class="line"><a name="l00241"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a8376ef8eb0840b229a2301f995db3f6c"> 241</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a8376ef8eb0840b229a2301f995db3f6c">OnKeyUp</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *c, <span class="keywordtype">int</span> modifiers) {}</div>
+<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; </div>
+<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; </div>
+<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; </div>
+<div class="line"><a name="l00247"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#abcf1935e92550bcda311cac62f312952"> 247</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#abcf1935e92550bcda311cac62f312952">OnSpecialKeyDown</a>(<span class="keywordtype">int</span> key, <span class="keywordtype">int</span> scancode, <span class="keywordtype">int</span> modifiers) {}</div>
+<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; </div>
+<div class="line"><a name="l00251"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a8362762489e287edfa59617a6602db22"> 251</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a8362762489e287edfa59617a6602db22">OnSpecialKeyRepeat</a>(<span class="keywordtype">int</span> key, <span class="keywordtype">int</span> scancode, <span class="keywordtype">int</span> modifiers) {}</div>
+<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; </div>
+<div class="line"><a name="l00255"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a0deb6da45fc0d3980e44556a861c7a14"> 255</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a0deb6da45fc0d3980e44556a861c7a14">OnSpecialKeyUp</a>(<span class="keywordtype">int</span> key, <span class="keywordtype">int</span> scancode, <span class="keywordtype">int</span> modifiers) {}</div>
+<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; </div>
+<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; </div>
+<div class="line"><a name="l00261"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#adafdc4631db256fefce3c4ffdfd5086a"> 261</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#adafdc4631db256fefce3c4ffdfd5086a">OnWindowResize</a>(<span class="keywordtype">int</span> new_width, <span class="keywordtype">int</span> new_height) {}</div>
+<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; </div>
+<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; </div>
+<div class="line"><a name="l00271"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9"> 271</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9">Run</a>();</div>
+<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; </div>
+<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; </div>
+<div class="line"><a name="l00284"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a"> 284</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a">InitNanoGUI</a>() {}</div>
+<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; </div>
+<div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3"> 297</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3">InitOpenGL</a>() {}</div>
+<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; </div>
+<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; </div>
+<div class="line"><a name="l00306"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa"> 306</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa">UpdateSimulation</a>(<span class="keywordtype">double</span> dt) {}</div>
+<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; </div>
+<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; </div>
+<div class="line"><a name="l00311"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0"> 311</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0">DrawUsingNanoVG</a>(NVGcontext *ctx) {}</div>
+<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; </div>
+<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; </div>
+<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; </div>
+<div class="line"><a name="l00317"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca"> 317</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca">DrawUsingOpenGL</a>() {}</div>
+<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; </div>
+<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; </div>
+<div class="line"><a name="l00322"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a60688614e5dfeaabf57f8825cdaa08ac"> 322</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a60688614e5dfeaabf57f8825cdaa08ac">IsKeyDown</a>(<span class="keywordtype">int</span> key);</div>
+<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; </div>
+<div class="line"><a name="l00325"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a5b78d79192180a6ef5271d2a2b2d1cc7"> 325</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a5b78d79192180a6ef5271d2a2b2d1cc7">IsLeftMouseDown</a>();</div>
+<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; </div>
+<div class="line"><a name="l00328"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a941f7598400073bfa93aa194a3773434"> 328</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a941f7598400073bfa93aa194a3773434">IsMiddleMouseDown</a>();</div>
+<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; </div>
+<div class="line"><a name="l00331"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a4aa30e3d33731178a9162454a81be08d"> 331</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a4aa30e3d33731178a9162454a81be08d">IsRightMouseDown</a>();</div>
+<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; </div>
+<div class="line"><a name="l00334"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0"> 334</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0">window_width</a>();</div>
+<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; </div>
+<div class="line"><a name="l00337"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016"> 337</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016">window_height</a>();</div>
+<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; </div>
+<div class="line"><a name="l00343"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#ad596e69d030e7689ad91eaaec6975696"> 343</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_graphics_app.html#ad596e69d030e7689ad91eaaec6975696">framebuffer_width</a>();</div>
+<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; </div>
+<div class="line"><a name="l00349"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#af58153eb104f53216a3e67de2a472f32"> 349</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_graphics_app.html#af58153eb104f53216a3e67de2a472f32">framebuffer_height</a>();</div>
+<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; </div>
+<div class="line"><a name="l00352"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23"> 352</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23">aspect_ratio</a>();</div>
+<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; </div>
+<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; </div>
+<div class="line"><a name="l00359"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a94b19404e61411ef64c0ddde8ad6c07a"> 359</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> <a class="code" href="classmingfx_1_1_graphics_app.html#a94b19404e61411ef64c0ddde8ad6c07a">PixelsToNormalizedDeviceCoords</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pointInPixels);</div>
+<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; </div>
+<div class="line"><a name="l00365"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a6141ec6adc29572ee99ca26cf90e6248"> 365</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> <a class="code" href="classmingfx_1_1_graphics_app.html#a6141ec6adc29572ee99ca26cf90e6248">NormalizedDeviceCoordsToPixels</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pointInNDC);</div>
+<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; </div>
+<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; </div>
+<div class="line"><a name="l00372"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a4e8ac965474de9046448b8811bf25dd1"> 372</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="classmingfx_1_1_graphics_app.html#a4e8ac965474de9046448b8811bf25dd1">PixelsToNormalizedDeviceCoords</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;vectorInPixels);</div>
+<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; </div>
+<div class="line"><a name="l00378"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a45596da36aa3905e7c752826a7fd9f93"> 378</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="classmingfx_1_1_graphics_app.html#a45596da36aa3905e7c752826a7fd9f93">NormalizedDeviceCoordsToPixels</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;pointInNDC);</div>
+<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; </div>
+<div class="line"><a name="l00382"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a471951dbf45ffa88027cb92707443646"> 382</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a471951dbf45ffa88027cb92707443646">ReadZValueAtPixel</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pointInPixels, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> whichBuffer = GL_BACK);</div>
+<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; </div>
+<div class="line"><a name="l00385"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16"> 385</a></span>&#160; <span class="keyword">virtual</span> nanogui::Screen* <a class="code" href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16">screen</a>();</div>
+<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; </div>
+<div class="line"><a name="l00388"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94"> 388</a></span>&#160; <span class="keyword">virtual</span> GLFWwindow* <a class="code" href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">window</a>();</div>
+<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; </div>
+<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; </div>
+<div class="line"><a name="l00393"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5"> 393</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5">ResizeWindow</a>(<span class="keywordtype">int</span> new_width, <span class="keywordtype">int</span> new_height);</div>
+<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; </div>
+<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; </div>
+<div class="line"><a name="l00403"></a><span class="lineno"><a class="line" href="classmingfx_1_1_graphics_app.html#a04beb462aa04371dc86d807838f999e1"> 403</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_graphics_app.html#a04beb462aa04371dc86d807838f999e1">InitGraphicsContext</a>();</div>
+<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; </div>
+<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; </div>
+<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keywordtype">bool</span> cursor_pos_glfw_cb(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y);</div>
+<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keywordtype">bool</span> mouse_button_glfw_cb(<span class="keywordtype">int</span> button, <span class="keywordtype">int</span> action, <span class="keywordtype">int</span> modifiers);</div>
+<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keywordtype">bool</span> key_glfw_cb(<span class="keywordtype">int</span> key, <span class="keywordtype">int</span> scancode, <span class="keywordtype">int</span> action, <span class="keywordtype">int</span> mods);</div>
+<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="keywordtype">bool</span> char_glfw_cb(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> codepoint);</div>
+<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; <span class="keywordtype">bool</span> drop_glfw_cb(<span class="keywordtype">int</span> count, <span class="keyword">const</span> <span class="keywordtype">char</span> **filenames);</div>
+<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <span class="keywordtype">bool</span> scroll_glfw_cb(<span class="keywordtype">double</span> x, <span class="keywordtype">double</span> y);</div>
+<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="keywordtype">bool</span> resize_glfw_cb(<span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height);</div>
+<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; </div>
+<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> mouse_move(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;delta) {</div>
+<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f">OnMouseMove</a>(pos, delta);</div>
+<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; }</div>
+<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> left_mouse_down(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;pos) {</div>
+<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#ae12d9b192a2167a71e0c103405addb17">OnLeftMouseDown</a>(pos);</div>
+<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; }</div>
+<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> left_mouse_drag(<span class="keyword">const</span> Point2 &amp;pos, <span class="keyword">const</span> Vector2 &amp;delta) {</div>
+<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a56d350a8b030998709a51630753d509b">OnLeftMouseDrag</a>(pos, delta);</div>
+<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; }</div>
+<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> left_mouse_up(<span class="keyword">const</span> Point2 &amp;pos) {</div>
+<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a536dbadf0b8a11ef59d7e855ca43f613">OnLeftMouseUp</a>(pos);</div>
+<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; }</div>
+<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> middle_mouse_down(<span class="keyword">const</span> Point2 &amp;pos) {</div>
+<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a588315d5c45490b440a764af2bc5bd48">OnMiddleMouseDown</a>(pos);</div>
+<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; }</div>
+<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> middle_mouse_drag(<span class="keyword">const</span> Point2 &amp;pos, <span class="keyword">const</span> Vector2 &amp;delta) {</div>
+<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#ac7628fece754c0ac4875791e19712dc6">OnMiddleMouseDrag</a>(pos, delta);</div>
+<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; }</div>
+<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> middle_mouse_up(<span class="keyword">const</span> Point2 &amp;pos) {</div>
+<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a378b8a102775eeb01a6da9dd68482d08">OnMiddleMouseUp</a>(pos);</div>
+<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; }</div>
+<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> right_mouse_down(<span class="keyword">const</span> Point2 &amp;pos) {</div>
+<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c">OnRightMouseDown</a>(pos);</div>
+<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; }</div>
+<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> right_mouse_drag(<span class="keyword">const</span> Point2 &amp;pos, <span class="keyword">const</span> Vector2 &amp;delta) {</div>
+<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7">OnRightMouseDrag</a>(pos, delta);</div>
+<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; }</div>
+<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> right_mouse_up(<span class="keyword">const</span> Point2 &amp;pos) {</div>
+<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3">OnRightMouseUp</a>(pos);</div>
+<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; }</div>
+<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> key_down(<span class="keyword">const</span> <span class="keywordtype">char</span> *c, <span class="keywordtype">int</span> modifiers) {</div>
+<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a002560456139e537877d079978db4b01">OnKeyDown</a>(c, modifiers);</div>
+<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; }</div>
+<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> key_repeat(<span class="keyword">const</span> <span class="keywordtype">char</span> *c, <span class="keywordtype">int</span> modifiers) {</div>
+<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a1d5831953b37fae615fbd1bf527214b0">OnKeyRepeat</a>(c, modifiers);</div>
+<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; }</div>
+<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> key_up(<span class="keyword">const</span> <span class="keywordtype">char</span> *c, <span class="keywordtype">int</span> modifiers) {</div>
+<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a8376ef8eb0840b229a2301f995db3f6c">OnKeyUp</a>(c, modifiers);</div>
+<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; }</div>
+<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> special_key_down(<span class="keywordtype">int</span> key, <span class="keywordtype">int</span> scancode, <span class="keywordtype">int</span> modifiers) {</div>
+<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#abcf1935e92550bcda311cac62f312952">OnSpecialKeyDown</a>(key, scancode, modifiers);</div>
+<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; }</div>
+<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> special_key_repeat(<span class="keywordtype">int</span> key, <span class="keywordtype">int</span> scancode, <span class="keywordtype">int</span> modifiers) {</div>
+<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a8362762489e287edfa59617a6602db22">OnSpecialKeyRepeat</a>(key, scancode, modifiers);</div>
+<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; }</div>
+<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> special_key_up(<span class="keywordtype">int</span> key, <span class="keywordtype">int</span> scancode, <span class="keywordtype">int</span> modifiers) {</div>
+<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <a class="code" href="classmingfx_1_1_graphics_app.html#a0deb6da45fc0d3980e44556a861c7a14">OnSpecialKeyUp</a>(key, scancode, modifiers);</div>
+<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; }</div>
+<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; </div>
+<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keywordtype">bool</span> graphicsInitialized_;</div>
+<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keywordtype">int</span> width_;</div>
+<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="keywordtype">int</span> height_;</div>
+<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keyword">const</span> std::string caption_;</div>
+<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; nanogui::Screen *screen_;</div>
+<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; GLFWwindow* window_;</div>
+<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="keywordtype">double</span> lastDrawT_;</div>
+<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; Point2 lastMouse_;</div>
+<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <span class="keywordtype">bool</span> leftDown_;</div>
+<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keywordtype">bool</span> middleDown_;</div>
+<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <span class="keywordtype">bool</span> rightDown_;</div>
+<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160;};</div>
+<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; </div>
+<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; </div>
+<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; </div>
+<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; </div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html">mingfx::GraphicsApp</a></div><div class="ttdoc">This is the main application base class for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00135">graphics_app.h:135</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a002560456139e537877d079978db4b01"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a002560456139e537877d079978db4b01">mingfx::GraphicsApp::OnKeyDown</a></div><div class="ttdeci">virtual void OnKeyDown(const char *c, int modifiers)</div><div class="ttdoc">Transforms a keyboard down event into the actual character typed.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00225">graphics_app.h:225</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a00ad5039af2f428a08fe45751a9731c7"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7">mingfx::GraphicsApp::OnRightMouseDrag</a></div><div class="ttdeci">virtual void OnRightMouseDrag(const Point2 &amp;pos, const Vector2 &amp;delta)</div><div class="ttdoc">If the mouse button is held down and the mouse has moved in the past frame then this function will be...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00213">graphics_app.h:213</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a04beb462aa04371dc86d807838f999e1"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a04beb462aa04371dc86d807838f999e1">mingfx::GraphicsApp::InitGraphicsContext</a></div><div class="ttdeci">virtual void InitGraphicsContext()</div><div class="ttdoc">Users cannot make any graphics calls (e.g., setting the clear color, saving mesh data to the GPU) unt...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a0db71b2465e12a8aef4eefbe8b9fcee5"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5">mingfx::GraphicsApp::ResizeWindow</a></div><div class="ttdeci">virtual void ResizeWindow(int new_width, int new_height)</div><div class="ttdoc">Cause the graphics windows to resize programmatically rather than by dragging on the corner manually.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a0deb6da45fc0d3980e44556a861c7a14"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a0deb6da45fc0d3980e44556a861c7a14">mingfx::GraphicsApp::OnSpecialKeyUp</a></div><div class="ttdeci">virtual void OnSpecialKeyUp(int key, int scancode, int modifiers)</div><div class="ttdoc">The values for key, scancode, and modifiers are documented here: http://www.glfw.org/docs/latest/grou...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00255">graphics_app.h:255</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a1c682fa2dd0bce855e1e32ffeac532b0"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0">mingfx::GraphicsApp::window_width</a></div><div class="ttdeci">virtual int window_width()</div><div class="ttdoc">Returns the current width of the client area of the window in pixels.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a1d5831953b37fae615fbd1bf527214b0"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a1d5831953b37fae615fbd1bf527214b0">mingfx::GraphicsApp::OnKeyRepeat</a></div><div class="ttdeci">virtual void OnKeyRepeat(const char *c, int modifiers)</div><div class="ttdoc">Transforms a keyboard repeat event into the actual character typed.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00233">graphics_app.h:233</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a23a780feda9b52eea7319a53b204ce8f"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f">mingfx::GraphicsApp::OnMouseMove</a></div><div class="ttdeci">virtual void OnMouseMove(const Point2 &amp;pos, const Vector2 &amp;delta)</div><div class="ttdoc">If the mouse has moved in the past frame and no mouse buttons are currently pressed,...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00165">graphics_app.h:165</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a378b8a102775eeb01a6da9dd68482d08"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a378b8a102775eeb01a6da9dd68482d08">mingfx::GraphicsApp::OnMiddleMouseUp</a></div><div class="ttdeci">virtual void OnMiddleMouseUp(const Point2 &amp;pos)</div><div class="ttdoc">If the mouse button was released since the last frame, then this function will be called to notify yo...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00206">graphics_app.h:206</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a45596da36aa3905e7c752826a7fd9f93"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a45596da36aa3905e7c752826a7fd9f93">mingfx::GraphicsApp::NormalizedDeviceCoordsToPixels</a></div><div class="ttdeci">virtual Vector2 NormalizedDeviceCoordsToPixels(const Vector2 &amp;pointInNDC)</div><div class="ttdoc">Transforms a vector in normalized device coordinates (top left = (-1,1) bottom right (1,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a471951dbf45ffa88027cb92707443646"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a471951dbf45ffa88027cb92707443646">mingfx::GraphicsApp::ReadZValueAtPixel</a></div><div class="ttdeci">virtual float ReadZValueAtPixel(const Point2 &amp;pointInPixels, unsigned int whichBuffer=GL_BACK)</div><div class="ttdoc">Returns the z buffer value under the specified pixel. z will be 0 at the near plane and +1 at the far...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a4aa30e3d33731178a9162454a81be08d"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a4aa30e3d33731178a9162454a81be08d">mingfx::GraphicsApp::IsRightMouseDown</a></div><div class="ttdeci">virtual bool IsRightMouseDown()</div><div class="ttdoc">True if the right mouse button is currently held down.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a4e8ac965474de9046448b8811bf25dd1"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a4e8ac965474de9046448b8811bf25dd1">mingfx::GraphicsApp::PixelsToNormalizedDeviceCoords</a></div><div class="ttdeci">virtual Vector2 PixelsToNormalizedDeviceCoords(const Vector2 &amp;vectorInPixels)</div><div class="ttdoc">Transforms a vector in viewport coordinates (pixels where top left = (0,0) and bottom right = (window...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a536dbadf0b8a11ef59d7e855ca43f613"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a536dbadf0b8a11ef59d7e855ca43f613">mingfx::GraphicsApp::OnLeftMouseUp</a></div><div class="ttdeci">virtual void OnLeftMouseUp(const Point2 &amp;pos)</div><div class="ttdoc">If the mouse button was released since the last frame, then this function will be called to notify yo...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00196">graphics_app.h:196</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a56d350a8b030998709a51630753d509b"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a56d350a8b030998709a51630753d509b">mingfx::GraphicsApp::OnLeftMouseDrag</a></div><div class="ttdeci">virtual void OnLeftMouseDrag(const Point2 &amp;pos, const Vector2 &amp;delta)</div><div class="ttdoc">If the mouse button is held down and the mouse has moved in the past frame then this function will be...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00187">graphics_app.h:187</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a588315d5c45490b440a764af2bc5bd48"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a588315d5c45490b440a764af2bc5bd48">mingfx::GraphicsApp::OnMiddleMouseDown</a></div><div class="ttdeci">virtual void OnMiddleMouseDown(const Point2 &amp;pos)</div><div class="ttdoc">If the mouse button was pressed down since the last frame, then this function will be called to notif...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00200">graphics_app.h:200</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a5a858fd10651f7617491f37b49dbf8ca"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca">mingfx::GraphicsApp::DrawUsingOpenGL</a></div><div class="ttdeci">virtual void DrawUsingOpenGL()</div><div class="ttdoc">Override this to draw graphics using raw OpenGL 2D or 3D graphics calls.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00317">graphics_app.h:317</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a5b78d79192180a6ef5271d2a2b2d1cc7"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a5b78d79192180a6ef5271d2a2b2d1cc7">mingfx::GraphicsApp::IsLeftMouseDown</a></div><div class="ttdeci">virtual bool IsLeftMouseDown()</div><div class="ttdoc">True if the left mouse button is currently held down.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a5ee9ae3d14e76c949979a8008687d6c9"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9">mingfx::GraphicsApp::Run</a></div><div class="ttdeci">virtual void Run()</div><div class="ttdoc">After creating a new GraphicsApp, call this to start the app's mainloop.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a60688614e5dfeaabf57f8825cdaa08ac"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a60688614e5dfeaabf57f8825cdaa08ac">mingfx::GraphicsApp::IsKeyDown</a></div><div class="ttdeci">virtual bool IsKeyDown(int key)</div><div class="ttdoc">True if the specified is is currently held down. Uses the GLFW key codes found here: http://www....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a6141ec6adc29572ee99ca26cf90e6248"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a6141ec6adc29572ee99ca26cf90e6248">mingfx::GraphicsApp::NormalizedDeviceCoordsToPixels</a></div><div class="ttdeci">virtual Point2 NormalizedDeviceCoordsToPixels(const Point2 &amp;pointInNDC)</div><div class="ttdoc">Transforms a point in normalized device coordinates (top left = (-1,1) bottom right (1,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a688f12675da58210e8ec2ffcda4923d0"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0">mingfx::GraphicsApp::DrawUsingNanoVG</a></div><div class="ttdeci">virtual void DrawUsingNanoVG(NVGcontext *ctx)</div><div class="ttdoc">Override this to draw graphics using the nanovg vector graphics library, which provides an easy way t...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00311">graphics_app.h:311</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a8362762489e287edfa59617a6602db22"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a8362762489e287edfa59617a6602db22">mingfx::GraphicsApp::OnSpecialKeyRepeat</a></div><div class="ttdeci">virtual void OnSpecialKeyRepeat(int key, int scancode, int modifiers)</div><div class="ttdoc">The values for key, scancode, and modifiers are documented here: http://www.glfw.org/docs/latest/grou...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00251">graphics_app.h:251</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a8376ef8eb0840b229a2301f995db3f6c"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a8376ef8eb0840b229a2301f995db3f6c">mingfx::GraphicsApp::OnKeyUp</a></div><div class="ttdeci">virtual void OnKeyUp(const char *c, int modifiers)</div><div class="ttdoc">Transforms a keyboard up event into the actual character typed.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00241">graphics_app.h:241</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a903f94b82cc10f32039ff3f2ba368a9c"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c">mingfx::GraphicsApp::OnRightMouseDown</a></div><div class="ttdeci">virtual void OnRightMouseDown(const Point2 &amp;pos)</div><div class="ttdoc">If the mouse button was pressed down since the last frame, then this function will be called to notif...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00210">graphics_app.h:210</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a941f7598400073bfa93aa194a3773434"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a941f7598400073bfa93aa194a3773434">mingfx::GraphicsApp::IsMiddleMouseDown</a></div><div class="ttdeci">virtual bool IsMiddleMouseDown()</div><div class="ttdoc">True if the middle mouse button is currently held down.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a94b19404e61411ef64c0ddde8ad6c07a"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a94b19404e61411ef64c0ddde8ad6c07a">mingfx::GraphicsApp::PixelsToNormalizedDeviceCoords</a></div><div class="ttdeci">virtual Point2 PixelsToNormalizedDeviceCoords(const Point2 &amp;pointInPixels)</div><div class="ttdoc">Transforms a point in viewport coordinates (pixels where top left = (0,0) and bottom right = (window_...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a96196b37f8b488b64072ec74b5d2b0b3"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3">mingfx::GraphicsApp::InitOpenGL</a></div><div class="ttdeci">virtual void InitOpenGL()</div><div class="ttdoc">Override this to initialize the OpenGL context with textures, vertex buffers, etc.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00297">graphics_app.h:297</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_a9e2b4cd7eeabe1ace9d5e9220349fbaa"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa">mingfx::GraphicsApp::UpdateSimulation</a></div><div class="ttdeci">virtual void UpdateSimulation(double dt)</div><div class="ttdoc">Called once per frame.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00306">graphics_app.h:306</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_aab7925c6b844e6bef428feacf4aa9afb"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#aab7925c6b844e6bef428feacf4aa9afb">mingfx::GraphicsApp::~GraphicsApp</a></div><div class="ttdeci">virtual ~GraphicsApp()</div><div class="ttdoc">The destructor will shutdown the graphics system and window.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_abcf1935e92550bcda311cac62f312952"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#abcf1935e92550bcda311cac62f312952">mingfx::GraphicsApp::OnSpecialKeyDown</a></div><div class="ttdeci">virtual void OnSpecialKeyDown(int key, int scancode, int modifiers)</div><div class="ttdoc">The values for key, scancode, and modifiers are documented here: http://www.glfw.org/docs/latest/grou...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00247">graphics_app.h:247</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_abd0ee14f7e12146000cdb3532d54ba94"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94">mingfx::GraphicsApp::window</a></div><div class="ttdeci">virtual GLFWwindow * window()</div><div class="ttdoc">Access to the underlying GLFWwindow object.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_abf0b48c7d8e5325ab038fddbe1c38b5b"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b">mingfx::GraphicsApp::GraphicsApp</a></div><div class="ttdeci">GraphicsApp(int width, int height, const std::string &amp;caption)</div><div class="ttdoc">Constructs a new app but does not yet run it.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_ac682691ee96ea32037abafd74d144a23"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23">mingfx::GraphicsApp::aspect_ratio</a></div><div class="ttdeci">virtual float aspect_ratio()</div><div class="ttdoc">Returns width/height for the current shape of the window.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_ac7628fece754c0ac4875791e19712dc6"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#ac7628fece754c0ac4875791e19712dc6">mingfx::GraphicsApp::OnMiddleMouseDrag</a></div><div class="ttdeci">virtual void OnMiddleMouseDrag(const Point2 &amp;pos, const Vector2 &amp;delta)</div><div class="ttdoc">If the mouse button is held down and the mouse has moved in the past frame then this function will be...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00203">graphics_app.h:203</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_ad596e69d030e7689ad91eaaec6975696"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#ad596e69d030e7689ad91eaaec6975696">mingfx::GraphicsApp::framebuffer_width</a></div><div class="ttdeci">virtual int framebuffer_width()</div><div class="ttdoc">Returns the current width of the framebuffer in pixels.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_ad7a641f7ccf174cd0a059347b623e016"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016">mingfx::GraphicsApp::window_height</a></div><div class="ttdeci">virtual int window_height()</div><div class="ttdoc">Returns the current height of the client area of the window in pixels.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_ad7c33791c44afc87ce789874f3002ca3"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3">mingfx::GraphicsApp::OnRightMouseUp</a></div><div class="ttdeci">virtual void OnRightMouseUp(const Point2 &amp;pos)</div><div class="ttdoc">If the mouse button was released since the last frame, then this function will be called to notify yo...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00216">graphics_app.h:216</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_adafdc4631db256fefce3c4ffdfd5086a"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#adafdc4631db256fefce3c4ffdfd5086a">mingfx::GraphicsApp::OnWindowResize</a></div><div class="ttdeci">virtual void OnWindowResize(int new_width, int new_height)</div><div class="ttdoc">Override this to respond when the graphics window and/or framebuffer are resized, either by the user ...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00261">graphics_app.h:261</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_adc68196c3f03bd0608c41f6e4d7dad16"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16">mingfx::GraphicsApp::screen</a></div><div class="ttdeci">virtual nanogui::Screen * screen()</div><div class="ttdoc">Access to the underlying NanoGUI Screen object.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_adfe77d841f43961b299ea6159477968a"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a">mingfx::GraphicsApp::InitNanoGUI</a></div><div class="ttdeci">virtual void InitNanoGUI()</div><div class="ttdoc">Called at the beginning of the Run() method.</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00284">graphics_app.h:284</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_ae12d9b192a2167a71e0c103405addb17"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#ae12d9b192a2167a71e0c103405addb17">mingfx::GraphicsApp::OnLeftMouseDown</a></div><div class="ttdeci">virtual void OnLeftMouseDown(const Point2 &amp;pos)</div><div class="ttdoc">If the mouse button was pressed down since the last frame, then this function will be called to notif...</div><div class="ttdef"><b>Definition:</b> <a href="graphics__app_8h_source.html#l00174">graphics_app.h:174</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_graphics_app_html_af58153eb104f53216a3e67de2a472f32"><div class="ttname"><a href="classmingfx_1_1_graphics_app.html#af58153eb104f53216a3e67de2a472f32">mingfx::GraphicsApp::framebuffer_height</a></div><div class="ttdeci">virtual int framebuffer_height()</div><div class="ttdoc">Returns the current height of the framebuffer in pixels.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html"><div class="ttname"><a href="classmingfx_1_1_point2.html">mingfx::Point2</a></div><div class="ttdoc">A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...</div><div class="ttdef"><b>Definition:</b> <a href="point2_8h_source.html#l00028">point2.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html"><div class="ttname"><a href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></div><div class="ttdoc">A 2D Vector with floating point coordinates, used for storing 2D translations, mouse movements,...</div><div class="ttdef"><b>Definition:</b> <a href="vector2_8h_source.html#l00028">vector2.h:28</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="apoint2_8h_html"><div class="ttname"><a href="point2_8h.html">point2.h</a></div></div>
+<div class="ttc" id="avector2_8h_html"><div class="ttname"><a href="vector2_8h.html">vector2.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/index.html b/dev/MinGfx/docs/html/index.html
new file mode 100644
index 0000000..f2bd267
--- /dev/null
+++ b/dev/MinGfx/docs/html/index.html
@@ -0,0 +1,120 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: MinGfx Toolkit Documentation</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="PageDoc"><div class="header">
+ <div class="headertitle">
+<div class="title">MinGfx Toolkit Documentation </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p><a class="anchor" id="mainpage"></a></p>
+<h1><a class="anchor" id="autotoc_md11"></a>
+Getting Started</h1>
+<ol type="1">
+<li><a class="el" href="installation.html">libMinGfx Installation Guide</a></li>
+<li><a class="el" href="installation.html#example">Create Your Own Graphics Program by Copying an Example</a></li>
+<li><a class="el" href="api.html">Bookmark the API - The MinGfx Programming Reference Organized by Topic</a></li>
+</ol>
+<h1><a class="anchor" id="autotoc_md12"></a>
+Programming Guide</h1>
+<ul>
+<li><a class="el" href="api.html">MinGfx Programming Reference</a></li>
+<li>Adding NanoGUI Elements (buttons, sliders, other GUI widgets)<ul>
+<li><a href="https://nanogui.readthedocs.io/en/latest/">NanoGUI Documentation</a></li>
+<li><a href="https://github.com/wjakob/nanogui">NanoGUI GitHub Repo</a></li>
+</ul>
+</li>
+<li>Drawing Using NanoVG (for 2D vector graphics)<ul>
+<li><a href="https://github.com/memononen/NanoVG">NanoVG Documentation</a></li>
+<li><a href="https://github.com/memononen/nanovg/blob/master/src/nanovg.h">nanovg.h &ndash; the best place to see all the possible commands</a></li>
+</ul>
+</li>
+<li>Drawing Using OpenGL (for 3D graphics)<ul>
+<li><a href="https://learnopengl.com/Introduction">learnopengl.com</a></li>
+<li><a href="https://www.google.com/search?q=opengl+3.3+guide">Google for OpenGL 3.3 Guide</a></li>
+</ul>
+</li>
+</ul>
+<h1><a class="anchor" id="autotoc_md13"></a>
+Overview</h1>
+<p>The MinGfx Toolkit is a minimal library for writing cross-platform (Windows, OSX, linux) graphics programs with modern OpenGL 3.3+ support. Application programmers should subclass from MinGfx::GraphicsApp, which provides callbacks for several styles of rendering and user interfaces. On-screen graphical user interfaces can be created with built-in support for NanoGUI. 2D vector graphics rendering is supported by linking with NanoVG. 3D graphics rendering is supported via MinGfx::Mesh, MinGfx::Shader, MinGfx::Texture2D, and related classes. Additionally, application programmers can do whatever custom 2D or 3D rendering is needed with direct calls to OpenGL.</p>
+<p>The library is maintained by Prof. Daniel Keefe (<a href="#" onclick="location.href='mai'+'lto:'+'dfk'+'@u'+'mn.'+'ed'+'u'; return false;">dfk@u<span style="display: none;">.nosp@m.</span>mn.e<span style="display: none;">.nosp@m.</span>du</a>) and is used for instructional purposes in UMN computer science courses (CSci-4611, CSci-3081W, ...) as well as some research projects. See LICENSE.txt for additional details. </p>
+</div></div><!-- PageDoc -->
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/installation.html b/dev/MinGfx/docs/html/installation.html
new file mode 100644
index 0000000..f7660d5
--- /dev/null
+++ b/dev/MinGfx/docs/html/installation.html
@@ -0,0 +1,206 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Installation Guide</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="PageDoc"><div class="header">
+ <div class="headertitle">
+<div class="title">Installation Guide </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p><a class="anchor" id="md_doc_installation"></a></p>
+<h1><a class="anchor" id="install-prereqs"></a>
+Prereqs</h1>
+<p>MinGfx is built using the cross-platform CMake tool. Before building MinGfx, you will need to install CMake version 3.9 or higher (<a href="https://cmake.org/">https://cmake.org/</a>). On Mac, you will need to have Xcode installed as well as the <a href="https://www.embarcadero.com/starthere/xe5/mobdevsetup/ios/en/installing_the_commandline_tools.html">optional Xcode command line tools</a>.</p>
+<p>If you haven't already, you'll want to clone the MinGfx source code using git, so make sure you have git installed as well.</p>
+<h1><a class="anchor" id="cmake-background"></a>
+Background for CMake Beginners</h1>
+<p>If you are new to CMake, this is the minimum background you should have before building MinGfx.</p>
+<p>CMake is a cross-platform tool for generating native Unix Makefiles and project workspaces (e.g., Xcode projects, Visual Studio solutions) for building projects. Projects use CMakeLists.txt files to describe how they should be built. These files provide input for the cmake application, which uses them to generate project files for a variety of development environments. CMake can generate Makefiles for building MinGfx on linux systems or project files for building MinGfx with popular IDEs (e.g., XCode, Visual Studio, Eclipse, CodeBLocks). <br />
+</p>
+<p>There are three versions of the cmake application that are provided with the install from Kitware. You can use any of these with MinGfx:</p><ol type="1">
+<li><em>cmake</em> is the command line version where all build options must be specified on the command line.</li>
+<li><em>ccmake</em> is a visual interface that runs in a terminal. This is nice because all of the available build options are listed for you to see at once, and you can simply press the SPACEBAR to turn them on/off or type in specific values. The downside for ccmake is that it does not have a separate log window, so status messages flash by so fast that you cannot read them, and input from spin-off cmake processes (like those used in the MinGfx configure step) are not captured correctly. It's possible to still use ccmake with MinGfx, but we do not recommend it.</li>
+<li><em>cmake-gui</em> is an OS-specific windowed version. Like ccmake, the GUI provides a useful list all of the available build options. Unlike ccmake, it also includes a nice scrollable log of all of the status messages. So, this is the preferred version for new users and for the first time you build a project.</li>
+</ol>
+<p>With CMake, it's best to do an out-of-source build. That means that when you start CMake you must tell it two paths: 1. the path to the MinGfx source tree, AND 2. the path to the place where you would like all the built files to be created. When running cmake-gui, these can be set interactively with a file selection dialog, but all three versions respond to command line options, and this is generally the easiest way to start up cmake. So, we suggest starting <em>cmake-gui</em> from the command line. First cd to the directory you wish to use for the built files, then pass a single required command line argument for the path to the MinGfx source tree. Usually, you will see this written as a series of 3 steps &ndash; the common idiom for cmake builds: </p><div class="fragment"><div class="line">// from within the root of the project&#39;s source directory</div>
+<div class="line">mkdir build</div>
+<div class="line">cd build</div>
+<div class="line">cmake-gui ..</div>
+</div><!-- fragment --><p>If you are using <em>cmake</em> you can pass a variety of other options to CMake on the command line with flags such as -D AUTOBUILD_NANOGUI=ON, to tell MinGfx to autobuild the nanogui library that it depends upon. With <em>cmake</em>, you can end up with a long string of arguments in order to setup the build you want. With <em>cmake-gui</em>, you set all of these build options within the user interface instead, and this is how we will proceed in the instructions that follow.</p>
+<h1><a class="anchor" id="build-tree"></a>
+Setup a New Graphics Build Tree</h1>
+<p>Here's a complete annotated list of steps to setup a new build tree for creating graphics programs. In truth, you don't need to create this entire build tree strucutre just to work with MinGfx, but this is good practice, and a good guide for students.</p>
+<h2><a class="anchor" id="autotoc_md2"></a>
+1. Create a Linux-Style Directory Tree</h2>
+<p>Libraries will get installed to a lib/ directory. Include files will go in include/, executables in bin/, and we'll put the source we are developing inside dev/.</p>
+<div class="fragment"><div class="line">mkdir -p /Users/keefe/courses/csci4611/sw</div>
+<div class="line">cd /Users/courses/csci4611/sw</div>
+<div class="line">mkdir lib</div>
+<div class="line">mkdir include</div>
+<div class="line">mkdir bin</div>
+<div class="line">mkdir dev</div>
+</div><!-- fragment --><p>IMPORTANT: On Windows, you will need to add the <code>bin</code> directory you just created to your PATH environment variable. If you have not done this before, you will find many instructions online. Here is one good description of <a href="https://www.java.com/en/download/help/path.xml">how to add a directory to the PATH environment variable on Windows</a>.</p>
+<h2><a class="anchor" id="autotoc_md3"></a>
+2. Download the MinGfx Project</h2>
+<p>To download use: </p><div class="fragment"><div class="line">cd dev</div>
+<div class="line">git clone http://github.com/ivlab/MinGfx</div>
+</div><!-- fragment --><h2><a class="anchor" id="autotoc_md4"></a>
+3. Create an Initial CMake Build Configuration</h2>
+<div class="fragment"><div class="line">cd MinGfx</div>
+<div class="line">mkdir build</div>
+<div class="line">cd build</div>
+<div class="line">cmake-gui ..</div>
+</div><!-- fragment --><p>Press the 'Configure' button. Then, select the Generator you would like to use from the list provided (e.g., Xcode, Visual Studio, Unix Makefiles). Click Done.</p>
+<p>Wait for CMake to do an initial configuration. This will populate an initial list of CMake and MinGfx build options. Each time you run configure, <em>cmake-gui</em> will display any new configuration options highlighted in <em>red</em>. So, do not be alarmed when the whole options window turns red during this first configure operation &ndash; that is normal behavior since at this point, all of the options are new.</p>
+<p>Do you see an error in the CMake output window? If so, don't worry about this yet, we'll come back to it in a minute.</p>
+<h2><a class="anchor" id="autotoc_md5"></a>
+4. Set the CMAKE_INSTALL_PREFIX Variable to the Root of Your Directory Tree</h2>
+<p>Now, using cmake-gui, scroll through the table of variables until you find the one named CMAKE_INSTALL_PREFIX. Click on it and edit its value to point to the root of the directory tree you created in Step 1. The root for the example tree used in Step 1 would be /Users/keefe/courses/csci4611/sw. In other words, the root is the last directory before you get to lib, include, bin, and dev.</p>
+<p>Once you make this change, you can press the Configure button again. It doesn't hurt to press Configure multiple times. You need to do it at least once after every change you make. Notice how the variables highlighted in red go away when you do this because they are no longer new options &ndash; cmake knows that you have already had a chance to see them once.</p>
+<h2><a class="anchor" id="autotoc_md6"></a>
+5. If Needed, Set AUTOBUILD_NANOGUI to ON and Build Dependencies</h2>
+<p>Now, take a look at the output window at the bottom of cmake-gui. If you see the following error there, then we'll address that next. If not, then nanogui must already be installed on your system, and you can skip to step 6. </p><div class="fragment"><div class="line">Searching for NanoGUI library...</div>
+<div class="line">Could NOT find NANOGUI (missing: NANOGUI_LIBRARIES)</div>
+<div class="line">CMake Error at cmake/UseNanoGUI.cmake:96 (message):</div>
+<div class="line">The NanoGUI library was not found on the system. You can: (1) install</div>
+<div class="line">NanoGUI yourself, (2) point cmake to an already-installed version of</div>
+<div class="line">NanoGUI by adding the installation prefix of NanoGUI to the</div>
+<div class="line">CMAKE_PREFIX_PATH environment variable, or (3) set AUTOBUILD_NANOGUI to ON</div>
+<div class="line">and run cmake configure again. AUTOBUILD_NANOGUI will: 1. download</div>
+<div class="line">NanoGUI, 2. build NanoGUI, and 3. install NanoGUI to the</div>
+<div class="line">CMAKE_INSTALL_PREFIX (currently set to</div>
+<div class="line">/Users/keefe/courses/tmp/MinGfx/build/install). If you want to use the</div>
+<div class="line">AUTOBUILD feature, adjust CMAKE_INSTALL_PREFIX as desired now, set</div>
+<div class="line">AUTOBUILD_NANOGUI to ON, and then run cmake configure again.</div>
+<div class="line">Call Stack (most recent call first):</div>
+<div class="line">src/CMakeLists.txt:80 (UseNanoGUI)</div>
+<div class="line">CMakeLists.txt:186 (include)</div>
+</div><!-- fragment --><p> This error tells us that cmake could not find the nanogui library pre-installed on our system. Luckily, MinGfx includes support for downloading, building, and installing nanogui for you using the AUTOBUILD_NANOGUI feature.</p>
+<p>Scroll through the list of CMake variables again until you find AUTOBUILD_NANOGUI and click on the checkbox next to it to turn it on. Now, click Configure again. This time the configure step will take a while, perhaps 5 minutes, to run because it will be downloading, building, and installing nanogui and all of its dependencies. <br />
+</p>
+<p>This step should finish without an error. If you do see an error and you are working with this as part of a UMN course, you may need to stop now and ask for help from a TA or on the class forum &ndash; perhaps there is something we haven't planned for in the particular setup of your computer.</p>
+<h2><a class="anchor" id="autotoc_md7"></a>
+6. Generate the Build System / Project Files</h2>
+<p>Finally, you are ready to press the Generate button. This is the step that will actually generate the Unix Makefiles, Visual Studio Solution File, or Xcode Project File needed to build MinGfx. <br />
+</p>
+<h2><a class="anchor" id="autotoc_md8"></a>
+7. Build MinGfx with the Specified Options</h2>
+<p>Click Open Project if you generated project files for an IDE, or if you generated Unix Makefiles return to your shell and the build directory. Now, build the project as you normally would in these enviornments. <br />
+</p>
+<p>For Xcode: <code>click the Triangle button to build the ALL_BUILD target</code></p>
+<p>For Visual Studio: In the Solution Explorer Window <code>right click on ALL_BUILD</code> and select <code>Build</code></p>
+<p>For Unix Makefiles: run <code>make all</code>.</p>
+<h2><a class="anchor" id="autotoc_md9"></a>
+8. Install the Library to your Directory Tree</h2>
+<p>For Xcode: <code>click on ALL_BUILD to reveal a dropdown list and select install</code> then <code>click the Triangle button</code></p>
+<p>For Visual Studio: In the Solution Explorer Window <code>right click on INSTALL</code> and select <code>Build</code>.</p>
+<p>For Unix Makefiles: run <code>make install</code>.</p>
+<p>To see if it worked take a look in the lib, include, and bin directories within the root of the tree you setup in Step 1. You should see the test programs inside bin/ and folders for MinVR-1.0 inside lib/ and include/.</p>
+<h2><a class="anchor" id="autotoc_md10"></a>
+9. Run a Test Program</h2>
+<p>For Xcode: <code>click on ALL_BUILD to reveal a dropdown list and select mingfx-test-gui-plus-opengl</code> then <code>click the Triangle button</code></p>
+<p>For Visual Studio: In the Solution Explorer Window <code>right click on mingfx-test-gui-plus-opengl</code> then selece <code>Set as StartUp Project</code>. Now, <code>click the green triangle button to run the program</code>. IMPORTANT NOTE: When the program runs it will need to find some .dlls that were installed to your <code>bin</code> directory in Step 8. So, the bin directory <em>must be in your windows PATH</em>. If you skipped this part of Step 1, go back and add <code>bin</code> to your PATH environment variable now. Then, you may need to restart Visual Studio for it to recognize the new setting.</p>
+<p>For Unix Makefiles: from within the build directory run: <code>tests/mingfx-gui-plus-opengl</code></p>
+<h1><a class="anchor" id="example"></a>
+Create Your Own Graphics Program</h1>
+<p><em>Prereq:</em> Before getting started, make sure you have installed MinGfx, going all the way through the 9th step above.</p>
+<p>The project in the MinGfx/example folder is an example of a stand-alone project that uses a separate cmake build system. This means we can copy it and move it out of the MinGfx source tree to serve as a starting point for your own project. Let's do that now.</p>
+<div class="fragment"><div class="line">cd /Users/courses/csci4611/sw/dev (or wherever you put your dev directory)</div>
+<div class="line">cp -r MinGfx/example/ mingfx-example</div>
+</div><!-- fragment --><p>Now, before we build the example, we need to make sure it knows where to find MinGfx. <br />
+ </p><div class="fragment"><div class="line">cd mingfx-example</div>
+<div class="line">open up the CMakeLists.txt file in your favorite text editor</div>
+</div><!-- fragment --><p>Near the top of the file, find the following lines </p><div class="fragment"><div class="line"># !!!!!!!!!!!!! EDIT THE FOLLOWING LINE AS NEEDED !!!!!!!!!!!!! </div>
+<div class="line">list(APPEND CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../build/install ../../..)</div>
+</div><!-- fragment --><p> and add a path to the end of the list to point to the ROOT of your directory tree, for example: </p><div class="fragment"><div class="line"># !!!!!!!!!!!!! EDIT THE FOLLOWING LINE AS NEEDED !!!!!!!!!!!!! </div>
+<div class="line">list(APPEND CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../build/install ../../.. /Users/keefe/courses/cs4611/sw)</div>
+</div><!-- fragment --><p>Now, we're ready to build this example using the same cmake idiom as before: </p><div class="fragment"><div class="line">mkdir build</div>
+<div class="line">cd build</div>
+<div class="line">cmake-gui ..</div>
+</div><!-- fragment --><p> Then, click <em>Configure</em>. If you want to install this example program, you may now edit the CMAKE_INSTALL_PREFIX as before and rerun <em>Configure</em>. It should not be necessary to change any of the other cmake variables for this example program.</p>
+<p>Next, click <em>Generate</em> to produce project files for your IDE or makefiles. <br />
+</p>
+<p>Next, build the example program within your IDE or by running <code>make</code>.</p>
+<p>Finally, you can run your first example graphics program with the command: </p><div class="fragment"><div class="line">./mingfx-example</div>
+</div><!-- fragment --><p>You can change the name of the executable, add more header and source files to the project and make other changes to the build process by editing the CMakeLists.txt file, but remember that after each change, you must run CMake's <em>Configure</em> and <em>Generate</em> steps again. <br />
+</p>
+<p>To reiterate the point above, if you are using an IDE, it is important to remember to add new files to your project by editing the CMakeLists.txt file NOT by using File-&gt;Add To Project.. or whatever option is provided inside your IDE. Since we using CMake to generate the IDE's project files, and we may want to switch to a different IDE or to Makefiles in the future, the CMakeLists.txt file needs to be treated as the master record of all of the build settings. </p>
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/installation_8md.html b/dev/MinGfx/docs/html/installation_8md.html
new file mode 100644
index 0000000..577aea3
--- /dev/null
+++ b/dev/MinGfx/docs/html/installation_8md.html
@@ -0,0 +1,87 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: doc/installation.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/installation.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/jquery.js b/dev/MinGfx/docs/html/jquery.js
new file mode 100644
index 0000000..103c32d
--- /dev/null
+++ b/dev/MinGfx/docs/html/jquery.js
@@ -0,0 +1,35 @@
+/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),N=ue(),A=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!==C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!==C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(F," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[S,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace(B,"$1"));return s[k]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[S,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[k]||(e[k]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===S&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[k]&&(v=Ce(v)),y&&!y[k]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(B,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=N[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[k]?i.push(a):o.push(a);(a=N(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=S+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t===C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument===C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(S=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(S=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=k.split("").sort(D).join("")===k,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);k.find=h,k.expr=h.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=h.uniqueSort,k.text=h.getText,k.isXMLDoc=h.isXML,k.contains=h.contains,k.escapeSelector=h.escape;var T=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&k(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},N=k.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1<i.call(n,e)!==r}):k.filter(n,e,r)}k.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?k.find.matchesSelector(r,e)?[r]:[]:k.find.matches(e,k.grep(t,function(e){return 1===e.nodeType}))},k.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(k(e).filter(function(){for(t=0;t<r;t++)if(k.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)k.find(e,i[t],n);return 1<r?k.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&N.test(e)?k(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(k.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&k(e);if(!N.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&k.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?k.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(k(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return T(e,"parentNode")},parentsUntil:function(e,t,n){return T(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return T(e,"nextSibling")},prevAll:function(e){return T(e,"previousSibling")},nextUntil:function(e,t,n){return T(e,"nextSibling",n)},prevUntil:function(e,t,n){return T(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(A(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},function(r,i){k.fn[r]=function(e,t){var n=k.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=k.filter(t,n)),1<this.length&&(O[r]||k.uniqueSort(n),H.test(r)&&n.reverse()),this.pushStack(n)}});var R=/[^\x20\t\r\n\f]+/g;function M(e){return e}function I(e){throw e}function W(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},k.each(e.match(R)||[],function(e,t){n[t]=!0}),n):k.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){k.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return k.each(arguments,function(e,t){var n;while(-1<(n=k.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<k.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},k.extend({Deferred:function(e){var o=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return k.Deferred(function(r){k.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,M,s),l(u,o,I,s)):(u++,t.call(e,l(u,o,M,s),l(u,o,I,s),l(u,o,M,o.notifyWith))):(a!==M&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){k.Deferred.exceptionHook&&k.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==I&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(k.Deferred.getStackHook&&(t.stackTrace=k.Deferred.getStackHook()),C.setTimeout(t))}}return k.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:M,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:M)),o[2][3].add(l(0,e,m(n)?n:I))}).promise()},promise:function(e){return null!=e?k.extend(e,a):a}},s={};return k.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(W(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)W(i[t],a(t),o.reject);return o.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&$.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){C.setTimeout(function(){throw e})};var F=k.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e)["catch"](function(e){k.readyException(e)}),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0)!==e&&0<--k.readyWait||F.resolveWith(E,[k])}}),k.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(k.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var _=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)_(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(k(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},z=/^-ms-/,U=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function V(e){return e.replace(z,"ms-").replace(U,X)}var G=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},G(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[V(t)]=n;else for(r in t)i[V(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(V):(t=V(t))in r?[t]:t.match(R)||[]).length;while(n--)delete r[t[n]]}(void 0===t||k.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!k.isEmptyObject(t)}};var Q=new Y,J=new Y,K=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:K.test(i)?JSON.parse(i):i)}catch(e){}J.set(e,t,n)}else n=void 0;return n}k.extend({hasData:function(e){return J.hasData(e)||Q.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return Q.access(e,t,n)},_removeData:function(e,t){Q.remove(e,t)}}),k.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=J.get(o),1===o.nodeType&&!Q.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=V(r.slice(5)),ee(o,r,i[r]));Q.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){J.set(this,n)}):_(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=J.get(o,n))?t:void 0!==(t=ee(o,n))?t:void 0;this.each(function(){J.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),k.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),r=n.length,i=n.shift(),o=k._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){k.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add(function(){Q.remove(e,[t+"queue",n])})})}}),k.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?k.queue(this[0],t):void 0===n?this:this.each(function(){var e=k.queue(this,t,n);k._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&k.dequeue(this,t)})},dequeue:function(e){return this.each(function(){k.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=k.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Q.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),re=["Top","Right","Bottom","Left"],ie=E.documentElement,oe=function(e){return k.contains(e.ownerDocument,e)},ae={composed:!0};ie.getRootNode&&(oe=function(e){return k.contains(e.ownerDocument,e)||e.getRootNode(ae)===e.ownerDocument});var se=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===k.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function le(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return k.css(e,t,"")},u=s(),l=n&&n[3]||(k.cssNumber[t]?"":"px"),c=e.nodeType&&(k.cssNumber[t]||"px"!==l&&+u)&&ne.exec(k.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)k.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,k.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ce={};function fe(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Q.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&se(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ce[s])||(o=a.body.appendChild(a.createElement(s)),u=k.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ce[s]=u)))):"none"!==n&&(l[c]="none",Q.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}k.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){se(this)?k(this).show():k(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Q.set(e[n],"globalEval",!t||Q.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me,xe,be=/<|&#?\w+;/;function we(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))k.merge(p,o.nodeType?[o]:o);else if(be.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+k.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;k.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<k.inArray(o,r))i&&i.push(o);else if(l=oe(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}me=E.createDocumentFragment().appendChild(E.createElement("div")),(xe=E.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),me.appendChild(xe),y.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){a=k.event.handlers.call(this,s,l),t=0;while((i=a[t++])&&!s.isPropagationStopped()){s.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!s.isImmediatePropagationStopped())s.rnamespace&&!1!==o.namespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((k.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<k(i,this).index(l):k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(k.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[k.expando]?e:new k.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click",ke),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Q.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},k.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},k.Event=function(e,t){if(!(this instanceof k.Event))return new k.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&k.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[k.expando]=!0},k.Event.prototype={constructor:k.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},k.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},k.event.addProp),k.each({focus:"focusin",blur:"focusout"},function(e,t){k.event.special[e]={setup:function(){return De(this,e,Ne),!1},trigger:function(){return De(this,e),!0},delegateType:t}}),k.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){k.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||k.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),k.fn.extend({on:function(e,t,n,r){return Ae(this,e,t,n,r)},one:function(e,t,n,r){return Ae(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,k(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each(function(){k.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,He=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)k.event.add(t,i,l[i][n]);J.hasData(e)&&(s=J.access(e),u=k.extend({},s),J.set(t,u))}}function Ie(n,r,i,o){r=g.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Le.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Ie(t,r,i,o)});if(f&&(t=(e=we(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=k.map(ve(e,"script"),Pe)).length;c<f;c++)u=e,c!==p&&(u=k.clone(u,!0,!0),s&&k.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,k.map(a,Re),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Q.access(u,"globalEval")&&k.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?k._evalUrl&&!u.noModule&&k._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):b(u.textContent.replace(He,""),u,l))}return n}function We(e,t,n){for(var r,i=t?k.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||k.cleanData(ve(r)),r.parentNode&&(n&&oe(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}k.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Me(o[r],a[r]);else Me(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return _(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Ie(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)})},prepend:function(){return Ie(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!qe.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(k.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Ie(this,arguments,function(e){var t=this.parentNode;k.inArray(this,n)<0&&(k.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),k.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){k.fn[e]=function(e){for(var t,n=[],r=k(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),k(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var $e=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),Fe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Be=new RegExp(re.join("|"),"i");function _e(e,t,n){var r,i,o,a,s=e.style;return(n=n||Fe(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||oe(e)||(a=k.style(e,t)),!y.pixelBoxStyles()&&$e.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(u){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",u.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ie.appendChild(s).appendChild(u);var e=C.getComputedStyle(u);n="1%"!==e.top,a=12===t(e.marginLeft),u.style.right="60%",o=36===t(e.right),r=36===t(e.width),u.style.position="absolute",i=12===t(u.offsetWidth/3),ie.removeChild(s),u=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s=E.createElement("div"),u=E.createElement("div");u.style&&(u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===u.style.backgroundClip,k.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),a},scrollboxSize:function(){return e(),i}}))}();var Ue=["Webkit","Moz","ms"],Xe=E.createElement("div").style,Ve={};function Ge(e){var t=k.cssProps[e]||Ve[e];return t||(e in Xe?e:Ve[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Ue.length;while(n--)if((e=Ue[n]+t)in Xe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},Ke={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var r=ne.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function et(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=k.css(e,n+re[a],!0,i)),r?("content"===n&&(u-=k.css(e,"padding"+re[a],!0,i)),"margin"!==n&&(u-=k.css(e,"border"+re[a]+"Width",!0,i))):(u+=k.css(e,"padding"+re[a],!0,i),"padding"!==n?u+=k.css(e,"border"+re[a]+"Width",!0,i):s+=k.css(e,"border"+re[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function tt(e,t,n){var r=Fe(e),i=(!y.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),o=i,a=_e(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if($e.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===k.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+et(e,t,n||(i?"border":"content"),o,r,a)+"px"}function nt(e,t,n,r,i){return new nt.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=_e(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=V(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ne.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=V(t);return Qe.test(t)||(t=Ge(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=_e(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,u){k.cssHooks[u]={get:function(e,t,n){if(t)return!Ye.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,u,n):ue(e,Je,function(){return tt(e,u,n)})},set:function(e,t,n){var r,i=Fe(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,i),s=n?et(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-et(e,u,"border",!1,i)-.5)),s&&(r=ne.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=k.css(e,u)),Ze(0,t,s)}}}),k.cssHooks.marginLeft=ze(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(_e(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(i,o){k.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+re[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(k.cssHooks[i+o].set=Ze)}),k.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a<i;a++)o[t[a]]=k.css(e,t[a],!1,r);return o}return void 0!==n?k.style(e,t,n):k.css(e,t)},e,t,1<arguments.length)}}),((k.Tween=nt).prototype={constructor:nt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=nt.prototype.init,k.fx.step={};var rt,it,ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){it&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(lt):C.setTimeout(lt,k.fx.interval),k.fx.tick())}function ct(){return C.setTimeout(function(){rt=void 0}),rt=Date.now()}function ft(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=re[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function pt(e,t,n){for(var r,i=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function dt(o,e,t){var n,a,r=0,i=dt.prefilters.length,s=k.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=rt||ct(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:k.extend({},e),opts:k.extend(!0,{specialEasing:{},easing:k.easing._default},t),originalProperties:e,originalOptions:t,startTime:rt||ct(),duration:t.duration,tweens:[],createTween:function(e,t){var n=k.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=V(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=k.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=dt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(k._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return k.map(c,pt,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),k.fx.timer(k.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}k.Animation=k.extend(dt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return le(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(R);for(var n,r=0,i=e.length;r<i;r++)n=e[r],dt.tweeners[n]=dt.tweeners[n]||[],dt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&se(e),v=Q.get(e,"fxshow");for(r in n.queue||(null==(a=k._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,k.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],st.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||k.style(e,r)}if((u=!k.isEmptyObject(t))||!k.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Q.get(e,"display")),"none"===(c=k.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=k.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===k.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Q.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),Q.remove(e,"fxshow"),d)k.style(e,r,d[r])})),u=pt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?dt.prefilters.unshift(e):dt.prefilters.push(e)}}),k.speed=function(e,t,n){var r=e&&"object"==typeof e?k.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return k.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in k.fx.speeds?r.duration=k.fx.speeds[r.duration]:r.duration=k.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&k.dequeue(this,r.queue)},r},k.fn.extend({fadeTo:function(e,t,n,r){return this.filter(se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=k.isEmptyObject(t),o=k.speed(e,n,r),a=function(){var e=dt(this,k.extend({},t),o);(i||Q.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=k.timers,r=Q.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ut.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||k.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Q.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=k.timers,o=n?n.length:0;for(t.finish=!0,k.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),k.each(["toggle","show","hide"],function(e,r){var i=k.fn[r];k.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(ft(r,!0),e,t,n)}}),k.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){k.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),k.timers=[],k.fx.tick=function(){var e,t=0,n=k.timers;for(rt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||k.fx.stop(),rt=void 0},k.fx.timer=function(e){k.timers.push(e),k.fx.start()},k.fx.interval=13,k.fx.start=function(){it||(it=!0,lt())},k.fx.stop=function(){it=null},k.fx.speeds={slow:600,fast:200,_default:400},k.fn.delay=function(r,e){return r=k.fx&&k.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},ot=E.createElement("input"),at=E.createElement("select").appendChild(E.createElement("option")),ot.type="checkbox",y.checkOn=""!==ot.value,y.optSelected=at.selected,(ot=E.createElement("input")).value="t",ot.type="radio",y.radioValue="t"===ot.value;var ht,gt=k.expr.attrHandle;k.fn.extend({attr:function(e,t){return _(this,k.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(R);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var a=gt[t]||k.find.attr;gt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=gt[o],gt[o]=r,r=null!=a(e,t,n)?o:null,gt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(R)||[]).join(" ")}function xt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(R)||[]}k.fn.extend({prop:function(e,t){return _(this,k.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).addClass(t.call(this,e,xt(this)))});if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).removeClass(t.call(this,e,xt(this)))});if(!arguments.length)return this.attr("class","");if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){k(this).toggleClass(i.call(this,e,xt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=k(this),r=bt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=xt(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+mt(xt(n))+" ").indexOf(t))return!0;return!1}});var wt=/\r/g;k.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,k(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=k.map(t,function(e){return null==e?"":e+""})),(r=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=k.valHooks[t.type]||k.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(wt,""):null==e?"":e:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=k(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=k.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<k.inArray(k.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<k.inArray(k(e).val(),t)}},y.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var Tt=/^(?:focusinfocus|focusoutblur)$/,Ct=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!Tt.test(d+k.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[k.expando]?e:new k.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:k.makeArray(t,[e]),c=k.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,Tt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Q.get(o,"events")||{})[e.type]&&Q.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&G(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!G(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),k.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Ct),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Ct),k.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),y.focusin||k.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){k.event.simulate(r,e.target,k.event.fix(e))};k.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Q.access(e,r);t||e.addEventListener(n,i,!0),Q.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Q.access(e,r)-1;t?Q.access(e,r,t):(e.removeEventListener(n,i,!0),Q.remove(e,r))}}});var Et=C.location,kt=Date.now(),St=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var Nt=/\[\]$/,At=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function qt(n,e,r,i){var t;if(Array.isArray(e))k.each(e,function(e,t){r||Nt.test(n)?i(n,t):qt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)qt(n+"["+t+"]",e[t],r,i)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)qt(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(At,"\r\n")}}):{name:t.name,value:n.replace(At,"\r\n")}}).get()}});var Lt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Rt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Ft=E.createElement("a");function Bt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(R)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function _t(t,i,o,a){var s={},u=t===Wt;function l(e){var r;return s[e]=!0,k.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function zt(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Ft.href=Et.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,k.ajaxSettings),t):zt(k.ajaxSettings,e)},ajaxPrefilter:Bt(It),ajaxTransport:Bt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=k.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?k(y):k.event,x=k.Deferred(),b=k.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Pt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace(Mt,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(R)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Ft.protocol+"//"+Ft.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=k.param(v.data,v.traditional)),_t(It,v,t,T),h)return T;for(i in(g=k.event&&v.global)&&0==k.active++&&k.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Rt.test(v.type),f=v.url.replace(Ht,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Lt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(St.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Ot,"$1"),o=(St.test(f)?"&":"?")+"_="+kt+++o),v.url=f+o),v.ifModified&&(k.lastModified[f]&&T.setRequestHeader("If-Modified-Since",k.lastModified[f]),k.etag[f]&&T.setRequestHeader("If-None-Match",k.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+$t+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=_t(Wt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(k.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(k.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--k.active||k.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,i){k[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:i,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e,t){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Xt=k.ajaxSettings.xhr();y.cors=!!Xt&&"withCredentials"in Xt,y.ajax=Xt=!!Xt,k.ajaxTransport(function(i){var o,a;if(y.cors||Xt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Ut[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=mt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&k.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?k("<div>").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),k.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),k.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||k.guid++,i},k.holdReady=function(e){e?k.readyWait++:k.ready(!0)},k.isArray=Array.isArray,k.parseJSON=JSON.parse,k.nodeName=A,k.isFunction=m,k.isWindow=x,k.camelCase=V,k.type=w,k.now=Date.now,k.isNumeric=function(e){var t=k.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return k});var Qt=C.jQuery,Jt=C.$;return k.noConflict=function(e){return C.$===k&&(C.$=Jt),e&&C.jQuery===k&&(C.jQuery=Qt),k},e||(C.jQuery=C.$=k),k});
+/*! jQuery UI - v1.12.1 - 2019-01-27
+* http://jqueryui.com
+* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/resizable.js, widgets/mouse.js
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}t.ui=t.ui||{},t.ui.version="1.12.1";var i=0,s=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,n,o=s.call(arguments,1),a=0,r=o.length;r>a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,m,g,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),x={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,m=_.offset,g=t.extend({},m),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),x[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?g.left+=p:"center"===n.at[0]&&(g.left+=p/2),"bottom"===n.at[1]?g.top+=f:"center"===n.at[1]&&(g.top+=f/2),u=e(x.at,p,f),g.left+=u[0],g.top+=u[1],this.each(function(){var s,r,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),k=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},g),T=e(x.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=T[0],D.top+=T[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:l,elemHeight:c,collisionPosition:s,collisionWidth:k,collisionHeight:C,offset:[u[0]+T[0],u[1]+T[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=m.left-D.left,i=e+p-l,s=m.top-D.top,r=s+f-c,u={target:{element:v,left:m.left,top:m.top,width:p,height:f},element:{element:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("<div>"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element
+},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/**
+ * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler
+ * Licensed under MIT
+ * @author Ariel Flesler
+ * @version 2.1.2
+ */
+;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1<b.axis.length;u&&(d/=2);b.offset=h(b.offset);b.over=h(b.over);return this.each(function(){function k(a){var k=$.extend({},b,{queue:!0,duration:d,complete:a&&function(){a.call(q,e,b)}});r.animate(f,k)}if(null!==a){var l=n(this),q=l?this.contentWindow||window:this,r=$(q),e=a,f={},t;switch(typeof e){case "number":case "string":if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(e)){e= h(e);break}e=l?$(e):$(e,q);case "object":if(e.length===0)return;if(e.is||e.style)t=(e=$(e)).offset()}var v=$.isFunction(b.offset)&&b.offset(q,e)||b.offset;$.each(b.axis.split(""),function(a,c){var d="x"===c?"Left":"Top",m=d.toLowerCase(),g="scroll"+d,h=r[g](),n=p.max(q,c);t?(f[g]=t[m]+(l?0:h-r.offset()[m]),b.margin&&(f[g]-=parseInt(e.css("margin"+d),10)||0,f[g]-=parseInt(e.css("border"+d+"Width"),10)||0),f[g]+=v[m]||0,b.over[m]&&(f[g]+=e["x"===c?"width":"height"]()*b.over[m])):(d=e[m],f[g]=d.slice&& "%"===d.slice(-1)?parseFloat(d)/100*n:d);b.limit&&/^\d+$/.test(f[g])&&(f[g]=0>=f[g]?0:Math.min(f[g],n));!a&&1<b.axis.length&&(h===f[g]?f={}:u&&(k(b.onAfterFirst),f={}))});k(b.onAfter)}})};p.max=function(a,d){var b="x"===d?"Width":"Height",h="scroll"+b;if(!n(a))return a[h]-$(a)[b.toLowerCase()]();var b="client"+b,k=a.ownerDocument||a.document,l=k.documentElement,k=k.body;return Math.max(l[h],k[h])-Math.min(l[b],k[b])};$.Tween.propHooks.scrollLeft=$.Tween.propHooks.scrollTop={get:function(a){return $(a.elem)[a.prop]()}, set:function(a){var d=this.get(a);if(a.options.interrupt&&a._last&&a._last!==d)return $(a.elem).stop();var b=Math.round(a.now);d!==b&&($(a.elem)[a.prop](b),a._last=this.get(a))}};return p});
+/*!
+ PowerTip v1.3.1 (2018-04-15)
+ https://stevenbenner.github.io/jquery-powertip/
+ Copyright (c) 2018 Steven Benner (http://stevenbenner.com/).
+ Released under MIT license.
+ https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt
+*/
+(function(root,factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory)}else if(typeof module==="object"&&module.exports){module.exports=factory(require("jquery"))}else{factory(root.jQuery)}})(this,function($){var $document=$(document),$window=$(window),$body=$("body");var DATA_DISPLAYCONTROLLER="displayController",DATA_HASACTIVEHOVER="hasActiveHover",DATA_FORCEDOPEN="forcedOpen",DATA_HASMOUSEMOVE="hasMouseMove",DATA_MOUSEONTOTIP="mouseOnToPopup",DATA_ORIGINALTITLE="originalTitle",DATA_POWERTIP="powertip",DATA_POWERTIPJQ="powertipjq",DATA_POWERTIPTARGET="powertiptarget",EVENT_NAMESPACE=".powertip",RAD2DEG=180/Math.PI,MOUSE_EVENTS=["click","dblclick","mousedown","mouseup","mousemove","mouseover","mouseout","mouseenter","mouseleave","contextmenu"];var session={tooltips:null,isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,closeDelayTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var Collision={none:0,top:1,bottom:2,left:4,right:8};$.fn.powerTip=function(opts,arg){var targetElements=this,options,tipController;if(!targetElements.length){return targetElements}if($.type(opts)==="string"&&$.powerTip[opts]){return $.powerTip[opts].call(targetElements,targetElements,arg)}options=$.extend({},$.fn.powerTip.defaults,opts);tipController=new TooltipController(options);initTracking();targetElements.each(function elementSetup(){var $this=$(this),dataPowertip=$this.data(DATA_POWERTIP),dataElem=$this.data(DATA_POWERTIPJQ),dataTarget=$this.data(DATA_POWERTIPTARGET),title=$this.attr("title");if(!dataPowertip&&!dataTarget&&!dataElem&&title){$this.data(DATA_POWERTIP,title);$this.data(DATA_ORIGINALTITLE,title);$this.removeAttr("title")}$this.data(DATA_DISPLAYCONTROLLER,new DisplayController($this,options,tipController))});if(!options.manual){$.each(options.openEvents,function(idx,evt){if($.inArray(evt,options.closeEvents)>-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference<options.intentSensitivity){cancelClose();closeAnyDelayed();tipController.showTip(element)}else{session.previousX=session.currentX;session.previousY=session.currentY;openTooltip()}}function cancelTimer(stopClose){hoverTimer=clearTimeout(hoverTimer);if(session.closeDelayTimeout&&myCloseDelay===session.closeDelayTimeout||stopClose){cancelClose()}}function cancelClose(){session.closeDelayTimeout=clearTimeout(session.closeDelayTimeout);session.delayInProgress=false}function closeAnyDelayed(){if(session.delayInProgress&&session.activeHover&&!session.activeHover.is(element)){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide(true)}}function repositionTooltip(){tipController.resetPosition(element)}this.show=openTooltip;this.hide=closeTooltip;this.cancel=cancelTimer;this.resetPosition=repositionTooltip}function PlacementCalculator(){function computePlacementCoords(element,placement,tipWidth,tipHeight,offset){var placementBase=placement.split("-")[0],coords=new CSSCoordinates,position;if(isSvgElement(element)){position=getSvgPlacement(element,placementBase)}else{position=getHtmlPlacement(element,placementBase)}switch(placement){case"n":coords.set("left",position.left-tipWidth/2);coords.set("bottom",session.windowHeight-position.top+offset);break;case"e":coords.set("left",position.left+offset);coords.set("top",position.top-tipHeight/2);break;case"s":coords.set("left",position.left-tipWidth/2);coords.set("top",position.top+offset);break;case"w":coords.set("top",position.top-tipHeight/2);coords.set("right",session.windowWidth-position.left+offset);break;case"nw":coords.set("bottom",session.windowHeight-position.top+offset);coords.set("right",session.windowWidth-position.left-20);break;case"nw-alt":coords.set("left",position.left);coords.set("bottom",session.windowHeight-position.top+offset);break;case"ne":coords.set("left",position.left-20);coords.set("bottom",session.windowHeight-position.top+offset);break;case"ne-alt":coords.set("bottom",session.windowHeight-position.top+offset);coords.set("right",session.windowWidth-position.left);break;case"sw":coords.set("top",position.top+offset);coords.set("right",session.windowWidth-position.left-20);break;case"sw-alt":coords.set("left",position.left);coords.set("top",position.top+offset);break;case"se":coords.set("left",position.left-20);coords.set("top",position.top+offset);break;case"se-alt":coords.set("top",position.top+offset);coords.set("right",session.windowWidth-position.left);break}return coords}function getHtmlPlacement(element,placement){var objectOffset=element.offset(),objectWidth=element.outerWidth(),objectHeight=element.outerHeight(),left,top;switch(placement){case"n":left=objectOffset.left+objectWidth/2;top=objectOffset.top;break;case"e":left=objectOffset.left+objectWidth;top=objectOffset.top+objectHeight/2;break;case"s":left=objectOffset.left+objectWidth/2;top=objectOffset.top+objectHeight;break;case"w":left=objectOffset.left;top=objectOffset.top+objectHeight/2;break;case"nw":left=objectOffset.left;top=objectOffset.top;break;case"ne":left=objectOffset.left+objectWidth;top=objectOffset.top;break;case"sw":left=objectOffset.left;top=objectOffset.top+objectHeight;break;case"se":left=objectOffset.left+objectWidth;top=objectOffset.top+objectHeight;break}return{top:top,left:left}}function getSvgPlacement(element,placement){var svgElement=element.closest("svg")[0],domElement=element[0],point=svgElement.createSVGPoint(),boundingBox=domElement.getBBox(),matrix=domElement.getScreenCTM(),halfWidth=boundingBox.width/2,halfHeight=boundingBox.height/2,placements=[],placementKeys=["nw","n","ne","e","se","s","sw","w"],coords,rotation,steps,x;function pushPlacement(){placements.push(point.matrixTransform(matrix))}point.x=boundingBox.x;point.y=boundingBox.y;pushPlacement();point.x+=halfWidth;pushPlacement();point.x+=halfWidth;pushPlacement();point.y+=halfHeight;pushPlacement();point.y+=halfHeight;pushPlacement();point.x-=halfWidth;pushPlacement();point.x-=halfWidth;pushPlacement();point.y-=halfHeight;pushPlacement();if(placements[0].y!==placements[1].y||placements[0].x!==placements[7].x){rotation=Math.atan2(matrix.b,matrix.a)*RAD2DEG;steps=Math.ceil((rotation%360-22.5)/45);if(steps<1){steps+=8}while(steps--){placementKeys.push(placementKeys.shift())}}for(x=0;x<placements.length;x++){if(placementKeys[x]===placement){coords=placements[x];break}}return{top:coords.y+session.scrollTop,left:coords.x+session.scrollLeft}}this.compute=computePlacementCoords}function TooltipController(options){var placementCalculator=new PlacementCalculator,tipElement=$("#"+options.popupId);if(tipElement.length===0){tipElement=$("<div/>",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.top<viewportTop||Math.abs(coords.bottom-session.windowHeight)-elementHeight<viewportTop){collisions|=Collision.top}if(coords.top+elementHeight>viewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.left<viewportLeft||coords.right+elementWidth>viewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right<viewportLeft){collisions|=Collision.right}return collisions}function countFlags(value){var count=0;while(value){value&=value-1;count++}return count}return $.powerTip});/*!
+ * jQuery UI Touch Punch 0.2.3
+ *
+ * Copyright 2011–2014, Dave Furfero
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ * jquery.ui.mouse.js
+ */
+!function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017
+ * http://www.smartmenus.org/
+ * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("<span/>").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],$('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y<o.upEnd)&&a.eq(o.up?1:0).show(),o.y==n)mouse&&a.eq(o.up?0:1).hide(),this.menuScrollStop(t);else if(!e){this.opts.scrollAccelerate&&o.step<this.opts.scrollStep&&(o.step+=.2);var h=this;this.scrollTimeout=requestAnimationFrame(function(){h.menuScroll(t)})}},menuScrollMousewheel:function(t,e){if(this.getClosestMenu(e.target)==t[0]){e=e.originalEvent;var i=(e.wheelDelta||-e.detail)>0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file
diff --git a/dev/MinGfx/docs/html/mainpage_8md.html b/dev/MinGfx/docs/html/mainpage_8md.html
new file mode 100644
index 0000000..15b0292
--- /dev/null
+++ b/dev/MinGfx/docs/html/mainpage_8md.html
@@ -0,0 +1,87 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: doc/mainpage.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">doc/mainpage.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/matrix4_8h.html b/dev/MinGfx/docs/html/matrix4_8h.html
new file mode 100644
index 0000000..9c4a1b9
--- /dev/null
+++ b/dev/MinGfx/docs/html/matrix4_8h.html
@@ -0,0 +1,139 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/matrix4.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">matrix4.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;iostream&gt;</code><br />
+<code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector3_8h_source.html">vector3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ray_8h_source.html">ray.h</a>&quot;</code><br />
+</div>
+<p><a href="matrix4_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be compatible with OpenGL. <a href="classmingfx_1_1_matrix4.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae5708e414f585dde2a5418ddae259a57"><td class="memItemLeft" align="right" valign="top">Matrix4&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">mingfx::operator*</a> (const Matrix4 &amp;m, const float &amp;s)</td></tr>
+<tr class="memdesc:ae5708e414f585dde2a5418ddae259a57"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply matrix and scalar, returns the new matrix. <a href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">More...</a><br /></td></tr>
+<tr class="separator:ae5708e414f585dde2a5418ddae259a57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a061ff38340cf1aad4612790b0a600aeb"><td class="memItemLeft" align="right" valign="top">Matrix4&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a061ff38340cf1aad4612790b0a600aeb">mingfx::operator*</a> (const float &amp;s, const Matrix4 &amp;m)</td></tr>
+<tr class="memdesc:a061ff38340cf1aad4612790b0a600aeb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply matrix and scalar, returns the new matrix. <a href="namespacemingfx.html#a061ff38340cf1aad4612790b0a600aeb">More...</a><br /></td></tr>
+<tr class="separator:a061ff38340cf1aad4612790b0a600aeb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b8dabff5d6c9ddcef5e15b0ef807c80"><td class="memItemLeft" align="right" valign="top">Point3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a5b8dabff5d6c9ddcef5e15b0ef807c80">mingfx::operator*</a> (const Matrix4 &amp;m, const Point3 &amp;p)</td></tr>
+<tr class="memdesc:a5b8dabff5d6c9ddcef5e15b0ef807c80"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply matrix and point, returns the new point. <a href="namespacemingfx.html#a5b8dabff5d6c9ddcef5e15b0ef807c80">More...</a><br /></td></tr>
+<tr class="separator:a5b8dabff5d6c9ddcef5e15b0ef807c80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abb2cfd42e696494e4797d8f7e11f6d77"><td class="memItemLeft" align="right" valign="top">Vector3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#abb2cfd42e696494e4797d8f7e11f6d77">mingfx::operator*</a> (const Matrix4 &amp;m, const Vector3 &amp;v)</td></tr>
+<tr class="memdesc:abb2cfd42e696494e4797d8f7e11f6d77"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply matrix and vector, returns the new vector. <a href="namespacemingfx.html#abb2cfd42e696494e4797d8f7e11f6d77">More...</a><br /></td></tr>
+<tr class="separator:abb2cfd42e696494e4797d8f7e11f6d77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aadc0e86a31d54469e730669067b102c2"><td class="memItemLeft" align="right" valign="top">Matrix4&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aadc0e86a31d54469e730669067b102c2">mingfx::operator*</a> (const Matrix4 &amp;m1, const Matrix4 &amp;m2)</td></tr>
+<tr class="memdesc:aadc0e86a31d54469e730669067b102c2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two matrices, returns the result. <a href="namespacemingfx.html#aadc0e86a31d54469e730669067b102c2">More...</a><br /></td></tr>
+<tr class="separator:aadc0e86a31d54469e730669067b102c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1af1c07624961984759120b7af7f9ce4"><td class="memItemLeft" align="right" valign="top">Ray&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a1af1c07624961984759120b7af7f9ce4">mingfx::operator*</a> (const Matrix4 &amp;m, const Ray &amp;r)</td></tr>
+<tr class="memdesc:a1af1c07624961984759120b7af7f9ce4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply matrix and the point and vector portions of the ray, returns the new ray. <a href="namespacemingfx.html#a1af1c07624961984759120b7af7f9ce4">More...</a><br /></td></tr>
+<tr class="separator:a1af1c07624961984759120b7af7f9ce4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1584104dea1f0a5636c868b67ddf6b10"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a1584104dea1f0a5636c868b67ddf6b10">mingfx::operator&lt;&lt;</a> (std::ostream &amp;os, const Matrix4 &amp;m)</td></tr>
+<tr class="separator:a1584104dea1f0a5636c868b67ddf6b10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05fc1c0b2b6011283c019242d6a2de74"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a05fc1c0b2b6011283c019242d6a2de74">mingfx::operator&gt;&gt;</a> (std::istream &amp;is, Matrix4 &amp;m)</td></tr>
+<tr class="separator:a05fc1c0b2b6011283c019242d6a2de74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/matrix4_8h_source.html b/dev/MinGfx/docs/html/matrix4_8h_source.html
new file mode 100644
index 0000000..2976e51
--- /dev/null
+++ b/dev/MinGfx/docs/html/matrix4_8h_source.html
@@ -0,0 +1,286 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/matrix4.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">matrix4.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="matrix4_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2017, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_MATRIX4_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_MATRIX4_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; </div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector3_8h.html">vector3.h</a>&quot;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ray_8h.html">ray.h</a>&quot;</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
+<div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html"> 50</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> {</div>
+<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="keyword">public</span>: </div>
+<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; </div>
+<div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22"> 54</a></span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">Matrix4</a>();</div>
+<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; </div>
+<div class="line"><a name="l00058"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a09a366a3ef940ff355f8d5c521baa57d"> 58</a></span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html#a09a366a3ef940ff355f8d5c521baa57d">Matrix4</a>(<span class="keyword">const</span> <span class="keywordtype">float</span>* a);</div>
+<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; </div>
+<div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a0abaeb690794c4a55e74c9b5fd82d138"> 62</a></span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html#a0abaeb690794c4a55e74c9b5fd82d138">Matrix4</a>(<span class="keyword">const</span> std::vector&lt;float&gt; &amp;a);</div>
+<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; </div>
+<div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a4bcf311614006c551f57d2b0dcd32d87"> 65</a></span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html#a4bcf311614006c551f57d2b0dcd32d87">Matrix4</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; m2);</div>
+<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
+<div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a8853a6b3fd0d08f1def5c9921bd47933"> 68</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_matrix4.html#a8853a6b3fd0d08f1def5c9921bd47933">~Matrix4</a>();</div>
+<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; </div>
+<div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a9ec2ee167a450cd7b992384e4cc5bb73"> 71</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_matrix4.html#a9ec2ee167a450cd7b992384e4cc5bb73">operator==</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; m2) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; </div>
+<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#ab186b0ae1ae669346c0718c2489cd71b"> 74</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_matrix4.html#ab186b0ae1ae669346c0718c2489cd71b">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; m2) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; </div>
+<div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a9ad8a8bc180ce213956d6d7d3fa19770"> 77</a></span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; <a class="code" href="classmingfx_1_1_matrix4.html#a9ad8a8bc180ce213956d6d7d3fa19770">operator=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; m2);</div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
+<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; </div>
+<div class="line"><a name="l00082"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a2b7b30f23f08d70e83c7b7e01945dd3c"> 82</a></span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> * <a class="code" href="classmingfx_1_1_matrix4.html#a2b7b30f23f08d70e83c7b7e01945dd3c">value_ptr</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; </div>
+<div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#acd64f0db45e255d61dde4f6fa10a4127"> 86</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_matrix4.html#acd64f0db45e255d61dde4f6fa10a4127">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; </div>
+<div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#af9b02807d81eac55d66238f246c53656"> 90</a></span>&#160; <span class="keywordtype">float</span>&amp; <a class="code" href="classmingfx_1_1_matrix4.html#af9b02807d81eac55d66238f246c53656">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i);</div>
+<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; </div>
+<div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#aa324d0cec02c452fb938af28725d5df9"> 94</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_matrix4.html#aa324d0cec02c452fb938af28725d5df9">operator()</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> row, <span class="keyword">const</span> <span class="keywordtype">int</span> col) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; </div>
+<div class="line"><a name="l00098"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a470bba77b8e3c47de7adaa18046e6096"> 98</a></span>&#160; <span class="keywordtype">float</span>&amp; <a class="code" href="classmingfx_1_1_matrix4.html#a470bba77b8e3c47de7adaa18046e6096">operator()</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> row, <span class="keyword">const</span> <span class="keywordtype">int</span> col);</div>
+<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; </div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; </div>
+<div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a7396dbff36cb732e1bd878020f52bbc3"> 105</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_matrix4.html#a7396dbff36cb732e1bd878020f52bbc3">ColumnToVector3</a>(<span class="keywordtype">int</span> c) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; </div>
+<div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#ae991be2b3bca290b44e676a9f8dc13bd"> 109</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_matrix4.html#ae991be2b3bca290b44e676a9f8dc13bd">ColumnToPoint3</a>(<span class="keywordtype">int</span> c) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; </div>
+<div class="line"><a name="l00111"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a4e9433f0482b5e9688c12398900608db"> 111</a></span>&#160; std::vector&lt;float&gt; <a class="code" href="classmingfx_1_1_matrix4.html#a4e9433f0482b5e9688c12398900608db">ToVector</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; </div>
+<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; </div>
+<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="comment">// --- Static Constructors for Special Matrices ---</span></div>
+<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; </div>
+<div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#add98bfa1cf6a10dbae0e8ae8defe728b"> 122</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#add98bfa1cf6a10dbae0e8ae8defe728b">FromRowMajorElements</a>(</div>
+<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> r1c1, <span class="keyword">const</span> <span class="keywordtype">float</span> r1c2, <span class="keyword">const</span> <span class="keywordtype">float</span> r1c3, <span class="keyword">const</span> <span class="keywordtype">float</span> r1c4,</div>
+<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> r2c1, <span class="keyword">const</span> <span class="keywordtype">float</span> r2c2, <span class="keyword">const</span> <span class="keywordtype">float</span> r2c3, <span class="keyword">const</span> <span class="keywordtype">float</span> r2c4,</div>
+<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> r3c1, <span class="keyword">const</span> <span class="keywordtype">float</span> r3c2, <span class="keyword">const</span> <span class="keywordtype">float</span> r3c3, <span class="keyword">const</span> <span class="keywordtype">float</span> r3c4,</div>
+<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> r4c1, <span class="keyword">const</span> <span class="keywordtype">float</span> r4c2, <span class="keyword">const</span> <span class="keywordtype">float</span> r4c3, <span class="keyword">const</span> <span class="keywordtype">float</span> r4c4</div>
+<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; );</div>
+<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; </div>
+<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="comment">// --- Model Transformations ---</span></div>
+<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; </div>
+<div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e"> 132</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e">Scale</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v);</div>
+<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; </div>
+<div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84"> 135</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">Translation</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v);</div>
+<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; </div>
+<div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a48615deb30590055c0aa9f207eee7f08"> 138</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#a48615deb30590055c0aa9f207eee7f08">RotationX</a>(<span class="keyword">const</span> <span class="keywordtype">float</span> radians);</div>
+<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; </div>
+<div class="line"><a name="l00141"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#aef94f0e9d298a7ba57e0119ef09b71b6"> 141</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#aef94f0e9d298a7ba57e0119ef09b71b6">RotationY</a>(<span class="keyword">const</span> <span class="keywordtype">float</span> radians);</div>
+<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; </div>
+<div class="line"><a name="l00144"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a4bf1dced8875fdc5827b5b8869e9de93"> 144</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#a4bf1dced8875fdc5827b5b8869e9de93">RotationZ</a>(<span class="keyword">const</span> <span class="keywordtype">float</span> radians);</div>
+<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; </div>
+<div class="line"><a name="l00147"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#acf4abaf4a45826f14b435edf80a8d0e0"> 147</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#acf4abaf4a45826f14b435edf80a8d0e0">Rotation</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;p, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v, <span class="keyword">const</span> <span class="keywordtype">float</span> a);</div>
+<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; </div>
+<div class="line"><a name="l00173"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d"> 173</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d">Align</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;a_p, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;a_v1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;a_v2,</div>
+<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;b_p, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;b_v1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;b_v2);</div>
+<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; </div>
+<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; </div>
+<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="comment">// --- View Matrices ---</span></div>
+<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; </div>
+<div class="line"><a name="l00183"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de"> 183</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">LookAt</a>(<a class="code" href="classmingfx_1_1_point3.html">Point3</a> eye, <a class="code" href="classmingfx_1_1_point3.html">Point3</a> target, <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> up);</div>
+<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; </div>
+<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="comment">// --- Projection Matrices ---</span></div>
+<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; </div>
+<div class="line"><a name="l00189"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e"> 189</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">Perspective</a>(<span class="keywordtype">float</span> fov_y_in_degrees, <span class="keywordtype">float</span> aspect_ratio, <span class="keywordtype">float</span> near_plane_dist, <span class="keywordtype">float</span> far_plane_dist);</div>
+<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; </div>
+<div class="line"><a name="l00192"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a8e2f7b50cd2c8853e007829df9863722"> 192</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#a8e2f7b50cd2c8853e007829df9863722">Frustum</a>(<span class="keywordtype">float</span> left, <span class="keywordtype">float</span> right, <span class="keywordtype">float</span> bottom, <span class="keywordtype">float</span> top, <span class="keywordtype">float</span> near_plane_dist, <span class="keywordtype">float</span> far_plane_dist);</div>
+<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; </div>
+<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="comment">// --- Inverse, Transposeand Other General Matrix Functions ---</span></div>
+<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; </div>
+<div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#ab3f360906e15730eee621826b5f0bbc5"> 198</a></span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#ab3f360906e15730eee621826b5f0bbc5">Inverse</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; </div>
+<div class="line"><a name="l00204"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a9ad5c85784e84fa0a941361eaaae0250"> 204</a></span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#a9ad5c85784e84fa0a941361eaaae0250">Orthonormal</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; </div>
+<div class="line"><a name="l00207"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#afd1030205567d23d4a2d1240d8214850"> 207</a></span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#afd1030205567d23d4a2d1240d8214850">Transpose</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; </div>
+<div class="line"><a name="l00211"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a3d9898bfac2510a695df6b033054e481"> 211</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_matrix4.html#a3d9898bfac2510a695df6b033054e481">SubDeterminant</a>(<span class="keywordtype">int</span> exclude_row, <span class="keywordtype">int</span> exclude_col) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; </div>
+<div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a0d88ba8e15325d135157d115f2412e91"> 214</a></span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_matrix4.html#a0d88ba8e15325d135157d115f2412e91">Cofactor</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; </div>
+<div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="classmingfx_1_1_matrix4.html#a0127ebae92b50e4f10ebee8565b0248c"> 217</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_matrix4.html#a0127ebae92b50e4f10ebee8565b0248c">Determinant</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; </div>
+<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; </div>
+<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; </div>
+<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordtype">float</span> m[16];</div>
+<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;};</div>
+<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; </div>
+<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; </div>
+<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; </div>
+<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;<span class="comment">// ---------- Operator Overloads for Working with Points, Vectors, &amp; Matrices ---------- </span></div>
+<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; </div>
+<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; </div>
+<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160;<span class="comment">// --- Matrix multiplication for Points, Vectors, &amp; Matrices ---</span></div>
+<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; </div>
+<div class="line"><a name="l00233"></a><span class="lineno"><a class="line" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57"> 233</a></span>&#160;<a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; m, <span class="keyword">const</span> <span class="keywordtype">float</span>&amp; s);</div>
+<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; </div>
+<div class="line"><a name="l00236"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a061ff38340cf1aad4612790b0a600aeb"> 236</a></span>&#160;<a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <span class="keywordtype">float</span>&amp; s, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; m);</div>
+<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; </div>
+<div class="line"><a name="l00239"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a5b8dabff5d6c9ddcef5e15b0ef807c80"> 239</a></span>&#160;<a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; m, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; p);</div>
+<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; </div>
+<div class="line"><a name="l00242"></a><span class="lineno"><a class="line" href="namespacemingfx.html#abb2cfd42e696494e4797d8f7e11f6d77"> 242</a></span>&#160;<a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; m, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v);</div>
+<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; </div>
+<div class="line"><a name="l00245"></a><span class="lineno"><a class="line" href="namespacemingfx.html#aadc0e86a31d54469e730669067b102c2"> 245</a></span>&#160;<a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; m1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; m2);</div>
+<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; </div>
+<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; </div>
+<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; </div>
+<div class="line"><a name="l00250"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a1af1c07624961984759120b7af7f9ce4"> 250</a></span>&#160;<a class="code" href="classmingfx_1_1_ray.html">Ray</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a>&amp; m, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_ray.html">Ray</a>&amp; r);</div>
+<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; </div>
+<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160;<span class="comment">// --- Stream operators ---</span></div>
+<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; </div>
+<div class="line"><a name="l00254"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a1584104dea1f0a5636c868b67ddf6b10"> 254</a></span>&#160;std::ostream &amp; <a class="code" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">operator&lt;&lt; </a>( std::ostream &amp;os, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m);</div>
+<div class="line"><a name="l00255"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a05fc1c0b2b6011283c019242d6a2de74"> 255</a></span>&#160;std::istream &amp; <a class="code" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">operator&gt;&gt; </a>( std::istream &amp;is, <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m);</div>
+<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; </div>
+<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; </div>
+<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; </div>
+<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html"><div class="ttname"><a href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></div><div class="ttdoc">A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...</div><div class="ttdef"><b>Definition:</b> <a href="matrix4_8h_source.html#l00050">matrix4.h:50</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0127ebae92b50e4f10ebee8565b0248c"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0127ebae92b50e4f10ebee8565b0248c">mingfx::Matrix4::Determinant</a></div><div class="ttdeci">float Determinant() const</div><div class="ttdoc">Returns the determinant of the 4x4 matrix.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0232a58d20b1da5374cf8c72fb113a4e"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e">mingfx::Matrix4::Scale</a></div><div class="ttdeci">static Matrix4 Scale(const Vector3 &amp;v)</div><div class="ttdoc">Returns the scale matrix described by the vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a09a366a3ef940ff355f8d5c521baa57d"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a09a366a3ef940ff355f8d5c521baa57d">mingfx::Matrix4::Matrix4</a></div><div class="ttdeci">Matrix4(const float *a)</div><div class="ttdoc">Constructs a matrix given from an array of 16 floats in OpenGL matrix format (i.e....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0abaeb690794c4a55e74c9b5fd82d138"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0abaeb690794c4a55e74c9b5fd82d138">mingfx::Matrix4::Matrix4</a></div><div class="ttdeci">Matrix4(const std::vector&lt; float &gt; &amp;a)</div><div class="ttdoc">Constructs a matrix given from a vector of 16 floats in OpenGL matrix format (i.e....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0d88ba8e15325d135157d115f2412e91"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0d88ba8e15325d135157d115f2412e91">mingfx::Matrix4::Cofactor</a></div><div class="ttdeci">Matrix4 Cofactor() const</div><div class="ttdoc">Returns the cofactor matrix.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a0e34aee86758a0397074590b87712c5e"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e">mingfx::Matrix4::Perspective</a></div><div class="ttdeci">static Matrix4 Perspective(float fov_y_in_degrees, float aspect_ratio, float near_plane_dist, float far_plane_dist)</div><div class="ttdoc">Returns a perspective projection matrix equivalent to the one gluPerspective creates.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a2b7b30f23f08d70e83c7b7e01945dd3c"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a2b7b30f23f08d70e83c7b7e01945dd3c">mingfx::Matrix4::value_ptr</a></div><div class="ttdeci">const float * value_ptr() const</div><div class="ttdoc">Returns a pointer to the raw data array used to store the matrix. This is a 1D array of 16-elements s...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a3d9898bfac2510a695df6b033054e481"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a3d9898bfac2510a695df6b033054e481">mingfx::Matrix4::SubDeterminant</a></div><div class="ttdeci">float SubDeterminant(int exclude_row, int exclude_col) const</div><div class="ttdoc">Returns the determinant of the 3x3 matrix formed by excluding the specified row and column from the 4...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a4543695a6dfc996d0312b70c2eaa00de"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de">mingfx::Matrix4::LookAt</a></div><div class="ttdeci">static Matrix4 LookAt(Point3 eye, Point3 target, Vector3 up)</div><div class="ttdoc">Returns a view matrix that centers the camera at the 'eye' position and orients it to look at the des...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a470bba77b8e3c47de7adaa18046e6096"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a470bba77b8e3c47de7adaa18046e6096">mingfx::Matrix4::operator()</a></div><div class="ttdeci">float &amp; operator()(const int row, const int col)</div><div class="ttdoc">Access an individual element of the array using the syntax: Matrix4 mat; mat(1,2) = 1....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a48615deb30590055c0aa9f207eee7f08"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a48615deb30590055c0aa9f207eee7f08">mingfx::Matrix4::RotationX</a></div><div class="ttdeci">static Matrix4 RotationX(const float radians)</div><div class="ttdoc">Returns the rotation matrix about the x axis by the specified angle.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a4bcf311614006c551f57d2b0dcd32d87"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a4bcf311614006c551f57d2b0dcd32d87">mingfx::Matrix4::Matrix4</a></div><div class="ttdeci">Matrix4(const Matrix4 &amp;m2)</div><div class="ttdoc">Copy constructor.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a4bf1dced8875fdc5827b5b8869e9de93"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a4bf1dced8875fdc5827b5b8869e9de93">mingfx::Matrix4::RotationZ</a></div><div class="ttdeci">static Matrix4 RotationZ(const float radians)</div><div class="ttdoc">Returns the rotation matrix about the z axis by the specified angle.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a4e9433f0482b5e9688c12398900608db"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a4e9433f0482b5e9688c12398900608db">mingfx::Matrix4::ToVector</a></div><div class="ttdeci">std::vector&lt; float &gt; ToVector() const</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a50990f00b756d640670a0b02129afd22"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22">mingfx::Matrix4::Matrix4</a></div><div class="ttdeci">Matrix4()</div><div class="ttdoc">The default constructor creates an identity matrix:</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a7396dbff36cb732e1bd878020f52bbc3"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a7396dbff36cb732e1bd878020f52bbc3">mingfx::Matrix4::ColumnToVector3</a></div><div class="ttdeci">Vector3 ColumnToVector3(int c) const</div><div class="ttdoc">Returns the c-th column of the matrix as a Vector type, e.g.,: Vector3 xAxis = mat....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a8853a6b3fd0d08f1def5c9921bd47933"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a8853a6b3fd0d08f1def5c9921bd47933">mingfx::Matrix4::~Matrix4</a></div><div class="ttdeci">virtual ~Matrix4()</div><div class="ttdoc">Destructor.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a8e2f7b50cd2c8853e007829df9863722"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a8e2f7b50cd2c8853e007829df9863722">mingfx::Matrix4::Frustum</a></div><div class="ttdeci">static Matrix4 Frustum(float left, float right, float bottom, float top, float near_plane_dist, float far_plane_dist)</div><div class="ttdoc">Returns a projection matrix equivalent the one glFrustum creates.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a9ad5c85784e84fa0a941361eaaae0250"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a9ad5c85784e84fa0a941361eaaae0250">mingfx::Matrix4::Orthonormal</a></div><div class="ttdeci">Matrix4 Orthonormal() const</div><div class="ttdoc">Returns an orthonormal version of the matrix, i.e., guarantees that the rotational component of the m...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a9ad8a8bc180ce213956d6d7d3fa19770"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a9ad8a8bc180ce213956d6d7d3fa19770">mingfx::Matrix4::operator=</a></div><div class="ttdeci">Matrix4 &amp; operator=(const Matrix4 &amp;m2)</div><div class="ttdoc">Matrix assignment operator.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_a9ec2ee167a450cd7b992384e4cc5bb73"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#a9ec2ee167a450cd7b992384e4cc5bb73">mingfx::Matrix4::operator==</a></div><div class="ttdeci">bool operator==(const Matrix4 &amp;m2) const</div><div class="ttdoc">Check for &quot;equality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_aa324d0cec02c452fb938af28725d5df9"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#aa324d0cec02c452fb938af28725d5df9">mingfx::Matrix4::operator()</a></div><div class="ttdeci">float operator()(const int row, const int col) const</div><div class="ttdoc">Access an individual element of the array using the syntax: Matrix4 mat; float row1col2 = mat(1,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_ab186b0ae1ae669346c0718c2489cd71b"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#ab186b0ae1ae669346c0718c2489cd71b">mingfx::Matrix4::operator!=</a></div><div class="ttdeci">bool operator!=(const Matrix4 &amp;m2) const</div><div class="ttdoc">Check for &quot;inequality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_ab3f360906e15730eee621826b5f0bbc5"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#ab3f360906e15730eee621826b5f0bbc5">mingfx::Matrix4::Inverse</a></div><div class="ttdeci">Matrix4 Inverse() const</div><div class="ttdoc">Returns the inverse of the 4x4 matrix if it is nonsingular. If it is singular, then returns the ident...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_acd64f0db45e255d61dde4f6fa10a4127"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#acd64f0db45e255d61dde4f6fa10a4127">mingfx::Matrix4::operator[]</a></div><div class="ttdeci">float operator[](const int i) const</div><div class="ttdoc">Accesses the ith element of the raw data array used to store the matrix. This is a 1D array of 16-ele...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_acf4abaf4a45826f14b435edf80a8d0e0"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#acf4abaf4a45826f14b435edf80a8d0e0">mingfx::Matrix4::Rotation</a></div><div class="ttdeci">static Matrix4 Rotation(const Point3 &amp;p, const Vector3 &amp;v, const float a)</div><div class="ttdoc">Returns the rotation matrix around the vector v placed at point p, rotate by angle a.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_add98bfa1cf6a10dbae0e8ae8defe728b"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#add98bfa1cf6a10dbae0e8ae8defe728b">mingfx::Matrix4::FromRowMajorElements</a></div><div class="ttdeci">static Matrix4 FromRowMajorElements(const float r1c1, const float r1c2, const float r1c3, const float r1c4, const float r2c1, const float r2c2, const float r2c3, const float r2c4, const float r3c1, const float r3c2, const float r3c3, const float r3c4, const float r4c1, const float r4c2, const float r4c3, const float r4c4)</div><div class="ttdoc">Returns a matrix constructed from individual elements passed in row major order so that the matrix lo...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_ae61cdabb318a03cd4dae8a1c8ecafa4d"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d">mingfx::Matrix4::Align</a></div><div class="ttdeci">static Matrix4 Align(const Point3 &amp;a_p, const Vector3 &amp;a_v1, const Vector3 &amp;a_v2, const Point3 &amp;b_p, const Vector3 &amp;b_v1, const Vector3 &amp;b_v2)</div><div class="ttdoc">Creates a transformation matrix that maps a coordinate space, a, defined one point,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_ae82bab81df82dc03f5eb11e74ba1dd84"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84">mingfx::Matrix4::Translation</a></div><div class="ttdeci">static Matrix4 Translation(const Vector3 &amp;v)</div><div class="ttdoc">Returns the translation matrix described by the vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_ae991be2b3bca290b44e676a9f8dc13bd"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#ae991be2b3bca290b44e676a9f8dc13bd">mingfx::Matrix4::ColumnToPoint3</a></div><div class="ttdeci">Point3 ColumnToPoint3(int c) const</div><div class="ttdoc">Returns the c-th column of the matrix as a Vector type, e.g.,: Point3 pos = mat.getColumnAsPoint3(3);...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_aef94f0e9d298a7ba57e0119ef09b71b6"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#aef94f0e9d298a7ba57e0119ef09b71b6">mingfx::Matrix4::RotationY</a></div><div class="ttdeci">static Matrix4 RotationY(const float radians)</div><div class="ttdoc">Returns the rotation matrix about the y axis by the specified angle.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_af9b02807d81eac55d66238f246c53656"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#af9b02807d81eac55d66238f246c53656">mingfx::Matrix4::operator[]</a></div><div class="ttdeci">float &amp; operator[](const int i)</div><div class="ttdoc">Accesses the ith element of the raw data array used to store the matrix. This is a 1D array of 16-ele...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html_afd1030205567d23d4a2d1240d8214850"><div class="ttname"><a href="classmingfx_1_1_matrix4.html#afd1030205567d23d4a2d1240d8214850">mingfx::Matrix4::Transpose</a></div><div class="ttdeci">Matrix4 Transpose() const</div><div class="ttdoc">Returns the transpose of the matrix.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html"><div class="ttname"><a href="classmingfx_1_1_ray.html">mingfx::Ray</a></div><div class="ttdoc">Stores the mathematical object of a ray that begins at an origin (a 3D point) and points in a directi...</div><div class="ttdef"><b>Definition:</b> <a href="ray_8h_source.html#l00054">ray.h:54</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="anamespacemingfx_html_a6bc967741341f4f318a505d884192906"><div class="ttname"><a href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">mingfx::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a6eb31e6e81c6e29144799be4c9db404d"><div class="ttname"><a href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">mingfx::operator&gt;&gt;</a></div><div class="ttdeci">std::istream &amp; operator&gt;&gt;(std::istream &amp;is, Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_ae5708e414f585dde2a5418ddae259a57"><div class="ttname"><a href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">mingfx::operator*</a></div><div class="ttdeci">Matrix4 operator*(const Matrix4 &amp;m, const float &amp;s)</div><div class="ttdoc">Multiply matrix and scalar, returns the new matrix.</div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+<div class="ttc" id="aray_8h_html"><div class="ttname"><a href="ray_8h.html">ray.h</a></div></div>
+<div class="ttc" id="avector3_8h_html"><div class="ttname"><a href="vector3_8h.html">vector3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/menu.js b/dev/MinGfx/docs/html/menu.js
new file mode 100644
index 0000000..2fe2214
--- /dev/null
+++ b/dev/MinGfx/docs/html/menu.js
@@ -0,0 +1,51 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ 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.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+ */
+function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
+ function makeTree(data,relPath) {
+ var result='';
+ if ('children' in data) {
+ result+='<ul>';
+ for (var i in data.children) {
+ result+='<li><a href="'+relPath+data.children[i].url+'">'+
+ data.children[i].text+'</a>'+
+ makeTree(data.children[i],relPath)+'</li>';
+ }
+ result+='</ul>';
+ }
+ return result;
+ }
+
+ $('#main-nav').append(makeTree(menudata,relPath));
+ $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
+ if (searchEnabled) {
+ if (serverSide) {
+ $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.svg" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
+ } else {
+ $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.svg" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.svg" alt=""/></a></span></div></li>');
+ }
+ }
+ $('#main-menu').smartmenus();
+}
+/* @license-end */
diff --git a/dev/MinGfx/docs/html/menudata.js b/dev/MinGfx/docs/html/menudata.js
new file mode 100644
index 0000000..295196a
--- /dev/null
+++ b/dev/MinGfx/docs/html/menudata.js
@@ -0,0 +1,110 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ 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.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+*/
+var menudata={children:[
+{text:"Main Page",url:"index.html"},
+{text:"Related Pages",url:"pages.html"},
+{text:"Classes",url:"annotated.html",children:[
+{text:"Class List",url:"annotated.html"},
+{text:"Class Index",url:"classes.html"},
+{text:"Class Members",url:"functions.html",children:[
+{text:"All",url:"functions.html",children:[
+{text:"a",url:"functions.html#index_a"},
+{text:"b",url:"functions_b.html#index_b"},
+{text:"c",url:"functions_c.html#index_c"},
+{text:"d",url:"functions_d.html#index_d"},
+{text:"e",url:"functions_e.html#index_e"},
+{text:"f",url:"functions_f.html#index_f"},
+{text:"g",url:"functions_g.html#index_g"},
+{text:"h",url:"functions_h.html#index_h"},
+{text:"i",url:"functions_i.html#index_i"},
+{text:"l",url:"functions_l.html#index_l"},
+{text:"m",url:"functions_m.html#index_m"},
+{text:"n",url:"functions_n.html#index_n"},
+{text:"o",url:"functions_o.html#index_o"},
+{text:"p",url:"functions_p.html#index_p"},
+{text:"q",url:"functions_q.html#index_q"},
+{text:"r",url:"functions_r.html#index_r"},
+{text:"s",url:"functions_s.html#index_s"},
+{text:"t",url:"functions_t.html#index_t"},
+{text:"u",url:"functions_u.html#index_u"},
+{text:"v",url:"functions_v.html#index_v"},
+{text:"w",url:"functions_w.html#index_w"},
+{text:"x",url:"functions_x.html#index_x"},
+{text:"y",url:"functions_y.html#index_y"},
+{text:"z",url:"functions_z.html#index_z"},
+{text:"~",url:"functions_~.html#index__7E"}]},
+{text:"Functions",url:"functions_func.html",children:[
+{text:"a",url:"functions_func.html#index_a"},
+{text:"b",url:"functions_func_b.html#index_b"},
+{text:"c",url:"functions_func_c.html#index_c"},
+{text:"d",url:"functions_func_d.html#index_d"},
+{text:"e",url:"functions_func_e.html#index_e"},
+{text:"f",url:"functions_func_f.html#index_f"},
+{text:"g",url:"functions_func_g.html#index_g"},
+{text:"h",url:"functions_func_h.html#index_h"},
+{text:"i",url:"functions_func_i.html#index_i"},
+{text:"l",url:"functions_func_l.html#index_l"},
+{text:"m",url:"functions_func_m.html#index_m"},
+{text:"n",url:"functions_func_n.html#index_n"},
+{text:"o",url:"functions_func_o.html#index_o"},
+{text:"p",url:"functions_func_p.html#index_p"},
+{text:"q",url:"functions_func_q.html#index_q"},
+{text:"r",url:"functions_func_r.html#index_r"},
+{text:"s",url:"functions_func_s.html#index_s"},
+{text:"t",url:"functions_func_t.html#index_t"},
+{text:"u",url:"functions_func_u.html#index_u"},
+{text:"v",url:"functions_func_v.html#index_v"},
+{text:"w",url:"functions_func_w.html#index_w"},
+{text:"x",url:"functions_func_x.html#index_x"},
+{text:"y",url:"functions_func_y.html#index_y"},
+{text:"z",url:"functions_func_z.html#index_z"},
+{text:"~",url:"functions_func_~.html#index__7E"}]},
+{text:"Variables",url:"functions_vars.html",children:[
+{text:"a",url:"functions_vars.html#index_a"},
+{text:"c",url:"functions_vars.html#index_c"},
+{text:"d",url:"functions_vars.html#index_d"},
+{text:"e",url:"functions_vars.html#index_e"},
+{text:"f",url:"functions_vars.html#index_f"},
+{text:"h",url:"functions_vars.html#index_h"},
+{text:"i",url:"functions_vars.html#index_i"},
+{text:"m",url:"functions_vars.html#index_m"},
+{text:"n",url:"functions_vars.html#index_n"},
+{text:"p",url:"functions_vars.html#index_p"},
+{text:"s",url:"functions_vars.html#index_s"},
+{text:"t",url:"functions_vars.html#index_t"},
+{text:"v",url:"functions_vars.html#index_v"},
+{text:"w",url:"functions_vars.html#index_w"},
+{text:"x",url:"functions_vars.html#index_x"},
+{text:"y",url:"functions_vars.html#index_y"}]},
+{text:"Enumerations",url:"functions_enum.html"},
+{text:"Related Functions",url:"functions_rela.html"}]}]},
+{text:"Files",url:"files.html",children:[
+{text:"File List",url:"files.html"},
+{text:"File Members",url:"globals.html",children:[
+{text:"All",url:"globals.html"},
+{text:"Functions",url:"globals_func.html"},
+{text:"Typedefs",url:"globals_type.html"},
+{text:"Enumerator",url:"globals_eval.html"},
+{text:"Macros",url:"globals_defs.html"}]}]}]}
diff --git a/dev/MinGfx/docs/html/mesh_8h.html b/dev/MinGfx/docs/html/mesh_8h.html
new file mode 100644
index 0000000..25e621a
--- /dev/null
+++ b/dev/MinGfx/docs/html/mesh_8h.html
@@ -0,0 +1,116 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/mesh.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">mesh.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="bvh_8h_source.html">bvh.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="color_8h_source.html">color.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="opengl__headers_8h_source.html">opengl_headers.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point2_8h_source.html">point2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector3_8h_source.html">vector3.h</a>&quot;</code><br />
+<code>#include &lt;vector&gt;</code><br />
+</div>
+<p><a href="mesh_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A triangle mesh data structure that can be rendered with a <a class="el" href="classmingfx_1_1_shader_program.html" title="A wrapper around GLSL shader programs.">ShaderProgram</a> like <a class="el" href="classmingfx_1_1_default_shader.html" title="A simple GLSL shader for textured per-fragment Phong shading with multiple light sources.">DefaultShader</a>. <a href="classmingfx_1_1_mesh.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/mesh_8h_source.html b/dev/MinGfx/docs/html/mesh_8h_source.html
new file mode 100644
index 0000000..fee9a22
--- /dev/null
+++ b/dev/MinGfx/docs/html/mesh_8h_source.html
@@ -0,0 +1,293 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/mesh.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mesh.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="mesh_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_MESH_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_MESH_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; </div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; </div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="bvh_8h.html">bvh.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="color_8h.html">color.h</a>&quot;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="opengl__headers_8h.html">opengl_headers.h</a>&quot;</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point2_8h.html">point2.h</a>&quot;</span></div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector3_8h.html">vector3.h</a>&quot;</span></div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; </div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; </div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; </div>
+<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="keyword">class </span>Matrix4;</div>
+<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; </div>
+<div class="line"><a name="l00127"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html"> 127</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> {</div>
+<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00130"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9"> 130</a></span>&#160; <a class="code" href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9">Mesh</a>();</div>
+<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; </div>
+<div class="line"><a name="l00133"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a76b4977f0a7f156aa8a0027f10dcbdc1"> 133</a></span>&#160; <a class="code" href="classmingfx_1_1_mesh.html#a76b4977f0a7f156aa8a0027f10dcbdc1">Mesh</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;other);</div>
+<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; </div>
+<div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#ace7b23730dbcb581c4886cf2b9998327"> 135</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_mesh.html#ace7b23730dbcb581c4886cf2b9998327">~Mesh</a>();</div>
+<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; </div>
+<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; </div>
+<div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a8d05faf18ef8d170fc3c2a343075823f"> 142</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a8d05faf18ef8d170fc3c2a343075823f">LoadFromOBJ</a>(<span class="keyword">const</span> std::string &amp;filename);</div>
+<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; </div>
+<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; </div>
+<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; </div>
+<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="comment">// ---- TRIANGLE LIST MODE ----</span></div>
+<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="comment">// No indices are stored, each set of 3 vertices forms a triangle, and if the</span></div>
+<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="comment">// triangles share vertices, those vertices need to be repeated.</span></div>
+<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; </div>
+<div class="line"><a name="l00155"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a29eeb2e778704350789033ec4940d55a"> 155</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_mesh.html#a29eeb2e778704350789033ec4940d55a">AddTriangle</a>(<a class="code" href="classmingfx_1_1_point3.html">Point3</a> v1, <a class="code" href="classmingfx_1_1_point3.html">Point3</a> v2, <a class="code" href="classmingfx_1_1_point3.html">Point3</a> v3);</div>
+<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; </div>
+<div class="line"><a name="l00159"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a3e0ac86714f6b7c3f62761ef3952a044"> 159</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a3e0ac86714f6b7c3f62761ef3952a044">UpdateTriangle</a>(<span class="keywordtype">int</span> triangle_id, <a class="code" href="classmingfx_1_1_point3.html">Point3</a> v1, <a class="code" href="classmingfx_1_1_point3.html">Point3</a> v2, <a class="code" href="classmingfx_1_1_point3.html">Point3</a> v3);</div>
+<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; </div>
+<div class="line"><a name="l00163"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903"> 163</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903">SetNormals</a>(<span class="keywordtype">int</span> triangle_id, <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> n1, <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> n2, <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> n3);</div>
+<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; </div>
+<div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f"> 167</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f">SetColors</a>(<span class="keywordtype">int</span> triangle_id, <a class="code" href="classmingfx_1_1_color.html">Color</a> c1, <a class="code" href="classmingfx_1_1_color.html">Color</a> c2, <a class="code" href="classmingfx_1_1_color.html">Color</a> c3);</div>
+<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; </div>
+<div class="line"><a name="l00172"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3"> 172</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3">SetTexCoords</a>(<span class="keywordtype">int</span> triangle_id, <span class="keywordtype">int</span> texture_unit, <a class="code" href="classmingfx_1_1_point2.html">Point2</a> uv1, <a class="code" href="classmingfx_1_1_point2.html">Point2</a> uv2, <a class="code" href="classmingfx_1_1_point2.html">Point2</a> uv3);</div>
+<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; </div>
+<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; </div>
+<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; </div>
+<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="comment">// ---- INDEXED TRIANGLES MODE ----</span></div>
+<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="comment">// Vertices are stored in an array and indices are stored in a separate array</span></div>
+<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="comment">// each set of 3 indices into the vertex array defines one triangle. Here,</span></div>
+<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="comment">// you cannot add one triangle at a time to the mesh. Instead you must set</span></div>
+<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="comment">// the arrays of indices, vertices, and other attributes for the mesh at</span></div>
+<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="comment">// once.</span></div>
+<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; </div>
+<div class="line"><a name="l00184"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6"> 184</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6">SetVertices</a>(<span class="keyword">const</span> std::vector&lt;Point3&gt; &amp;verts);</div>
+<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; </div>
+<div class="line"><a name="l00187"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#ad28dbd5b0ab77bec28f30f618dd9e57d"> 187</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#ad28dbd5b0ab77bec28f30f618dd9e57d">SetNormals</a>(<span class="keyword">const</span> std::vector&lt;Vector3&gt; &amp;norms);</div>
+<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; </div>
+<div class="line"><a name="l00190"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#ab9b05a77591a9adad12032d513256dae"> 190</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#ab9b05a77591a9adad12032d513256dae">SetColors</a>(<span class="keyword">const</span> std::vector&lt;Color&gt; &amp;colors);</div>
+<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; </div>
+<div class="line"><a name="l00193"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#aba2dfd0ade2d8a728897d411ef3fdaf1"> 193</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#aba2dfd0ade2d8a728897d411ef3fdaf1">SetTexCoords</a>(<span class="keywordtype">int</span> texture_unit, <span class="keyword">const</span> std::vector&lt;Point2&gt; &amp;tex_coords);</div>
+<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; </div>
+<div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a1f94c9ca7867b65e04f7e02813a06581"> 198</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a1f94c9ca7867b65e04f7e02813a06581">SetIndices</a>(<span class="keyword">const</span> std::vector&lt;unsigned int&gt; index_array);</div>
+<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; </div>
+<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; </div>
+<div class="line"><a name="l00201"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a7175238f5874929e2258458b98421d87"> 201</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a7175238f5874929e2258458b98421d87">SetInstanceTransforms</a>(<span class="keyword">const</span> std::vector&lt;Matrix4&gt; &amp;xforms);</div>
+<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; </div>
+<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; </div>
+<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="comment">// ---- These functions can be used instead of the above if you are working with</span></div>
+<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="comment">// regular C-style arrays and floats rather than the higher level types like</span></div>
+<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="comment">// Point3 and Vector3. ----</span></div>
+<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; </div>
+<div class="line"><a name="l00211"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a033076b9bf1714c9b9e0eeef11ebcd49"> 211</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a033076b9bf1714c9b9e0eeef11ebcd49">SetVertices</a>(<span class="keywordtype">float</span> *verts_array, <span class="keywordtype">int</span> num_verts);</div>
+<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; </div>
+<div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a6ab1128fab6f969564d3a1329baeade6"> 217</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a6ab1128fab6f969564d3a1329baeade6">SetNormals</a>(<span class="keywordtype">float</span> *norms_array, <span class="keywordtype">int</span> num_norms);</div>
+<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; </div>
+<div class="line"><a name="l00223"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#aed172bdd77858f3b59978cb8527e19ae"> 223</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#aed172bdd77858f3b59978cb8527e19ae">SetColors</a>(<span class="keywordtype">float</span> *colors_array, <span class="keywordtype">int</span> num_colors);</div>
+<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; </div>
+<div class="line"><a name="l00229"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#ac9cd4e8d67bb70295a48fcbc72ae32f9"> 229</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#ac9cd4e8d67bb70295a48fcbc72ae32f9">SetTexCoords</a>(<span class="keywordtype">int</span> texture_unit, <span class="keywordtype">float</span> *tex_coords_array, <span class="keywordtype">int</span> num_tex_coords);</div>
+<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; </div>
+<div class="line"><a name="l00235"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a84711746b8d37c8d9b12ae748a4c5b8c"> 235</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a84711746b8d37c8d9b12ae748a4c5b8c">SetIndices</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *index_array, <span class="keywordtype">int</span> num_indices);</div>
+<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; </div>
+<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; </div>
+<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; </div>
+<div class="line"><a name="l00246"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#ac74345bf4b2994de4ee1c509bcc6840e"> 246</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#ac74345bf4b2994de4ee1c509bcc6840e">UpdateGPUMemory</a>();</div>
+<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; </div>
+<div class="line"><a name="l00252"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c"> 252</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c">Draw</a>();</div>
+<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; </div>
+<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; </div>
+<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; </div>
+<div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a1a5cea9cfdf4c672ba0c781ee54718f7"> 262</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a1a5cea9cfdf4c672ba0c781ee54718f7">CalcPerFaceNormals</a>();</div>
+<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; </div>
+<div class="line"><a name="l00270"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#acc7df547b0a2175287cc9f509c04e93c"> 270</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#acc7df547b0a2175287cc9f509c04e93c">CalcPerVertexNormals</a>();</div>
+<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; </div>
+<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; </div>
+<div class="line"><a name="l00276"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a8d96c1b5985cd836f2aa2b2994af64c1"> 276</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_mesh.html#a8d96c1b5985cd836f2aa2b2994af64c1">BuildBVH</a>();</div>
+<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; </div>
+<div class="line"><a name="l00282"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a978b1341d5613d399a68e40c61c57ba4"> 282</a></span>&#160; <a class="code" href="classmingfx_1_1_b_v_h.html">BVH</a>* <a class="code" href="classmingfx_1_1_mesh.html#a978b1341d5613d399a68e40c61c57ba4">bvh_ptr</a>();</div>
+<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; </div>
+<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="comment">// Access to properties indexed by vertex number</span></div>
+<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; </div>
+<div class="line"><a name="l00287"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d"> 287</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d">num_vertices</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; </div>
+<div class="line"><a name="l00291"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#ada9371e85aa0b61df79b26fc880b1863"> 291</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_mesh.html#ada9371e85aa0b61df79b26fc880b1863">read_vertex_data</a>(<span class="keywordtype">int</span> vertex_id) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; </div>
+<div class="line"><a name="l00295"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a439361e454ca63c35f564aed5cd0de65"> 295</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_mesh.html#a439361e454ca63c35f564aed5cd0de65">read_normal_data</a>(<span class="keywordtype">int</span> vertex_id) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; </div>
+<div class="line"><a name="l00299"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#ac5fc517fd8ea4cea8459d3f4d5d6ced3"> 299</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html">Color</a> <a class="code" href="classmingfx_1_1_mesh.html#ac5fc517fd8ea4cea8459d3f4d5d6ced3">read_color_data</a>(<span class="keywordtype">int</span> vertex_id) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; </div>
+<div class="line"><a name="l00303"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a51aaa8d6a80af46f22ea9dfecd2f0b31"> 303</a></span>&#160; <a class="code" href="classmingfx_1_1_point2.html">Point2</a> <a class="code" href="classmingfx_1_1_mesh.html#a51aaa8d6a80af46f22ea9dfecd2f0b31">read_tex_coords_data</a>(<span class="keywordtype">int</span> texture_unit, <span class="keywordtype">int</span> vertex_id) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; </div>
+<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; </div>
+<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="comment">// Access to triangles</span></div>
+<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; </div>
+<div class="line"><a name="l00309"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#ab3f3779506e15e3888ccbb8b9b572b8f"> 309</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_mesh.html#ab3f3779506e15e3888ccbb8b9b572b8f">num_triangles</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; </div>
+<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="comment">// of unsigned ints. Use the SetIndices() function to set (or edit) the indices for the mesh.</span></div>
+<div class="line"><a name="l00313"></a><span class="lineno"><a class="line" href="classmingfx_1_1_mesh.html#a15d79cbc48a6ef72ef1208d734cc2f8a"> 313</a></span>&#160; std::vector&lt;unsigned int&gt; <a class="code" href="classmingfx_1_1_mesh.html#a15d79cbc48a6ef72ef1208d734cc2f8a">read_triangle_indices_data</a>(<span class="keywordtype">int</span> triangle_id) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; </div>
+<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; </div>
+<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; std::vector&lt;float&gt; verts_;</div>
+<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; std::vector&lt;float&gt; norms_;</div>
+<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; std::vector&lt;float&gt; colors_;</div>
+<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; std::vector&lt; std::vector&lt;float&gt; &gt; tex_coords_;</div>
+<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; std::vector&lt;unsigned int&gt; indices_;</div>
+<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; std::vector&lt;float&gt; instance_xforms_;</div>
+<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; </div>
+<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keywordtype">bool</span> gpu_dirty_;</div>
+<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; GLuint vertex_buffer_;</div>
+<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; GLuint vertex_array_;</div>
+<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; GLuint element_buffer_;</div>
+<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; </div>
+<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordtype">bool</span> bvh_dirty_;</div>
+<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <a class="code" href="classmingfx_1_1_b_v_h.html">BVH</a> bvh_;</div>
+<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160;};</div>
+<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; </div>
+<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; </div>
+<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; </div>
+<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; </div>
+<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="abvh_8h_html"><div class="ttname"><a href="bvh_8h.html">bvh.h</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_b_v_h_html"><div class="ttname"><a href="classmingfx_1_1_b_v_h.html">mingfx::BVH</a></div><div class="ttdoc">A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...</div><div class="ttdef"><b>Definition:</b> <a href="bvh_8h_source.html#l00040">bvh.h:40</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html"><div class="ttname"><a href="classmingfx_1_1_color.html">mingfx::Color</a></div><div class="ttdoc">Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with Op...</div><div class="ttdef"><b>Definition:</b> <a href="color_8h_source.html#l00041">color.h:41</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html"><div class="ttname"><a href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></div><div class="ttdoc">A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.</div><div class="ttdef"><b>Definition:</b> <a href="mesh_8h_source.html#l00127">mesh.h:127</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a033076b9bf1714c9b9e0eeef11ebcd49"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a033076b9bf1714c9b9e0eeef11ebcd49">mingfx::Mesh::SetVertices</a></div><div class="ttdeci">void SetVertices(float *verts_array, int num_verts)</div><div class="ttdoc">Sets the vertex array for the mesh directly. Vertices are stored as (x,y,z), (x,y,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a0f59e19b74f4f9dc2ad580756f8b319f"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f">mingfx::Mesh::SetColors</a></div><div class="ttdeci">void SetColors(int triangle_id, Color c1, Color c2, Color c3)</div><div class="ttdoc">Sets per-vertex colors for the three vertices of a triangle that has already been added to the mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a15d79cbc48a6ef72ef1208d734cc2f8a"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a15d79cbc48a6ef72ef1208d734cc2f8a">mingfx::Mesh::read_triangle_indices_data</a></div><div class="ttdeci">std::vector&lt; unsigned int &gt; read_triangle_indices_data(int triangle_id) const</div><div class="ttdoc">Read only access to the indices that make up a particular triangle. Data are returned as a 3-element ...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a17cb896939007357014c74a1ece6f1f3"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3">mingfx::Mesh::SetTexCoords</a></div><div class="ttdeci">void SetTexCoords(int triangle_id, int texture_unit, Point2 uv1, Point2 uv2, Point2 uv3)</div><div class="ttdoc">Sets the texture coordinates for the three vertices of a triangle that has already been added to the ...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a1a5cea9cfdf4c672ba0c781ee54718f7"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a1a5cea9cfdf4c672ba0c781ee54718f7">mingfx::Mesh::CalcPerFaceNormals</a></div><div class="ttdeci">void CalcPerFaceNormals()</div><div class="ttdoc">This (re)calculates the normals for the mesh and stores them with the mesh data structure.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a1dd243b53826765ba468f505645102a6"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6">mingfx::Mesh::SetVertices</a></div><div class="ttdeci">void SetVertices(const std::vector&lt; Point3 &gt; &amp;verts)</div><div class="ttdoc">Sets the vertex array for the mesh directly.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a1f94c9ca7867b65e04f7e02813a06581"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a1f94c9ca7867b65e04f7e02813a06581">mingfx::Mesh::SetIndices</a></div><div class="ttdeci">void SetIndices(const std::vector&lt; unsigned int &gt; index_array)</div><div class="ttdoc">Sets the indices into the vertex array to use to create the triangles. Each consecutive set of 3 indi...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a29eeb2e778704350789033ec4940d55a"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a29eeb2e778704350789033ec4940d55a">mingfx::Mesh::AddTriangle</a></div><div class="ttdeci">int AddTriangle(Point3 v1, Point3 v2, Point3 v3)</div><div class="ttdoc">Adds a triangle to the mesh datastructure and returns a triangle ID.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a3e0ac86714f6b7c3f62761ef3952a044"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a3e0ac86714f6b7c3f62761ef3952a044">mingfx::Mesh::UpdateTriangle</a></div><div class="ttdeci">void UpdateTriangle(int triangle_id, Point3 v1, Point3 v2, Point3 v3)</div><div class="ttdoc">Updates the vertex positions for a triangle that has already been added to the mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a439361e454ca63c35f564aed5cd0de65"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a439361e454ca63c35f564aed5cd0de65">mingfx::Mesh::read_normal_data</a></div><div class="ttdeci">Vector3 read_normal_data(int vertex_id) const</div><div class="ttdoc">Read only access to per-vertex normal data. Data are returned as a Vector3. Indexed by vertex number....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a43d5a5cc3ef742a8c2b5e3f1b4da0903"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903">mingfx::Mesh::SetNormals</a></div><div class="ttdeci">void SetNormals(int triangle_id, Vector3 n1, Vector3 n2, Vector3 n3)</div><div class="ttdoc">Sets the normals for the three vertices of a triangle that has already been added to the mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a51aaa8d6a80af46f22ea9dfecd2f0b31"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a51aaa8d6a80af46f22ea9dfecd2f0b31">mingfx::Mesh::read_tex_coords_data</a></div><div class="ttdeci">Point2 read_tex_coords_data(int texture_unit, int vertex_id) const</div><div class="ttdoc">Read only access to per-vertex texture coordinates data. Data are returned as a Point2....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a69613870d54989f4226e50caf4ca9fb9"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9">mingfx::Mesh::Mesh</a></div><div class="ttdeci">Mesh()</div><div class="ttdoc">Creates an empty mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a6ab1128fab6f969564d3a1329baeade6"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a6ab1128fab6f969564d3a1329baeade6">mingfx::Mesh::SetNormals</a></div><div class="ttdeci">void SetNormals(float *norms_array, int num_norms)</div><div class="ttdoc">Sets the normal array for the mesh directly. Normals are stored as (x,y,z), (x,y,z),...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a7175238f5874929e2258458b98421d87"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a7175238f5874929e2258458b98421d87">mingfx::Mesh::SetInstanceTransforms</a></div><div class="ttdeci">void SetInstanceTransforms(const std::vector&lt; Matrix4 &gt; &amp;xforms)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a75075d472938fd760477be42585aff5c"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c">mingfx::Mesh::Draw</a></div><div class="ttdeci">void Draw()</div><div class="ttdoc">This sends the mesh vertices and attributes down the graphics pipe using glDrawArrays() for the non-i...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a76b4977f0a7f156aa8a0027f10dcbdc1"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a76b4977f0a7f156aa8a0027f10dcbdc1">mingfx::Mesh::Mesh</a></div><div class="ttdeci">Mesh(const Mesh &amp;other)</div><div class="ttdoc">Copies all data and sets GPU dirty bit for the new mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a84711746b8d37c8d9b12ae748a4c5b8c"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a84711746b8d37c8d9b12ae748a4c5b8c">mingfx::Mesh::SetIndices</a></div><div class="ttdeci">void SetIndices(unsigned int *index_array, int num_indices)</div><div class="ttdoc">Sets the indices into the vertex array to use to create the triangles. Each consecutive set of 3 indi...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a8d05faf18ef8d170fc3c2a343075823f"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a8d05faf18ef8d170fc3c2a343075823f">mingfx::Mesh::LoadFromOBJ</a></div><div class="ttdeci">void LoadFromOBJ(const std::string &amp;filename)</div><div class="ttdoc">This reads a mesh stored in the common Wavefront Obj file format.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a8d96c1b5985cd836f2aa2b2994af64c1"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a8d96c1b5985cd836f2aa2b2994af64c1">mingfx::Mesh::BuildBVH</a></div><div class="ttdeci">void BuildBVH()</div><div class="ttdoc">This (re)calculates a Bounding Volume Hierarchy for the mesh, which can be used together with Ray::Fa...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_a978b1341d5613d399a68e40c61c57ba4"><div class="ttname"><a href="classmingfx_1_1_mesh.html#a978b1341d5613d399a68e40c61c57ba4">mingfx::Mesh::bvh_ptr</a></div><div class="ttdeci">BVH * bvh_ptr()</div><div class="ttdoc">Returns a pointer to the underlying BVH data structure.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_ab3f3779506e15e3888ccbb8b9b572b8f"><div class="ttname"><a href="classmingfx_1_1_mesh.html#ab3f3779506e15e3888ccbb8b9b572b8f">mingfx::Mesh::num_triangles</a></div><div class="ttdeci">int num_triangles() const</div><div class="ttdoc">The total number of triangles in the mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_ab8f6856429466f1b4600a6ec27b84d0d"><div class="ttname"><a href="classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d">mingfx::Mesh::num_vertices</a></div><div class="ttdeci">int num_vertices() const</div><div class="ttdoc">The total number of vertices in the mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_ab9b05a77591a9adad12032d513256dae"><div class="ttname"><a href="classmingfx_1_1_mesh.html#ab9b05a77591a9adad12032d513256dae">mingfx::Mesh::SetColors</a></div><div class="ttdeci">void SetColors(const std::vector&lt; Color &gt; &amp;colors)</div><div class="ttdoc">Sets the per-vertex colors array for the mesh directly.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_aba2dfd0ade2d8a728897d411ef3fdaf1"><div class="ttname"><a href="classmingfx_1_1_mesh.html#aba2dfd0ade2d8a728897d411ef3fdaf1">mingfx::Mesh::SetTexCoords</a></div><div class="ttdeci">void SetTexCoords(int texture_unit, const std::vector&lt; Point2 &gt; &amp;tex_coords)</div><div class="ttdoc">Sets a texture coordinates array for the mesh directly.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_ac5fc517fd8ea4cea8459d3f4d5d6ced3"><div class="ttname"><a href="classmingfx_1_1_mesh.html#ac5fc517fd8ea4cea8459d3f4d5d6ced3">mingfx::Mesh::read_color_data</a></div><div class="ttdeci">Color read_color_data(int vertex_id) const</div><div class="ttdoc">Read only access to per-vertex color data. Data are returned as a Color. Indexed by vertex number....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_ac74345bf4b2994de4ee1c509bcc6840e"><div class="ttname"><a href="classmingfx_1_1_mesh.html#ac74345bf4b2994de4ee1c509bcc6840e">mingfx::Mesh::UpdateGPUMemory</a></div><div class="ttdeci">void UpdateGPUMemory()</div><div class="ttdoc">This copies the entire mesh data structure to a vertex array in GPU memory, which must happen before ...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_ac9cd4e8d67bb70295a48fcbc72ae32f9"><div class="ttname"><a href="classmingfx_1_1_mesh.html#ac9cd4e8d67bb70295a48fcbc72ae32f9">mingfx::Mesh::SetTexCoords</a></div><div class="ttdeci">void SetTexCoords(int texture_unit, float *tex_coords_array, int num_tex_coords)</div><div class="ttdoc">Sets a texture coordinates array for the mesh directly. Tex coords are stored as (u,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_acc7df547b0a2175287cc9f509c04e93c"><div class="ttname"><a href="classmingfx_1_1_mesh.html#acc7df547b0a2175287cc9f509c04e93c">mingfx::Mesh::CalcPerVertexNormals</a></div><div class="ttdeci">void CalcPerVertexNormals()</div><div class="ttdoc">This (re)calculates the normals for the mesh and stores them with the mesh data structure.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_ace7b23730dbcb581c4886cf2b9998327"><div class="ttname"><a href="classmingfx_1_1_mesh.html#ace7b23730dbcb581c4886cf2b9998327">mingfx::Mesh::~Mesh</a></div><div class="ttdeci">virtual ~Mesh()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_ad28dbd5b0ab77bec28f30f618dd9e57d"><div class="ttname"><a href="classmingfx_1_1_mesh.html#ad28dbd5b0ab77bec28f30f618dd9e57d">mingfx::Mesh::SetNormals</a></div><div class="ttdeci">void SetNormals(const std::vector&lt; Vector3 &gt; &amp;norms)</div><div class="ttdoc">Sets the normal array for the mesh directly.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_ada9371e85aa0b61df79b26fc880b1863"><div class="ttname"><a href="classmingfx_1_1_mesh.html#ada9371e85aa0b61df79b26fc880b1863">mingfx::Mesh::read_vertex_data</a></div><div class="ttdeci">Point3 read_vertex_data(int vertex_id) const</div><div class="ttdoc">Read only access to the vertex position data. Data are returned as a Point3. Indexed by vertex number...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html_aed172bdd77858f3b59978cb8527e19ae"><div class="ttname"><a href="classmingfx_1_1_mesh.html#aed172bdd77858f3b59978cb8527e19ae">mingfx::Mesh::SetColors</a></div><div class="ttdeci">void SetColors(float *colors_array, int num_colors)</div><div class="ttdoc">Sets the per-vertex colors array for the mesh directly. Colors are stored as (r,g,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html"><div class="ttname"><a href="classmingfx_1_1_point2.html">mingfx::Point2</a></div><div class="ttdoc">A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...</div><div class="ttdef"><b>Definition:</b> <a href="point2_8h_source.html#l00028">point2.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="acolor_8h_html"><div class="ttname"><a href="color_8h.html">color.h</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="aopengl__headers_8h_html"><div class="ttname"><a href="opengl__headers_8h.html">opengl_headers.h</a></div></div>
+<div class="ttc" id="apoint2_8h_html"><div class="ttname"><a href="point2_8h.html">point2.h</a></div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+<div class="ttc" id="avector3_8h_html"><div class="ttname"><a href="vector3_8h.html">vector3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/mingfx_8h.html b/dev/MinGfx/docs/html/mingfx_8h.html
new file mode 100644
index 0000000..828b1a0
--- /dev/null
+++ b/dev/MinGfx/docs/html/mingfx_8h.html
@@ -0,0 +1,120 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/mingfx.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Includes the entire MinGfx library and calls using namespace mingfx. </p>
+
+<p class="definition">Definition in file <a class="el" href="mingfx_8h_source.html">mingfx.h</a>.</p>
+</div><div class="textblock"><code>#include &quot;<a class="el" href="aabb_8h_source.html">aabb.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="bvh_8h_source.html">bvh.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="color_8h_source.html">color.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="craft__cam_8h_source.html">craft_cam.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="default__shader_8h_source.html">default_shader.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="gfxmath_8h_source.html">gfxmath.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="graphics__app_8h_source.html">graphics_app.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="matrix4_8h_source.html">matrix4.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mesh_8h_source.html">mesh.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mingfx__config_8h_source.html">mingfx_config.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="opengl__headers_8h_source.html">opengl_headers.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="platform_8h_source.html">platform.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point2_8h_source.html">point2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="quaternion_8h_source.html">quaternion.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="quick__shapes_8h_source.html">quick_shapes.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ray_8h_source.html">ray.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="shader__program_8h_source.html">shader_program.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="text__shader_8h_source.html">text_shader.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="texture2d_8h_source.html">texture2d.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="unicam_8h_source.html">unicam.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector2_8h_source.html">vector2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector3_8h_source.html">vector3.h</a>&quot;</code><br />
+</div>
+<p><a href="mingfx_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/mingfx_8h_source.html b/dev/MinGfx/docs/html/mingfx_8h_source.html
new file mode 100644
index 0000000..747aa97
--- /dev/null
+++ b/dev/MinGfx/docs/html/mingfx_8h_source.html
@@ -0,0 +1,159 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/mingfx.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="mingfx_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#ifndef SRC_MINGFX_H_</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#define SRC_MINGFX_H_</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="aabb_8h.html">aabb.h</a>&quot;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="bvh_8h.html">bvh.h</a>&quot;</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="color_8h.html">color.h</a>&quot;</span></div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="craft__cam_8h.html">craft_cam.h</a>&quot;</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="default__shader_8h.html">default_shader.h</a>&quot;</span></div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="gfxmath_8h.html">gfxmath.h</a>&quot;</span></div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="graphics__app_8h.html">graphics_app.h</a>&quot;</span></div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="matrix4_8h.html">matrix4.h</a>&quot;</span></div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="mesh_8h.html">mesh.h</a>&quot;</span></div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="mingfx__config_8h.html">mingfx_config.h</a>&quot;</span></div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="opengl__headers_8h.html">opengl_headers.h</a>&quot;</span></div>
+<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="platform_8h.html">platform.h</a>&quot;</span></div>
+<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point2_8h.html">point2.h</a>&quot;</span></div>
+<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="quaternion_8h.html">quaternion.h</a>&quot;</span></div>
+<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="quick__shapes_8h.html">quick_shapes.h</a>&quot;</span></div>
+<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ray_8h.html">ray.h</a>&quot;</span></div>
+<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="shader__program_8h.html">shader_program.h</a>&quot;</span></div>
+<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="text__shader_8h.html">text_shader.h</a>&quot;</span></div>
+<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="texture2d_8h.html">texture2d.h</a>&quot;</span></div>
+<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="unicam_8h.html">unicam.h</a>&quot;</span></div>
+<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector2_8h.html">vector2.h</a>&quot;</span></div>
+<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector3_8h.html">vector3.h</a>&quot;</span></div>
+<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; </div>
+<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment">//using namespace mingfx;</span></div>
+<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; </div>
+<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aaabb_8h_html"><div class="ttname"><a href="aabb_8h.html">aabb.h</a></div></div>
+<div class="ttc" id="abvh_8h_html"><div class="ttname"><a href="bvh_8h.html">bvh.h</a></div></div>
+<div class="ttc" id="acolor_8h_html"><div class="ttname"><a href="color_8h.html">color.h</a></div></div>
+<div class="ttc" id="acraft__cam_8h_html"><div class="ttname"><a href="craft__cam_8h.html">craft_cam.h</a></div></div>
+<div class="ttc" id="adefault__shader_8h_html"><div class="ttname"><a href="default__shader_8h.html">default_shader.h</a></div></div>
+<div class="ttc" id="agfxmath_8h_html"><div class="ttname"><a href="gfxmath_8h.html">gfxmath.h</a></div></div>
+<div class="ttc" id="agraphics__app_8h_html"><div class="ttname"><a href="graphics__app_8h.html">graphics_app.h</a></div></div>
+<div class="ttc" id="amatrix4_8h_html"><div class="ttname"><a href="matrix4_8h.html">matrix4.h</a></div></div>
+<div class="ttc" id="amesh_8h_html"><div class="ttname"><a href="mesh_8h.html">mesh.h</a></div></div>
+<div class="ttc" id="amingfx__config_8h_html"><div class="ttname"><a href="mingfx__config_8h.html">mingfx_config.h</a></div></div>
+<div class="ttc" id="aopengl__headers_8h_html"><div class="ttname"><a href="opengl__headers_8h.html">opengl_headers.h</a></div></div>
+<div class="ttc" id="aplatform_8h_html"><div class="ttname"><a href="platform_8h.html">platform.h</a></div></div>
+<div class="ttc" id="apoint2_8h_html"><div class="ttname"><a href="point2_8h.html">point2.h</a></div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+<div class="ttc" id="aquaternion_8h_html"><div class="ttname"><a href="quaternion_8h.html">quaternion.h</a></div></div>
+<div class="ttc" id="aquick__shapes_8h_html"><div class="ttname"><a href="quick__shapes_8h.html">quick_shapes.h</a></div></div>
+<div class="ttc" id="aray_8h_html"><div class="ttname"><a href="ray_8h.html">ray.h</a></div></div>
+<div class="ttc" id="ashader__program_8h_html"><div class="ttname"><a href="shader__program_8h.html">shader_program.h</a></div></div>
+<div class="ttc" id="atext__shader_8h_html"><div class="ttname"><a href="text__shader_8h.html">text_shader.h</a></div></div>
+<div class="ttc" id="atexture2d_8h_html"><div class="ttname"><a href="texture2d_8h.html">texture2d.h</a></div></div>
+<div class="ttc" id="aunicam_8h_html"><div class="ttname"><a href="unicam_8h.html">unicam.h</a></div></div>
+<div class="ttc" id="avector2_8h_html"><div class="ttname"><a href="vector2_8h.html">vector2.h</a></div></div>
+<div class="ttc" id="avector3_8h_html"><div class="ttname"><a href="vector3_8h.html">vector3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/mingfx__config_8h.html b/dev/MinGfx/docs/html/mingfx__config_8h.html
new file mode 100644
index 0000000..e2c9f24
--- /dev/null
+++ b/dev/MinGfx/docs/html/mingfx__config_8h.html
@@ -0,0 +1,172 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/mingfx_config.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx_config.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="mingfx__config_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a9ab97d1e09bf7a864495329de5dc7e03"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mingfx__config_8h.html#a9ab97d1e09bf7a864495329de5dc7e03">MINGFX_DATA_DIR_BUILD</a>&#160;&#160;&#160;&quot;Y:/courses/4611/instructor-repo/dev/MinGfx/data&quot;</td></tr>
+<tr class="separator:a9ab97d1e09bf7a864495329de5dc7e03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1e44357d7f17eb50f842d9e39e55e398"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mingfx__config_8h.html#a1e44357d7f17eb50f842d9e39e55e398">MINGFX_DATA_DIR_INSTALL</a>&#160;&#160;&#160;&quot;C:/csci-4611/share/MinGfx-1.0/data&quot;</td></tr>
+<tr class="separator:a1e44357d7f17eb50f842d9e39e55e398"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1908456b5481e0dbbe2b8252fa71d23f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mingfx__config_8h.html#a1908456b5481e0dbbe2b8252fa71d23f">MINGFX_SHADERS_DIR_BUILD</a>&#160;&#160;&#160;&quot;Y:/courses/4611/instructor-repo/dev/MinGfx/src/shaders&quot;</td></tr>
+<tr class="separator:a1908456b5481e0dbbe2b8252fa71d23f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab431df904057e50ac94550595473f5f4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mingfx__config_8h.html#ab431df904057e50ac94550595473f5f4">MINGFX_SHADERS_DIR_INSTALL</a>&#160;&#160;&#160;&quot;C:/csci-4611/share/MinGfx-1.0/shaders&quot;</td></tr>
+<tr class="separator:ab431df904057e50ac94550595473f5f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a9ab97d1e09bf7a864495329de5dc7e03"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ab97d1e09bf7a864495329de5dc7e03">&#9670;&nbsp;</a></span>MINGFX_DATA_DIR_BUILD</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define MINGFX_DATA_DIR_BUILD&#160;&#160;&#160;&quot;Y:/courses/4611/instructor-repo/dev/MinGfx/data&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="mingfx__config_8h_source.html#l00020">20</a> of file <a class="el" href="mingfx__config_8h_source.html">mingfx_config.h</a>.</p>
+
+</div>
+</div>
+<a id="a1e44357d7f17eb50f842d9e39e55e398"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1e44357d7f17eb50f842d9e39e55e398">&#9670;&nbsp;</a></span>MINGFX_DATA_DIR_INSTALL</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define MINGFX_DATA_DIR_INSTALL&#160;&#160;&#160;&quot;C:/csci-4611/share/MinGfx-1.0/data&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="mingfx__config_8h_source.html#l00021">21</a> of file <a class="el" href="mingfx__config_8h_source.html">mingfx_config.h</a>.</p>
+
+</div>
+</div>
+<a id="a1908456b5481e0dbbe2b8252fa71d23f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1908456b5481e0dbbe2b8252fa71d23f">&#9670;&nbsp;</a></span>MINGFX_SHADERS_DIR_BUILD</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define MINGFX_SHADERS_DIR_BUILD&#160;&#160;&#160;&quot;Y:/courses/4611/instructor-repo/dev/MinGfx/src/shaders&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="mingfx__config_8h_source.html#l00023">23</a> of file <a class="el" href="mingfx__config_8h_source.html">mingfx_config.h</a>.</p>
+
+</div>
+</div>
+<a id="ab431df904057e50ac94550595473f5f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab431df904057e50ac94550595473f5f4">&#9670;&nbsp;</a></span>MINGFX_SHADERS_DIR_INSTALL</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define MINGFX_SHADERS_DIR_INSTALL&#160;&#160;&#160;&quot;C:/csci-4611/share/MinGfx-1.0/shaders&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="mingfx__config_8h_source.html#l00024">24</a> of file <a class="el" href="mingfx__config_8h_source.html">mingfx_config.h</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/mingfx__config_8h_source.html b/dev/MinGfx/docs/html/mingfx__config_8h_source.html
new file mode 100644
index 0000000..89c0719
--- /dev/null
+++ b/dev/MinGfx/docs/html/mingfx__config_8h_source.html
@@ -0,0 +1,116 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/mingfx_config.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">mingfx_config.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="mingfx__config_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">// The file config.h.in is processed by cmake to produce config.h. This</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// replaces strings of the form &quot;at&quot;CMAKE_VARIABLE_NAME&quot;at&quot; with the value</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// of the corresponding cmake variable, allowing us to pass directory paths</span></div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment">// and other information configured with cmake into our C++ code.</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; </div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
+<div class="line"><a name="l00020"></a><span class="lineno"><a class="line" href="mingfx__config_8h.html#a9ab97d1e09bf7a864495329de5dc7e03"> 20</a></span>&#160;<span class="preprocessor">#define MINGFX_DATA_DIR_BUILD &quot;Y:/courses/4611/instructor-repo/dev/MinGfx/data&quot;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"><a class="line" href="mingfx__config_8h.html#a1e44357d7f17eb50f842d9e39e55e398"> 21</a></span>&#160;<span class="preprocessor">#define MINGFX_DATA_DIR_INSTALL &quot;C:/csci-4611/share/MinGfx-1.0/data&quot;</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
+<div class="line"><a name="l00023"></a><span class="lineno"><a class="line" href="mingfx__config_8h.html#a1908456b5481e0dbbe2b8252fa71d23f"> 23</a></span>&#160;<span class="preprocessor">#define MINGFX_SHADERS_DIR_BUILD &quot;Y:/courses/4611/instructor-repo/dev/MinGfx/src/shaders&quot;</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"><a class="line" href="mingfx__config_8h.html#ab431df904057e50ac94550595473f5f4"> 24</a></span>&#160;<span class="preprocessor">#define MINGFX_SHADERS_DIR_INSTALL &quot;C:/csci-4611/share/MinGfx-1.0/shaders&quot;</span></div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/namespacemembers.html b/dev/MinGfx/docs/html/namespacemembers.html
new file mode 100644
index 0000000..41b6ce2
--- /dev/null
+++ b/dev/MinGfx/docs/html/namespacemembers.html
@@ -0,0 +1,105 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all namespace members with links to the namespace documentation for each member:</div>
+
+<h3><a id="index_o"></a>- o -</h3><ul>
+<li>operator*()
+: <a class="el" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">mingfx</a>
+</li>
+<li>operator+()
+: <a class="el" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">mingfx</a>
+</li>
+<li>operator-()
+: <a class="el" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">mingfx</a>
+</li>
+<li>operator/()
+: <a class="el" href="namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed">mingfx</a>
+</li>
+<li>operator&lt;&lt;()
+: <a class="el" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">mingfx</a>
+</li>
+<li>operator&gt;&gt;()
+: <a class="el" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">mingfx</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/namespacemembers_func.html b/dev/MinGfx/docs/html/namespacemembers_func.html
new file mode 100644
index 0000000..bca38e1
--- /dev/null
+++ b/dev/MinGfx/docs/html/namespacemembers_func.html
@@ -0,0 +1,105 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_o"></a>- o -</h3><ul>
+<li>operator*()
+: <a class="el" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">mingfx</a>
+</li>
+<li>operator+()
+: <a class="el" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">mingfx</a>
+</li>
+<li>operator-()
+: <a class="el" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">mingfx</a>
+</li>
+<li>operator/()
+: <a class="el" href="namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed">mingfx</a>
+</li>
+<li>operator&lt;&lt;()
+: <a class="el" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">mingfx</a>
+</li>
+<li>operator&gt;&gt;()
+: <a class="el" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">mingfx</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/namespacemingfx.html b/dev/MinGfx/docs/html/namespacemingfx.html
new file mode 100644
index 0000000..2861601
--- /dev/null
+++ b/dev/MinGfx/docs/html/namespacemingfx.html
@@ -0,0 +1,1710 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: mingfx Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">mingfx Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Namespace for the MinGfx Toolkit. </p>
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 3D axis-aligned bounding box defined by two corners (min and max). <a href="classmingfx_1_1_a_a_b_b.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_b_v_h.html">BVH</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A Bounding Volume Hierarchy (<a class="el" href="classmingfx_1_1_b_v_h.html" title="A Bounding Volume Hierarchy (BVH) data structure that can be used to accelerate ray-object intersecti...">BVH</a>) data structure that can be used to accelerate ray-object intersection tests by carving up space into a hierarchy of partitions represented in a tree. <a href="classmingfx_1_1_b_v_h.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_color.html">Color</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with OpenGL. <a href="classmingfx_1_1_color.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_craft_cam.html">CraftCam</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This implements a user interface for controlling the camera with the mouse. <a href="classmingfx_1_1_craft_cam.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_default_shader.html">DefaultShader</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A simple GLSL shader for textured per-fragment Phong shading with multiple light sources. <a href="classmingfx_1_1_default_shader.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_gfx_math.html">GfxMath</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This class holds a variety of static math functions that are useful to have defined with creating graphics programs. <a href="classmingfx_1_1_gfx_math.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_graphics_app.html">GraphicsApp</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This is the main application base class for the MinGfx Toolkit. <a href="classmingfx_1_1_graphics_app.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be compatible with OpenGL. <a href="classmingfx_1_1_matrix4.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_mesh.html">Mesh</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A triangle mesh data structure that can be rendered with a <a class="el" href="classmingfx_1_1_shader_program.html" title="A wrapper around GLSL shader programs.">ShaderProgram</a> like <a class="el" href="classmingfx_1_1_default_shader.html" title="A simple GLSL shader for textured per-fragment Phong shading with multiple light sources.">DefaultShader</a>. <a href="classmingfx_1_1_mesh.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_platform.html">Platform</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Provides access to the underlying file system and other platform-specific routines. <a href="classmingfx_1_1_platform.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html">Point2</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 2D Point with floating point coordinates, used for storing 2D texture coordinates, screen-space graphics, and mouse input. <a href="classmingfx_1_1_point2.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html">Point3</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graphics operations. <a href="classmingfx_1_1_point3.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A quaternion to represent rotations in 3D space. <a href="classmingfx_1_1_quaternion.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html">QuickShapes</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This class provides a quick way to draw shapes for use in debugging or simple scenes. <a href="classmingfx_1_1_quick_shapes.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html">Ray</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stores the mathematical object of a ray that begins at an origin (a 3D point) and points in a direction (a unit 3D vector). <a href="classmingfx_1_1_ray.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html">ShaderProgram</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A wrapper around GLSL shader programs. <a href="classmingfx_1_1_shader_program.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader.html">TextShader</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html">Texture2D</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A wrapper around a 2D texture that supports loading images from files or setting texture color data directly. <a href="classmingfx_1_1_texture2_d.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html">UniCam</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This implements a user interface for controlling the camera with the mouse. <a href="classmingfx_1_1_uni_cam.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 2D Vector with floating point coordinates, used for storing 2D translations, mouse movements, and screen-space vectors. <a href="classmingfx_1_1_vector2.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graphics operations. <a href="classmingfx_1_1_vector3.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3c3b45ed6edf3fe76f98a7fd165dca03"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">operator+</a> (const <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;A, const <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;B)</td></tr>
+<tr class="separator:a3c3b45ed6edf3fe76f98a7fd165dca03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6bc967741341f4f318a505d884192906"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">operator&lt;&lt;</a> (std::ostream &amp;os, const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;c)</td></tr>
+<tr class="separator:a6bc967741341f4f318a505d884192906"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6eb31e6e81c6e29144799be4c9db404d"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">operator&gt;&gt;</a> (std::istream &amp;is, <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;c)</td></tr>
+<tr class="separator:a6eb31e6e81c6e29144799be4c9db404d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae5708e414f585dde2a5418ddae259a57"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m, const float &amp;s)</td></tr>
+<tr class="memdesc:ae5708e414f585dde2a5418ddae259a57"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply matrix and scalar, returns the new matrix. <a href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">More...</a><br /></td></tr>
+<tr class="separator:ae5708e414f585dde2a5418ddae259a57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a061ff38340cf1aad4612790b0a600aeb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a061ff38340cf1aad4612790b0a600aeb">operator*</a> (const float &amp;s, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m)</td></tr>
+<tr class="memdesc:a061ff38340cf1aad4612790b0a600aeb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply matrix and scalar, returns the new matrix. <a href="namespacemingfx.html#a061ff38340cf1aad4612790b0a600aeb">More...</a><br /></td></tr>
+<tr class="separator:a061ff38340cf1aad4612790b0a600aeb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b8dabff5d6c9ddcef5e15b0ef807c80"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a5b8dabff5d6c9ddcef5e15b0ef807c80">operator*</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p)</td></tr>
+<tr class="memdesc:a5b8dabff5d6c9ddcef5e15b0ef807c80"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply matrix and point, returns the new point. <a href="namespacemingfx.html#a5b8dabff5d6c9ddcef5e15b0ef807c80">More...</a><br /></td></tr>
+<tr class="separator:a5b8dabff5d6c9ddcef5e15b0ef807c80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abb2cfd42e696494e4797d8f7e11f6d77"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#abb2cfd42e696494e4797d8f7e11f6d77">operator*</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="memdesc:abb2cfd42e696494e4797d8f7e11f6d77"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply matrix and vector, returns the new vector. <a href="namespacemingfx.html#abb2cfd42e696494e4797d8f7e11f6d77">More...</a><br /></td></tr>
+<tr class="separator:abb2cfd42e696494e4797d8f7e11f6d77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aadc0e86a31d54469e730669067b102c2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aadc0e86a31d54469e730669067b102c2">operator*</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m1, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m2)</td></tr>
+<tr class="memdesc:aadc0e86a31d54469e730669067b102c2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply two matrices, returns the result. <a href="namespacemingfx.html#aadc0e86a31d54469e730669067b102c2">More...</a><br /></td></tr>
+<tr class="separator:aadc0e86a31d54469e730669067b102c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1af1c07624961984759120b7af7f9ce4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_ray.html">Ray</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a1af1c07624961984759120b7af7f9ce4">operator*</a> (const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m, const <a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;r)</td></tr>
+<tr class="memdesc:a1af1c07624961984759120b7af7f9ce4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply matrix and the point and vector portions of the ray, returns the new ray. <a href="namespacemingfx.html#a1af1c07624961984759120b7af7f9ce4">More...</a><br /></td></tr>
+<tr class="separator:a1af1c07624961984759120b7af7f9ce4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1584104dea1f0a5636c868b67ddf6b10"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a1584104dea1f0a5636c868b67ddf6b10">operator&lt;&lt;</a> (std::ostream &amp;os, const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m)</td></tr>
+<tr class="separator:a1584104dea1f0a5636c868b67ddf6b10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05fc1c0b2b6011283c019242d6a2de74"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a05fc1c0b2b6011283c019242d6a2de74">operator&gt;&gt;</a> (std::istream &amp;is, <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m)</td></tr>
+<tr class="separator:a05fc1c0b2b6011283c019242d6a2de74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58ddc500b8c3e12f8af4515f258540cb"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a58ddc500b8c3e12f8af4515f258540cb">operator&lt;&lt;</a> (std::ostream &amp;os, const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p)</td></tr>
+<tr class="separator:a58ddc500b8c3e12f8af4515f258540cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a256924759a6718882a2b40e17d3e523d"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a256924759a6718882a2b40e17d3e523d">operator&gt;&gt;</a> (std::istream &amp;is, <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p)</td></tr>
+<tr class="separator:a256924759a6718882a2b40e17d3e523d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a53ce6bc4f4abdd3797d7af47adecbaf6"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a53ce6bc4f4abdd3797d7af47adecbaf6">operator&lt;&lt;</a> (std::ostream &amp;os, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p)</td></tr>
+<tr class="separator:a53ce6bc4f4abdd3797d7af47adecbaf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad95e9b494b9761895d57e2b698b69afd"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ad95e9b494b9761895d57e2b698b69afd">operator&gt;&gt;</a> (std::istream &amp;is, <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p)</td></tr>
+<tr class="separator:ad95e9b494b9761895d57e2b698b69afd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0a456bccfb238b9644cf21669cf35b8c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a0a456bccfb238b9644cf21669cf35b8c">operator*</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q1, const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q2)</td></tr>
+<tr class="separator:a0a456bccfb238b9644cf21669cf35b8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a444ae88d836b913ac8307fbf4357f7ed"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed">operator/</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q, const float s)</td></tr>
+<tr class="separator:a444ae88d836b913ac8307fbf4357f7ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55f694123e83d1649c112e806359d4b6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a55f694123e83d1649c112e806359d4b6">operator*</a> (const float s, const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q)</td></tr>
+<tr class="separator:a55f694123e83d1649c112e806359d4b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adb96b0188d1ceda03ed8d297817502c9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#adb96b0188d1ceda03ed8d297817502c9">operator*</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q, const float s)</td></tr>
+<tr class="separator:adb96b0188d1ceda03ed8d297817502c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f5a225a54f07164d5172a3721a3aee6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">operator-</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q)</td></tr>
+<tr class="separator:a2f5a225a54f07164d5172a3721a3aee6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad49375487853a642b3f372c95cff1a96"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ad49375487853a642b3f372c95cff1a96">operator+</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q1, const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q2)</td></tr>
+<tr class="separator:ad49375487853a642b3f372c95cff1a96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61f2d974c78e8884bb64c2759e455101"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a61f2d974c78e8884bb64c2759e455101">operator-</a> (const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q1, const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q2)</td></tr>
+<tr class="separator:a61f2d974c78e8884bb64c2759e455101"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac4b78a682ff8d1ec298e0df7f742658d"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ac4b78a682ff8d1ec298e0df7f742658d">operator&lt;&lt;</a> (std::ostream &amp;os, const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q)</td></tr>
+<tr class="separator:ac4b78a682ff8d1ec298e0df7f742658d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59fb7a99df5c572849e31065884b2235"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a59fb7a99df5c572849e31065884b2235">operator&gt;&gt;</a> (std::istream &amp;is, <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q)</td></tr>
+<tr class="separator:a59fb7a99df5c572849e31065884b2235"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad7c839e598b7be6c1b407330dfacc980"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ad7c839e598b7be6c1b407330dfacc980">operator&lt;&lt;</a> (std::ostream &amp;os, const <a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;r)</td></tr>
+<tr class="separator:ad7c839e598b7be6c1b407330dfacc980"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0412270963460363fa015b9b4785cc59"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a0412270963460363fa015b9b4785cc59">operator&gt;&gt;</a> (std::istream &amp;is, <a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;r)</td></tr>
+<tr class="separator:a0412270963460363fa015b9b4785cc59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a79ffb6c38c6c0b68ce1fdb7ae76ea6bd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a79ffb6c38c6c0b68ce1fdb7ae76ea6bd">operator/</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v, const float s)</td></tr>
+<tr class="memdesc:a79ffb6c38c6c0b68ce1fdb7ae76ea6bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Divide the vector by the scalar s. <a href="namespacemingfx.html#a79ffb6c38c6c0b68ce1fdb7ae76ea6bd">More...</a><br /></td></tr>
+<tr class="separator:a79ffb6c38c6c0b68ce1fdb7ae76ea6bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8bc25e621d21323fdd96f2c4a4141432"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a8bc25e621d21323fdd96f2c4a4141432">operator*</a> (const float s, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v)</td></tr>
+<tr class="memdesc:a8bc25e621d21323fdd96f2c4a4141432"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply the vector by the scalar s. <a href="namespacemingfx.html#a8bc25e621d21323fdd96f2c4a4141432">More...</a><br /></td></tr>
+<tr class="separator:a8bc25e621d21323fdd96f2c4a4141432"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8358de6421374fb037e8c51e8f2d5878"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a8358de6421374fb037e8c51e8f2d5878">operator*</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v, const float s)</td></tr>
+<tr class="memdesc:a8358de6421374fb037e8c51e8f2d5878"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply the vector by the scalar s. <a href="namespacemingfx.html#a8358de6421374fb037e8c51e8f2d5878">More...</a><br /></td></tr>
+<tr class="separator:a8358de6421374fb037e8c51e8f2d5878"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5daeaa383c40eed6f41b2c1b7930499f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a5daeaa383c40eed6f41b2c1b7930499f">operator-</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v)</td></tr>
+<tr class="memdesc:a5daeaa383c40eed6f41b2c1b7930499f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Negate the vector. <a href="namespacemingfx.html#a5daeaa383c40eed6f41b2c1b7930499f">More...</a><br /></td></tr>
+<tr class="separator:a5daeaa383c40eed6f41b2c1b7930499f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac71c01d7c300671cb343a24b68a875bf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point2.html">Point2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ac71c01d7c300671cb343a24b68a875bf">operator+</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v, const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p)</td></tr>
+<tr class="memdesc:ac71c01d7c300671cb343a24b68a875bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a vector and a point, returns a point. <a href="namespacemingfx.html#ac71c01d7c300671cb343a24b68a875bf">More...</a><br /></td></tr>
+<tr class="separator:ac71c01d7c300671cb343a24b68a875bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2083f9992ba509a275db11522f16a2e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point2.html">Point2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ab2083f9992ba509a275db11522f16a2e">operator+</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v)</td></tr>
+<tr class="memdesc:ab2083f9992ba509a275db11522f16a2e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a point and a vector, returns a point. <a href="namespacemingfx.html#ab2083f9992ba509a275db11522f16a2e">More...</a><br /></td></tr>
+<tr class="separator:ab2083f9992ba509a275db11522f16a2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acdffada748181cc17ec93784f858ff9f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#acdffada748181cc17ec93784f858ff9f">operator+</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v1, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v2)</td></tr>
+<tr class="memdesc:acdffada748181cc17ec93784f858ff9f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a vector and a vector, returns a vector. <a href="namespacemingfx.html#acdffada748181cc17ec93784f858ff9f">More...</a><br /></td></tr>
+<tr class="separator:acdffada748181cc17ec93784f858ff9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae81fac825c0f6eca59cc1a1cc06d63f2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point2.html">Point2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ae81fac825c0f6eca59cc1a1cc06d63f2">operator-</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v)</td></tr>
+<tr class="memdesc:ae81fac825c0f6eca59cc1a1cc06d63f2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts a vector from a point, returns a point. <a href="namespacemingfx.html#ae81fac825c0f6eca59cc1a1cc06d63f2">More...</a><br /></td></tr>
+<tr class="separator:ae81fac825c0f6eca59cc1a1cc06d63f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a128585c0b87e03beda4a660d4e58789b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a128585c0b87e03beda4a660d4e58789b">operator-</a> (const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v1, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v2)</td></tr>
+<tr class="memdesc:a128585c0b87e03beda4a660d4e58789b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts v2 from v1, returns a vector. <a href="namespacemingfx.html#a128585c0b87e03beda4a660d4e58789b">More...</a><br /></td></tr>
+<tr class="separator:a128585c0b87e03beda4a660d4e58789b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad370bce0bb5b88beb974aad1d44890e8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ad370bce0bb5b88beb974aad1d44890e8">operator-</a> (const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p1, const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;p2)</td></tr>
+<tr class="memdesc:ad370bce0bb5b88beb974aad1d44890e8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the vector spanning p1 and p2. <a href="namespacemingfx.html#ad370bce0bb5b88beb974aad1d44890e8">More...</a><br /></td></tr>
+<tr class="separator:ad370bce0bb5b88beb974aad1d44890e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acbe43aa24ecedf663c65becf2be282c7"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#acbe43aa24ecedf663c65becf2be282c7">operator&lt;&lt;</a> (std::ostream &amp;os, const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v)</td></tr>
+<tr class="separator:acbe43aa24ecedf663c65becf2be282c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3f12496d7a5028b71882373d6fa7203"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ab3f12496d7a5028b71882373d6fa7203">operator&gt;&gt;</a> (std::istream &amp;is, <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v)</td></tr>
+<tr class="separator:ab3f12496d7a5028b71882373d6fa7203"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa19b1dea0b7aa468950e56044fda328a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aa19b1dea0b7aa468950e56044fda328a">operator/</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v, const float s)</td></tr>
+<tr class="memdesc:aa19b1dea0b7aa468950e56044fda328a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Divide the vector by the scalar s. <a href="namespacemingfx.html#aa19b1dea0b7aa468950e56044fda328a">More...</a><br /></td></tr>
+<tr class="separator:aa19b1dea0b7aa468950e56044fda328a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e3941689c65388690916d00e0d423d4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a7e3941689c65388690916d00e0d423d4">operator*</a> (const float s, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="memdesc:a7e3941689c65388690916d00e0d423d4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply the vector by the scalar s. <a href="namespacemingfx.html#a7e3941689c65388690916d00e0d423d4">More...</a><br /></td></tr>
+<tr class="separator:a7e3941689c65388690916d00e0d423d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8a18cb8506dee589eaf6883a32e6fb5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aa8a18cb8506dee589eaf6883a32e6fb5">operator*</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v, const float s)</td></tr>
+<tr class="memdesc:aa8a18cb8506dee589eaf6883a32e6fb5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply the vector by the scalar s. <a href="namespacemingfx.html#aa8a18cb8506dee589eaf6883a32e6fb5">More...</a><br /></td></tr>
+<tr class="separator:aa8a18cb8506dee589eaf6883a32e6fb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd07add6169773bae12d40201f8af7db"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#afd07add6169773bae12d40201f8af7db">operator-</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="memdesc:afd07add6169773bae12d40201f8af7db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Negate the vector. <a href="namespacemingfx.html#afd07add6169773bae12d40201f8af7db">More...</a><br /></td></tr>
+<tr class="separator:afd07add6169773bae12d40201f8af7db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b4428d2cf65ba5226ef4036352d311e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a4b4428d2cf65ba5226ef4036352d311e">operator+</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p)</td></tr>
+<tr class="memdesc:a4b4428d2cf65ba5226ef4036352d311e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a vector and a point, returns a point. <a href="namespacemingfx.html#a4b4428d2cf65ba5226ef4036352d311e">More...</a><br /></td></tr>
+<tr class="separator:a4b4428d2cf65ba5226ef4036352d311e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aadea317107a50ec6847ce01927b61c82"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aadea317107a50ec6847ce01927b61c82">operator+</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="memdesc:aadea317107a50ec6847ce01927b61c82"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a point and a vector, returns a point. <a href="namespacemingfx.html#aadea317107a50ec6847ce01927b61c82">More...</a><br /></td></tr>
+<tr class="separator:aadea317107a50ec6847ce01927b61c82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeeeb04b70f8e8becbcda7a3dc7024c1b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aeeeb04b70f8e8becbcda7a3dc7024c1b">operator+</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v1, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v2)</td></tr>
+<tr class="memdesc:aeeeb04b70f8e8becbcda7a3dc7024c1b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a vector and a vector, returns a vector. <a href="namespacemingfx.html#aeeeb04b70f8e8becbcda7a3dc7024c1b">More...</a><br /></td></tr>
+<tr class="separator:aeeeb04b70f8e8becbcda7a3dc7024c1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a579b90d99a1d6f794ca44017ded3a8db"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_point3.html">Point3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a579b90d99a1d6f794ca44017ded3a8db">operator-</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="memdesc:a579b90d99a1d6f794ca44017ded3a8db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts a vector from a point, returns a point. <a href="namespacemingfx.html#a579b90d99a1d6f794ca44017ded3a8db">More...</a><br /></td></tr>
+<tr class="separator:a579b90d99a1d6f794ca44017ded3a8db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecdf7f36c4feb04034f1d07c49d5c0e3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aecdf7f36c4feb04034f1d07c49d5c0e3">operator-</a> (const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v1, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v2)</td></tr>
+<tr class="memdesc:aecdf7f36c4feb04034f1d07c49d5c0e3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts v2 from v1, returns a vector. <a href="namespacemingfx.html#aecdf7f36c4feb04034f1d07c49d5c0e3">More...</a><br /></td></tr>
+<tr class="separator:aecdf7f36c4feb04034f1d07c49d5c0e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77d92da8f1a866306518422cd9d2f0af"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a77d92da8f1a866306518422cd9d2f0af">operator-</a> (const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p1, const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;p2)</td></tr>
+<tr class="memdesc:a77d92da8f1a866306518422cd9d2f0af"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the vector spanning p1 and p2. <a href="namespacemingfx.html#a77d92da8f1a866306518422cd9d2f0af">More...</a><br /></td></tr>
+<tr class="separator:a77d92da8f1a866306518422cd9d2f0af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3425c24faf923364cd3a764d50601c52"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a3425c24faf923364cd3a764d50601c52">operator&lt;&lt;</a> (std::ostream &amp;os, const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="separator:a3425c24faf923364cd3a764d50601c52"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8cc2f52569661416cb2ca67c516b7c93"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a8cc2f52569661416cb2ca67c516b7c93">operator&gt;&gt;</a> (std::istream &amp;is, <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v)</td></tr>
+<tr class="separator:a8cc2f52569661416cb2ca67c516b7c93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a061ff38340cf1aad4612790b0a600aeb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a061ff38340cf1aad4612790b0a600aeb">&#9670;&nbsp;</a></span>operator*() <span class="overload">[1/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const float &amp;&#160;</td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply matrix and scalar, returns the new matrix. </p>
+
+</div>
+</div>
+<a id="a55f694123e83d1649c112e806359d4b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a55f694123e83d1649c112e806359d4b6">&#9670;&nbsp;</a></span>operator*() <span class="overload">[2/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a8bc25e621d21323fdd96f2c4a4141432"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8bc25e621d21323fdd96f2c4a4141432">&#9670;&nbsp;</a></span>operator*() <span class="overload">[3/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply the vector by the scalar s. </p>
+
+</div>
+</div>
+<a id="a7e3941689c65388690916d00e0d423d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e3941689c65388690916d00e0d423d4">&#9670;&nbsp;</a></span>operator*() <span class="overload">[4/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply the vector by the scalar s. </p>
+
+</div>
+</div>
+<a id="ae5708e414f585dde2a5418ddae259a57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae5708e414f585dde2a5418ddae259a57">&#9670;&nbsp;</a></span>operator*() <span class="overload">[5/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float &amp;&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply matrix and scalar, returns the new matrix. </p>
+
+</div>
+</div>
+<a id="a5b8dabff5d6c9ddcef5e15b0ef807c80"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5b8dabff5d6c9ddcef5e15b0ef807c80">&#9670;&nbsp;</a></span>operator*() <span class="overload">[6/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply matrix and point, returns the new point. </p>
+
+</div>
+</div>
+<a id="a1af1c07624961984759120b7af7f9ce4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1af1c07624961984759120b7af7f9ce4">&#9670;&nbsp;</a></span>operator*() <span class="overload">[7/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_ray.html">Ray</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply matrix and the point and vector portions of the ray, returns the new ray. </p>
+
+</div>
+</div>
+<a id="abb2cfd42e696494e4797d8f7e11f6d77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abb2cfd42e696494e4797d8f7e11f6d77">&#9670;&nbsp;</a></span>operator*() <span class="overload">[8/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply matrix and vector, returns the new vector. </p>
+
+</div>
+</div>
+<a id="aadc0e86a31d54469e730669067b102c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aadc0e86a31d54469e730669067b102c2">&#9670;&nbsp;</a></span>operator*() <span class="overload">[9/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply two matrices, returns the result. </p>
+
+</div>
+</div>
+<a id="adb96b0188d1ceda03ed8d297817502c9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adb96b0188d1ceda03ed8d297817502c9">&#9670;&nbsp;</a></span>operator*() <span class="overload">[10/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a0a456bccfb238b9644cf21669cf35b8c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0a456bccfb238b9644cf21669cf35b8c">&#9670;&nbsp;</a></span>operator*() <span class="overload">[11/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a8358de6421374fb037e8c51e8f2d5878"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8358de6421374fb037e8c51e8f2d5878">&#9670;&nbsp;</a></span>operator*() <span class="overload">[12/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply the vector by the scalar s. </p>
+
+</div>
+</div>
+<a id="aa8a18cb8506dee589eaf6883a32e6fb5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa8a18cb8506dee589eaf6883a32e6fb5">&#9670;&nbsp;</a></span>operator*() <span class="overload">[13/13]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::operator* </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Multiply the vector by the scalar s. </p>
+
+</div>
+</div>
+<a id="a3c3b45ed6edf3fe76f98a7fd165dca03"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3c3b45ed6edf3fe76f98a7fd165dca03">&#9670;&nbsp;</a></span>operator+() <span class="overload">[1/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> mingfx::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;&#160;</td>
+ <td class="paramname"><em>A</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;&#160;</td>
+ <td class="paramname"><em>B</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ab2083f9992ba509a275db11522f16a2e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab2083f9992ba509a275db11522f16a2e">&#9670;&nbsp;</a></span>operator+() <span class="overload">[2/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point2.html">Point2</a> mingfx::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Adds a point and a vector, returns a point. </p>
+
+</div>
+</div>
+<a id="aadea317107a50ec6847ce01927b61c82"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aadea317107a50ec6847ce01927b61c82">&#9670;&nbsp;</a></span>operator+() <span class="overload">[3/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Adds a point and a vector, returns a point. </p>
+
+</div>
+</div>
+<a id="ad49375487853a642b3f372c95cff1a96"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad49375487853a642b3f372c95cff1a96">&#9670;&nbsp;</a></span>operator+() <span class="overload">[4/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac71c01d7c300671cb343a24b68a875bf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac71c01d7c300671cb343a24b68a875bf">&#9670;&nbsp;</a></span>operator+() <span class="overload">[5/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point2.html">Point2</a> mingfx::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Adds a vector and a point, returns a point. </p>
+
+</div>
+</div>
+<a id="acdffada748181cc17ec93784f858ff9f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acdffada748181cc17ec93784f858ff9f">&#9670;&nbsp;</a></span>operator+() <span class="overload">[6/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Adds a vector and a vector, returns a vector. </p>
+
+</div>
+</div>
+<a id="a4b4428d2cf65ba5226ef4036352d311e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4b4428d2cf65ba5226ef4036352d311e">&#9670;&nbsp;</a></span>operator+() <span class="overload">[7/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Adds a vector and a point, returns a point. </p>
+
+</div>
+</div>
+<a id="aeeeb04b70f8e8becbcda7a3dc7024c1b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeeeb04b70f8e8becbcda7a3dc7024c1b">&#9670;&nbsp;</a></span>operator+() <span class="overload">[8/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Adds a vector and a vector, returns a vector. </p>
+
+</div>
+</div>
+<a id="ae81fac825c0f6eca59cc1a1cc06d63f2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae81fac825c0f6eca59cc1a1cc06d63f2">&#9670;&nbsp;</a></span>operator-() <span class="overload">[1/10]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point2.html">Point2</a> mingfx::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtracts a vector from a point, returns a point. </p>
+
+</div>
+</div>
+<a id="ad370bce0bb5b88beb974aad1d44890e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad370bce0bb5b88beb974aad1d44890e8">&#9670;&nbsp;</a></span>operator-() <span class="overload">[2/10]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the vector spanning p1 and p2. </p>
+
+</div>
+</div>
+<a id="a579b90d99a1d6f794ca44017ded3a8db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a579b90d99a1d6f794ca44017ded3a8db">&#9670;&nbsp;</a></span>operator-() <span class="overload">[3/10]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> mingfx::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtracts a vector from a point, returns a point. </p>
+
+</div>
+</div>
+<a id="a77d92da8f1a866306518422cd9d2f0af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a77d92da8f1a866306518422cd9d2f0af">&#9670;&nbsp;</a></span>operator-() <span class="overload">[4/10]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the vector spanning p1 and p2. </p>
+
+</div>
+</div>
+<a id="a2f5a225a54f07164d5172a3721a3aee6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2f5a225a54f07164d5172a3721a3aee6">&#9670;&nbsp;</a></span>operator-() <span class="overload">[5/10]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a61f2d974c78e8884bb64c2759e455101"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a61f2d974c78e8884bb64c2759e455101">&#9670;&nbsp;</a></span>operator-() <span class="overload">[6/10]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5daeaa383c40eed6f41b2c1b7930499f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5daeaa383c40eed6f41b2c1b7930499f">&#9670;&nbsp;</a></span>operator-() <span class="overload">[7/10]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Negate the vector. </p>
+
+</div>
+</div>
+<a id="a128585c0b87e03beda4a660d4e58789b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a128585c0b87e03beda4a660d4e58789b">&#9670;&nbsp;</a></span>operator-() <span class="overload">[8/10]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtracts v2 from v1, returns a vector. </p>
+
+</div>
+</div>
+<a id="afd07add6169773bae12d40201f8af7db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd07add6169773bae12d40201f8af7db">&#9670;&nbsp;</a></span>operator-() <span class="overload">[9/10]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Negate the vector. </p>
+
+</div>
+</div>
+<a id="aecdf7f36c4feb04034f1d07c49d5c0e3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aecdf7f36c4feb04034f1d07c49d5c0e3">&#9670;&nbsp;</a></span>operator-() <span class="overload">[10/10]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Subtracts v2 from v1, returns a vector. </p>
+
+</div>
+</div>
+<a id="a444ae88d836b913ac8307fbf4357f7ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a444ae88d836b913ac8307fbf4357f7ed">&#9670;&nbsp;</a></span>operator/() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> mingfx::operator/ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a79ffb6c38c6c0b68ce1fdb7ae76ea6bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a79ffb6c38c6c0b68ce1fdb7ae76ea6bd">&#9670;&nbsp;</a></span>operator/() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> mingfx::operator/ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Divide the vector by the scalar s. </p>
+
+</div>
+</div>
+<a id="aa19b1dea0b7aa468950e56044fda328a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa19b1dea0b7aa468950e56044fda328a">&#9670;&nbsp;</a></span>operator/() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> mingfx::operator/ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const float&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Divide the vector by the scalar s. </p>
+
+</div>
+</div>
+<a id="a6bc967741341f4f318a505d884192906"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6bc967741341f4f318a505d884192906">&#9670;&nbsp;</a></span>operator&lt;&lt;() <span class="overload">[1/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::ostream&amp; mingfx::operator&lt;&lt; </td>
+ <td>(</td>
+ <td class="paramtype">std::ostream &amp;&#160;</td>
+ <td class="paramname"><em>os</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>c</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a1584104dea1f0a5636c868b67ddf6b10"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1584104dea1f0a5636c868b67ddf6b10">&#9670;&nbsp;</a></span>operator&lt;&lt;() <span class="overload">[2/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::ostream&amp; mingfx::operator&lt;&lt; </td>
+ <td>(</td>
+ <td class="paramtype">std::ostream &amp;&#160;</td>
+ <td class="paramname"><em>os</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a58ddc500b8c3e12f8af4515f258540cb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58ddc500b8c3e12f8af4515f258540cb">&#9670;&nbsp;</a></span>operator&lt;&lt;() <span class="overload">[3/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::ostream&amp; mingfx::operator&lt;&lt; </td>
+ <td>(</td>
+ <td class="paramtype">std::ostream &amp;&#160;</td>
+ <td class="paramname"><em>os</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a53ce6bc4f4abdd3797d7af47adecbaf6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a53ce6bc4f4abdd3797d7af47adecbaf6">&#9670;&nbsp;</a></span>operator&lt;&lt;() <span class="overload">[4/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::ostream&amp; mingfx::operator&lt;&lt; </td>
+ <td>(</td>
+ <td class="paramtype">std::ostream &amp;&#160;</td>
+ <td class="paramname"><em>os</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac4b78a682ff8d1ec298e0df7f742658d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac4b78a682ff8d1ec298e0df7f742658d">&#9670;&nbsp;</a></span>operator&lt;&lt;() <span class="overload">[5/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::ostream&amp; mingfx::operator&lt;&lt; </td>
+ <td>(</td>
+ <td class="paramtype">std::ostream &amp;&#160;</td>
+ <td class="paramname"><em>os</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ad7c839e598b7be6c1b407330dfacc980"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad7c839e598b7be6c1b407330dfacc980">&#9670;&nbsp;</a></span>operator&lt;&lt;() <span class="overload">[6/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::ostream&amp; mingfx::operator&lt;&lt; </td>
+ <td>(</td>
+ <td class="paramtype">std::ostream &amp;&#160;</td>
+ <td class="paramname"><em>os</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="acbe43aa24ecedf663c65becf2be282c7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acbe43aa24ecedf663c65becf2be282c7">&#9670;&nbsp;</a></span>operator&lt;&lt;() <span class="overload">[7/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::ostream&amp; mingfx::operator&lt;&lt; </td>
+ <td>(</td>
+ <td class="paramtype">std::ostream &amp;&#160;</td>
+ <td class="paramname"><em>os</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a3425c24faf923364cd3a764d50601c52"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3425c24faf923364cd3a764d50601c52">&#9670;&nbsp;</a></span>operator&lt;&lt;() <span class="overload">[8/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::ostream&amp; mingfx::operator&lt;&lt; </td>
+ <td>(</td>
+ <td class="paramtype">std::ostream &amp;&#160;</td>
+ <td class="paramname"><em>os</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a6eb31e6e81c6e29144799be4c9db404d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6eb31e6e81c6e29144799be4c9db404d">&#9670;&nbsp;</a></span>operator&gt;&gt;() <span class="overload">[1/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::istream&amp; mingfx::operator&gt;&gt; </td>
+ <td>(</td>
+ <td class="paramtype">std::istream &amp;&#160;</td>
+ <td class="paramname"><em>is</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_color.html">Color</a> &amp;&#160;</td>
+ <td class="paramname"><em>c</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a05fc1c0b2b6011283c019242d6a2de74"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a05fc1c0b2b6011283c019242d6a2de74">&#9670;&nbsp;</a></span>operator&gt;&gt;() <span class="overload">[2/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::istream&amp; mingfx::operator&gt;&gt; </td>
+ <td>(</td>
+ <td class="paramtype">std::istream &amp;&#160;</td>
+ <td class="paramname"><em>is</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;&#160;</td>
+ <td class="paramname"><em>m</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a256924759a6718882a2b40e17d3e523d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a256924759a6718882a2b40e17d3e523d">&#9670;&nbsp;</a></span>operator&gt;&gt;() <span class="overload">[3/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::istream&amp; mingfx::operator&gt;&gt; </td>
+ <td>(</td>
+ <td class="paramtype">std::istream &amp;&#160;</td>
+ <td class="paramname"><em>is</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point2.html">Point2</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ad95e9b494b9761895d57e2b698b69afd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad95e9b494b9761895d57e2b698b69afd">&#9670;&nbsp;</a></span>operator&gt;&gt;() <span class="overload">[4/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::istream&amp; mingfx::operator&gt;&gt; </td>
+ <td>(</td>
+ <td class="paramtype">std::istream &amp;&#160;</td>
+ <td class="paramname"><em>is</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_point3.html">Point3</a> &amp;&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a59fb7a99df5c572849e31065884b2235"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a59fb7a99df5c572849e31065884b2235">&#9670;&nbsp;</a></span>operator&gt;&gt;() <span class="overload">[5/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::istream&amp; mingfx::operator&gt;&gt; </td>
+ <td>(</td>
+ <td class="paramtype">std::istream &amp;&#160;</td>
+ <td class="paramname"><em>is</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;&#160;</td>
+ <td class="paramname"><em>q</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a0412270963460363fa015b9b4785cc59"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0412270963460363fa015b9b4785cc59">&#9670;&nbsp;</a></span>operator&gt;&gt;() <span class="overload">[6/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::istream&amp; mingfx::operator&gt;&gt; </td>
+ <td>(</td>
+ <td class="paramtype">std::istream &amp;&#160;</td>
+ <td class="paramname"><em>is</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_ray.html">Ray</a> &amp;&#160;</td>
+ <td class="paramname"><em>r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ab3f12496d7a5028b71882373d6fa7203"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3f12496d7a5028b71882373d6fa7203">&#9670;&nbsp;</a></span>operator&gt;&gt;() <span class="overload">[7/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::istream&amp; mingfx::operator&gt;&gt; </td>
+ <td>(</td>
+ <td class="paramtype">std::istream &amp;&#160;</td>
+ <td class="paramname"><em>is</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a8cc2f52569661416cb2ca67c516b7c93"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8cc2f52569661416cb2ca67c516b7c93">&#9670;&nbsp;</a></span>operator&gt;&gt;() <span class="overload">[8/8]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::istream&amp; mingfx::operator&gt;&gt; </td>
+ <td>(</td>
+ <td class="paramtype">std::istream &amp;&#160;</td>
+ <td class="paramname"><em>is</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;&#160;</td>
+ <td class="paramname"><em>v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/nav_f.png b/dev/MinGfx/docs/html/nav_f.png
new file mode 100644
index 0000000..5a578e8
--- /dev/null
+++ b/dev/MinGfx/docs/html/nav_f.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/nav_g.png b/dev/MinGfx/docs/html/nav_g.png
new file mode 100644
index 0000000..2093a23
--- /dev/null
+++ b/dev/MinGfx/docs/html/nav_g.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/nav_h.png b/dev/MinGfx/docs/html/nav_h.png
new file mode 100644
index 0000000..818e77a
--- /dev/null
+++ b/dev/MinGfx/docs/html/nav_h.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/open.png b/dev/MinGfx/docs/html/open.png
new file mode 100644
index 0000000..fd4dbc6
--- /dev/null
+++ b/dev/MinGfx/docs/html/open.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/opengl__headers_8h.html b/dev/MinGfx/docs/html/opengl__headers_8h.html
new file mode 100644
index 0000000..2b685da
--- /dev/null
+++ b/dev/MinGfx/docs/html/opengl__headers_8h.html
@@ -0,0 +1,94 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/opengl_headers.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">opengl_headers.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;nanogui/opengl.h&gt;</code><br />
+</div>
+<p><a href="opengl__headers_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/opengl__headers_8h_source.html b/dev/MinGfx/docs/html/opengl__headers_8h_source.html
new file mode 100644
index 0000000..2a3ce01
--- /dev/null
+++ b/dev/MinGfx/docs/html/opengl__headers_8h_source.html
@@ -0,0 +1,139 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/opengl_headers.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">opengl_headers.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="opengl__headers_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">// We often use the code that is commented out below to load opengl headers in a cross-platform way,</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// but since nanogui uses glad internally, we will just use their approach to load opengl headers</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// so that everything is consistent.</span></div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; </div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// disable warnings for this 3rd party code</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#pragma warning ( push, 0 )</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &lt;nanogui/opengl.h&gt;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#pragma warning ( pop )</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment">/*** Our typical (non-nanogui) appraoch:</span></div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment">// GLEW is needed on Windows and Linux</span></div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment">#ifdef _WIN32</span></div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment">#include &quot;GL/glew.h&quot;</span></div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="comment">#include &quot;GL/wglew.h&quot;</span></div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="comment">#elif (!defined(__APPLE__))</span></div>
+<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="comment">#include &quot;GL/glxew.h&quot;</span></div>
+<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="comment">#endif</span></div>
+<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="comment">// OpenGL Headers</span></div>
+<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="comment">#if defined(WIN32)</span></div>
+<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="comment">#define NOMINMAX</span></div>
+<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="comment">#include &lt;windows.h&gt;</span></div>
+<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="comment">#include &lt;GL/gl.h&gt;</span></div>
+<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="comment">#elif defined(__APPLE__)</span></div>
+<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="comment">#define GL_GLEXT_PROTOTYPES</span></div>
+<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment">#include &lt;OpenGL/gl3.h&gt;</span></div>
+<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment">#include &lt;OpenGL/glext.h&gt;</span></div>
+<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment">#else</span></div>
+<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment">#define GL_GLEXT_PROTOTYPES</span></div>
+<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="comment">#include &lt;GL/gl.h&gt;</span></div>
+<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="comment">#endif</span></div>
+<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment">***/</span></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/pages.html b/dev/MinGfx/docs/html/pages.html
new file mode 100644
index 0000000..3605d7e
--- /dev/null
+++ b/dev/MinGfx/docs/html/pages.html
@@ -0,0 +1,93 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Related Pages</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Related Pages</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all related documentation pages:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="api.html" target="_self">API - MinGfx Programming Reference Organized by Topic</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="installation.html" target="_self">Installation Guide</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/platform_8h.html b/dev/MinGfx/docs/html/platform_8h.html
new file mode 100644
index 0000000..558b399
--- /dev/null
+++ b/dev/MinGfx/docs/html/platform_8h.html
@@ -0,0 +1,111 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/platform.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">platform.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;string&gt;</code><br />
+<code>#include &lt;vector&gt;</code><br />
+</div>
+<p><a href="platform_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_platform.html">mingfx::Platform</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Provides access to the underlying file system and other platform-specific routines. <a href="classmingfx_1_1_platform.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/platform_8h_source.html b/dev/MinGfx/docs/html/platform_8h_source.html
new file mode 100644
index 0000000..ec35140
--- /dev/null
+++ b/dev/MinGfx/docs/html/platform_8h_source.html
@@ -0,0 +1,161 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/platform.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">platform.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="platform_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_PLATFORM_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_PLATFORM_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; </div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
+<div class="line"><a name="l00026"></a><span class="lineno"><a class="line" href="classmingfx_1_1_platform.html"> 26</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_platform.html">Platform</a> {</div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; </div>
+<div class="line"><a name="l00030"></a><span class="lineno"><a class="line" href="classmingfx_1_1_platform.html#a045007efda73123a7f4019837d83bc92"> 30</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_platform.html#a045007efda73123a7f4019837d83bc92">FileExists</a>(<span class="keyword">const</span> std::string &amp;filename);</div>
+<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; </div>
+<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="comment">/* Looks for a file named basename in each of the paths specified. If found,</span></div>
+<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="comment"> the full path to the file is returned. If not found, then basename is returned.</span></div>
+<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="comment"> Example:</span></div>
+<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="comment"> ~~~</span></div>
+<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="comment"> std::vector&lt;std::string&gt; search_path;</span></div>
+<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="comment"> search_path.push_back(&quot;.&quot;);</span></div>
+<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="comment"> search_path.push_back(&quot;./data&quot;);</span></div>
+<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="comment"> search_path.push_back(&quot;./shaders&quot;);</span></div>
+<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="comment"> search_path.push_back(&quot;/usr/local/share/blah/blah/data&quot;);</span></div>
+<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment"> std::string file = Platform::findFile(&quot;mydata.csv&quot;, search_path);</span></div>
+<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment"> ~~~</span></div>
+<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1"> 45</a></span>&#160; <span class="keyword">static</span> std::string <a class="code" href="classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1">FindFile</a>(<span class="keyword">const</span> std::string &amp;basename, <span class="keyword">const</span> std::vector&lt;std::string&gt; &amp;searchpath);</div>
+<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; </div>
+<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="comment">/* Looks for a file named basename in each of the paths specified in a semi-colon</span></div>
+<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment"> separated list. If found, the full path to the file is returned. If not found, </span></div>
+<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment"> then basename is returned. Example:</span></div>
+<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="comment"> ~~~</span></div>
+<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="comment"> std::string search_path = &quot;.;./data;./shaders;/usr/local/share/blah/blah/data&quot;;</span></div>
+<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="comment"> std::string file = Platform::findFile(&quot;mydata.csv&quot;, search_path);</span></div>
+<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="comment"> ~~~</span></div>
+<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="classmingfx_1_1_platform.html#a03ade910313dd9580c9e37a7b63f87b2"> 55</a></span>&#160; <span class="keyword">static</span> std::string <a class="code" href="classmingfx_1_1_platform.html#a03ade910313dd9580c9e37a7b63f87b2">FindFile</a>(<span class="keyword">const</span> std::string &amp;basename, <span class="keyword">const</span> std::string &amp;searchpath);</div>
+<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
+<div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b"> 65</a></span>&#160; <span class="keyword">static</span> std::string <a class="code" href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b">FindMinGfxDataFile</a>(<span class="keyword">const</span> std::string &amp;basename);</div>
+<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
+<div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="classmingfx_1_1_platform.html#af12cd63e1ede33529d8c282d7d916169"> 75</a></span>&#160; <span class="keyword">static</span> std::string <a class="code" href="classmingfx_1_1_platform.html#af12cd63e1ede33529d8c282d7d916169">FindMinGfxShaderFile</a>(<span class="keyword">const</span> std::string &amp;basename);</div>
+<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; </div>
+<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;};</div>
+<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; </div>
+<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; </div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; </div>
+<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_platform_html"><div class="ttname"><a href="classmingfx_1_1_platform.html">mingfx::Platform</a></div><div class="ttdoc">Provides access to the underlying file system and other platform-specific routines.</div><div class="ttdef"><b>Definition:</b> <a href="platform_8h_source.html#l00026">platform.h:26</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_platform_html_a03ade910313dd9580c9e37a7b63f87b2"><div class="ttname"><a href="classmingfx_1_1_platform.html#a03ade910313dd9580c9e37a7b63f87b2">mingfx::Platform::FindFile</a></div><div class="ttdeci">static std::string FindFile(const std::string &amp;basename, const std::string &amp;searchpath)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_platform_html_a045007efda73123a7f4019837d83bc92"><div class="ttname"><a href="classmingfx_1_1_platform.html#a045007efda73123a7f4019837d83bc92">mingfx::Platform::FileExists</a></div><div class="ttdeci">static bool FileExists(const std::string &amp;filename)</div><div class="ttdoc">True if filename is found and can be opened for reading on the system.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_platform_html_a2c36ca57a246efa218a49a942c8c4a3b"><div class="ttname"><a href="classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b">mingfx::Platform::FindMinGfxDataFile</a></div><div class="ttdeci">static std::string FindMinGfxDataFile(const std::string &amp;basename)</div><div class="ttdoc">Searches for a data file that ships with MinGfx.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_platform_html_a32a392f4bac832c95fabc2d10bd03ad1"><div class="ttname"><a href="classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1">mingfx::Platform::FindFile</a></div><div class="ttdeci">static std::string FindFile(const std::string &amp;basename, const std::vector&lt; std::string &gt; &amp;searchpath)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_platform_html_af12cd63e1ede33529d8c282d7d916169"><div class="ttname"><a href="classmingfx_1_1_platform.html#af12cd63e1ede33529d8c282d7d916169">mingfx::Platform::FindMinGfxShaderFile</a></div><div class="ttdeci">static std::string FindMinGfxShaderFile(const std::string &amp;basename)</div><div class="ttdoc">Searches for a shader file that ships with MinGfx.</div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/point2_8h.html b/dev/MinGfx/docs/html/point2_8h.html
new file mode 100644
index 0000000..3b2bedf
--- /dev/null
+++ b/dev/MinGfx/docs/html/point2_8h.html
@@ -0,0 +1,144 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/point2.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">point2.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;iostream&gt;</code><br />
+</div>
+<p><a href="point2_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point2.html">mingfx::Point2</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 2D Point with floating point coordinates, used for storing 2D texture coordinates, screen-space graphics, and mouse input. <a href="classmingfx_1_1_point2.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a432350d21fbc10d5e65eeeb6859511ea"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="point2_8h.html#a432350d21fbc10d5e65eeeb6859511ea">MINGFX_MATH_EPSILON</a>&#160;&#160;&#160;1e-8</td></tr>
+<tr class="memdesc:a432350d21fbc10d5e65eeeb6859511ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Epsilon value used for == and != comparisons within MinGfx. <a href="point2_8h.html#a432350d21fbc10d5e65eeeb6859511ea">More...</a><br /></td></tr>
+<tr class="separator:a432350d21fbc10d5e65eeeb6859511ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a58ddc500b8c3e12f8af4515f258540cb"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a58ddc500b8c3e12f8af4515f258540cb">mingfx::operator&lt;&lt;</a> (std::ostream &amp;os, const Point2 &amp;p)</td></tr>
+<tr class="separator:a58ddc500b8c3e12f8af4515f258540cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a256924759a6718882a2b40e17d3e523d"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a256924759a6718882a2b40e17d3e523d">mingfx::operator&gt;&gt;</a> (std::istream &amp;is, Point2 &amp;p)</td></tr>
+<tr class="separator:a256924759a6718882a2b40e17d3e523d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a432350d21fbc10d5e65eeeb6859511ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a432350d21fbc10d5e65eeeb6859511ea">&#9670;&nbsp;</a></span>MINGFX_MATH_EPSILON</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define MINGFX_MATH_EPSILON&#160;&#160;&#160;1e-8</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Epsilon value used for == and != comparisons within MinGfx. </p>
+
+<p class="definition">Definition at line <a class="el" href="point2_8h_source.html#l00022">22</a> of file <a class="el" href="point2_8h_source.html">point2.h</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/point2_8h_source.html b/dev/MinGfx/docs/html/point2_8h_source.html
new file mode 100644
index 0000000..c2b55b1
--- /dev/null
+++ b/dev/MinGfx/docs/html/point2_8h_source.html
@@ -0,0 +1,191 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/point2.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">point2.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="point2_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_POINT2_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_POINT2_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; </div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
+<div class="line"><a name="l00022"></a><span class="lineno"><a class="line" href="point2_8h.html#a432350d21fbc10d5e65eeeb6859511ea"> 22</a></span>&#160;<span class="preprocessor">#define MINGFX_MATH_EPSILON 1e-8</span></div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; </div>
+<div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html"> 28</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_point2.html">Point2</a> {</div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1"> 31</a></span>&#160; <a class="code" href="classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1">Point2</a>();</div>
+<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; </div>
+<div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a716fcff21456f29561ec27118a646483"> 35</a></span>&#160; <a class="code" href="classmingfx_1_1_point2.html#a716fcff21456f29561ec27118a646483">Point2</a>(<span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa">x</a>, <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8">y</a>);</div>
+<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; </div>
+<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a4ba487a2038ebc78b461b66f1987053f"> 38</a></span>&#160; <a class="code" href="classmingfx_1_1_point2.html#a4ba487a2038ebc78b461b66f1987053f">Point2</a>(<span class="keywordtype">float</span> *p);</div>
+<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; </div>
+<div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a97464af92444984e275dca38a3f4eef0"> 41</a></span>&#160; <a class="code" href="classmingfx_1_1_point2.html#a97464af92444984e275dca38a3f4eef0">Point2</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; p);</div>
+<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; </div>
+<div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a7e5b2dcd7e079bdd00354e7ccf9c5c2a"> 44</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_point2.html#a7e5b2dcd7e079bdd00354e7ccf9c5c2a">~Point2</a>();</div>
+<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; </div>
+<div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#ae8729260293b993bbf3cb31c0a33edfa"> 47</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_point2.html#ae8729260293b993bbf3cb31c0a33edfa">operator==</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; p) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; </div>
+<div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a5b99fcf93a0c6d2b247290f5564f8a84"> 50</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_point2.html#a5b99fcf93a0c6d2b247290f5564f8a84">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; p) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; </div>
+<div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#afc68153cce7dc528e95cf5ad81c63902"> 53</a></span>&#160; <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; <a class="code" href="classmingfx_1_1_point2.html#afc68153cce7dc528e95cf5ad81c63902">operator=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; p);</div>
+<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; </div>
+<div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#af4c0cc334dfbfe8e8068156e6da16542"> 56</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point2.html#af4c0cc334dfbfe8e8068156e6da16542">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; </div>
+<div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a50f09df619fd226e6dc3ccff452abab3"> 65</a></span>&#160; <span class="keywordtype">float</span>&amp; <a class="code" href="classmingfx_1_1_point2.html#a50f09df619fd226e6dc3ccff452abab3">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i);</div>
+<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
+<div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa"> 69</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa">x</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> p[0]; }</div>
+<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; </div>
+<div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8"> 73</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8">y</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> p[1]; }</div>
+<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; </div>
+<div class="line"><a name="l00076"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#ab00e35eccdc4b7deae8172f5954a86e8"> 76</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point2.html#ab00e35eccdc4b7deae8172f5954a86e8">w</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> 1.0; }</div>
+<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; </div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
+<div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a027b2412f1c36242ccb06cf37c7e29bc"> 80</a></span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> * <a class="code" href="classmingfx_1_1_point2.html#a027b2412f1c36242ccb06cf37c7e29bc">value_ptr</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; </div>
+<div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a900567ad5e3c0e6de217b52167c49fd6"> 85</a></span>&#160; <a class="code" href="classmingfx_1_1_point2.html">Point2</a> <a class="code" href="classmingfx_1_1_point2.html#a900567ad5e3c0e6de217b52167c49fd6">Lerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;b, <span class="keywordtype">float</span> alpha) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; </div>
+<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; </div>
+<div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a24d7a5121fceba01b46f3ba0f6525630"> 89</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; <a class="code" href="classmingfx_1_1_point2.html#a24d7a5121fceba01b46f3ba0f6525630">Origin</a>();</div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; </div>
+<div class="line"><a name="l00092"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a60a2b348deab631b51caca3eb715461f"> 92</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; <a class="code" href="classmingfx_1_1_point2.html#a60a2b348deab631b51caca3eb715461f">Zero</a>();</div>
+<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; </div>
+<div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a38149d8797bf7406fc34cab0ea5a3ac8"> 95</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; <a class="code" href="classmingfx_1_1_point2.html#a38149d8797bf7406fc34cab0ea5a3ac8">One</a>();</div>
+<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; </div>
+<div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point2.html#a680648ae01c549c48f7a3d5d75d8791e"> 99</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> <a class="code" href="classmingfx_1_1_point2.html#a680648ae01c549c48f7a3d5d75d8791e">Lerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;a, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;b, <span class="keywordtype">float</span> alpha);</div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; </div>
+<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keywordtype">float</span> p[2];</div>
+<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160;};</div>
+<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; </div>
+<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; </div>
+<div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a58ddc500b8c3e12f8af4515f258540cb"> 106</a></span>&#160;std::ostream &amp; <a class="code" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">operator&lt;&lt; </a>( std::ostream &amp;os, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;p);</div>
+<div class="line"><a name="l00107"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a256924759a6718882a2b40e17d3e523d"> 107</a></span>&#160;std::istream &amp; <a class="code" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">operator&gt;&gt; </a>( std::istream &amp;is, <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;p);</div>
+<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; </div>
+<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; </div>
+<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;} <span class="comment">// namespace</span></div>
+<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; </div>
+<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html"><div class="ttname"><a href="classmingfx_1_1_point2.html">mingfx::Point2</a></div><div class="ttdoc">A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...</div><div class="ttdef"><b>Definition:</b> <a href="point2_8h_source.html#l00028">point2.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a027b2412f1c36242ccb06cf37c7e29bc"><div class="ttname"><a href="classmingfx_1_1_point2.html#a027b2412f1c36242ccb06cf37c7e29bc">mingfx::Point2::value_ptr</a></div><div class="ttdeci">const float * value_ptr() const</div><div class="ttdoc">Returns a const pointer to the raw data array.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a24d7a5121fceba01b46f3ba0f6525630"><div class="ttname"><a href="classmingfx_1_1_point2.html#a24d7a5121fceba01b46f3ba0f6525630">mingfx::Point2::Origin</a></div><div class="ttdeci">static const Point2 &amp; Origin()</div><div class="ttdoc">(0,0) - a shortcut for a special point that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a2e5869d810b52be4ba43c8a4f4e117a1"><div class="ttname"><a href="classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1">mingfx::Point2::Point2</a></div><div class="ttdeci">Point2()</div><div class="ttdoc">Default point at the origin.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a38149d8797bf7406fc34cab0ea5a3ac8"><div class="ttname"><a href="classmingfx_1_1_point2.html#a38149d8797bf7406fc34cab0ea5a3ac8">mingfx::Point2::One</a></div><div class="ttdeci">static const Point2 &amp; One()</div><div class="ttdoc">(1,1) - a shortcut for a special point that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a4ba487a2038ebc78b461b66f1987053f"><div class="ttname"><a href="classmingfx_1_1_point2.html#a4ba487a2038ebc78b461b66f1987053f">mingfx::Point2::Point2</a></div><div class="ttdeci">Point2(float *p)</div><div class="ttdoc">Constructs a point given a pointer to x,y data.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a4f97a7a75276a147ac06fc4dec810ec8"><div class="ttname"><a href="classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8">mingfx::Point2::y</a></div><div class="ttdeci">float y() const</div><div class="ttdoc">Read only access to the y coordinate. Can also use my_point[1]. Use the my_point[1] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="point2_8h_source.html#l00073">point2.h:73</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a50f09df619fd226e6dc3ccff452abab3"><div class="ttname"><a href="classmingfx_1_1_point2.html#a50f09df619fd226e6dc3ccff452abab3">mingfx::Point2::operator[]</a></div><div class="ttdeci">float &amp; operator[](const int i)</div><div class="ttdoc">Returns a reference to the ith coordinate of the point. Use this accessor if you wish to set the coor...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a5b99fcf93a0c6d2b247290f5564f8a84"><div class="ttname"><a href="classmingfx_1_1_point2.html#a5b99fcf93a0c6d2b247290f5564f8a84">mingfx::Point2::operator!=</a></div><div class="ttdeci">bool operator!=(const Point2 &amp;p) const</div><div class="ttdoc">Check for &quot;inequality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a60a2b348deab631b51caca3eb715461f"><div class="ttname"><a href="classmingfx_1_1_point2.html#a60a2b348deab631b51caca3eb715461f">mingfx::Point2::Zero</a></div><div class="ttdeci">static const Point2 &amp; Zero()</div><div class="ttdoc">(0,0) - a shortcut for a special point that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a680648ae01c549c48f7a3d5d75d8791e"><div class="ttname"><a href="classmingfx_1_1_point2.html#a680648ae01c549c48f7a3d5d75d8791e">mingfx::Point2::Lerp</a></div><div class="ttdeci">static Point2 Lerp(const Point2 &amp;a, const Point2 &amp;b, float alpha)</div><div class="ttdoc">Linear interpolation between two points. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b',...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a716fcff21456f29561ec27118a646483"><div class="ttname"><a href="classmingfx_1_1_point2.html#a716fcff21456f29561ec27118a646483">mingfx::Point2::Point2</a></div><div class="ttdeci">Point2(float x, float y)</div><div class="ttdoc">Constructs a point given (x,y,1), where the 1 comes from the use of homogeneous coordinates in comput...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a7e5b2dcd7e079bdd00354e7ccf9c5c2a"><div class="ttname"><a href="classmingfx_1_1_point2.html#a7e5b2dcd7e079bdd00354e7ccf9c5c2a">mingfx::Point2::~Point2</a></div><div class="ttdeci">virtual ~Point2()</div><div class="ttdoc">Point destructor.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a900567ad5e3c0e6de217b52167c49fd6"><div class="ttname"><a href="classmingfx_1_1_point2.html#a900567ad5e3c0e6de217b52167c49fd6">mingfx::Point2::Lerp</a></div><div class="ttdeci">Point2 Lerp(const Point2 &amp;b, float alpha) const</div><div class="ttdoc">Linear interpolation between this point and another. Alpha=0.0 returns this point,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a92447f64ca82f67e855da0c42db12ffa"><div class="ttname"><a href="classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa">mingfx::Point2::x</a></div><div class="ttdeci">float x() const</div><div class="ttdoc">Read only access to the x coordinate. Can also use my_point[0]. Use the my_point[0] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="point2_8h_source.html#l00069">point2.h:69</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_a97464af92444984e275dca38a3f4eef0"><div class="ttname"><a href="classmingfx_1_1_point2.html#a97464af92444984e275dca38a3f4eef0">mingfx::Point2::Point2</a></div><div class="ttdeci">Point2(const Point2 &amp;p)</div><div class="ttdoc">Copy constructor for point.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_ab00e35eccdc4b7deae8172f5954a86e8"><div class="ttname"><a href="classmingfx_1_1_point2.html#ab00e35eccdc4b7deae8172f5954a86e8">mingfx::Point2::w</a></div><div class="ttdeci">float w() const</div><div class="ttdoc">In homogeneous coordinates, the w coordinate for all points is 1.0.</div><div class="ttdef"><b>Definition:</b> <a href="point2_8h_source.html#l00076">point2.h:76</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_ae8729260293b993bbf3cb31c0a33edfa"><div class="ttname"><a href="classmingfx_1_1_point2.html#ae8729260293b993bbf3cb31c0a33edfa">mingfx::Point2::operator==</a></div><div class="ttdeci">bool operator==(const Point2 &amp;p) const</div><div class="ttdoc">Check for &quot;equality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_af4c0cc334dfbfe8e8068156e6da16542"><div class="ttname"><a href="classmingfx_1_1_point2.html#af4c0cc334dfbfe8e8068156e6da16542">mingfx::Point2::operator[]</a></div><div class="ttdeci">float operator[](const int i) const</div><div class="ttdoc">Read only access to the ith coordinate of the point.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html_afc68153cce7dc528e95cf5ad81c63902"><div class="ttname"><a href="classmingfx_1_1_point2.html#afc68153cce7dc528e95cf5ad81c63902">mingfx::Point2::operator=</a></div><div class="ttdeci">Point2 &amp; operator=(const Point2 &amp;p)</div><div class="ttdoc">Assignment operator.</div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="anamespacemingfx_html_a6bc967741341f4f318a505d884192906"><div class="ttname"><a href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">mingfx::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a6eb31e6e81c6e29144799be4c9db404d"><div class="ttname"><a href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">mingfx::operator&gt;&gt;</a></div><div class="ttdeci">std::istream &amp; operator&gt;&gt;(std::istream &amp;is, Color &amp;c)</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/point3_8h.html b/dev/MinGfx/docs/html/point3_8h.html
new file mode 100644
index 0000000..07f7dc7
--- /dev/null
+++ b/dev/MinGfx/docs/html/point3_8h.html
@@ -0,0 +1,145 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/point3.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">point3.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;iostream&gt;</code><br />
+<code>#include &lt;vector&gt;</code><br />
+</div>
+<p><a href="point3_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_point3.html">mingfx::Point3</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graphics operations. <a href="classmingfx_1_1_point3.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a432350d21fbc10d5e65eeeb6859511ea"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="point3_8h.html#a432350d21fbc10d5e65eeeb6859511ea">MINGFX_MATH_EPSILON</a>&#160;&#160;&#160;1e-8</td></tr>
+<tr class="memdesc:a432350d21fbc10d5e65eeeb6859511ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Epsilon value used for == and != comparisons within MinGfx. <a href="point3_8h.html#a432350d21fbc10d5e65eeeb6859511ea">More...</a><br /></td></tr>
+<tr class="separator:a432350d21fbc10d5e65eeeb6859511ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a53ce6bc4f4abdd3797d7af47adecbaf6"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a53ce6bc4f4abdd3797d7af47adecbaf6">mingfx::operator&lt;&lt;</a> (std::ostream &amp;os, const Point3 &amp;p)</td></tr>
+<tr class="separator:a53ce6bc4f4abdd3797d7af47adecbaf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad95e9b494b9761895d57e2b698b69afd"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ad95e9b494b9761895d57e2b698b69afd">mingfx::operator&gt;&gt;</a> (std::istream &amp;is, Point3 &amp;p)</td></tr>
+<tr class="separator:ad95e9b494b9761895d57e2b698b69afd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a432350d21fbc10d5e65eeeb6859511ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a432350d21fbc10d5e65eeeb6859511ea">&#9670;&nbsp;</a></span>MINGFX_MATH_EPSILON</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define MINGFX_MATH_EPSILON&#160;&#160;&#160;1e-8</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Epsilon value used for == and != comparisons within MinGfx. </p>
+
+<p class="definition">Definition at line <a class="el" href="point3_8h_source.html#l00023">23</a> of file <a class="el" href="point3_8h_source.html">point3.h</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/point3_8h_source.html b/dev/MinGfx/docs/html/point3_8h_source.html
new file mode 100644
index 0000000..8c1ad76
--- /dev/null
+++ b/dev/MinGfx/docs/html/point3_8h_source.html
@@ -0,0 +1,211 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/point3.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">point3.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="point3_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_POINT3_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_POINT3_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; </div>
+<div class="line"><a name="l00023"></a><span class="lineno"><a class="line" href="point3_8h.html#a432350d21fbc10d5e65eeeb6859511ea"> 23</a></span>&#160;<span class="preprocessor">#define MINGFX_MATH_EPSILON 1e-8</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; </div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment">// forward declaration</span></div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="keyword">class </span>Vector3;</div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; </div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; </div>
+<div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html"> 52</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_point3.html">Point3</a> {</div>
+<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="keyword">public</span>: </div>
+<div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664"> 55</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">Point3</a>();</div>
+<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
+<div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a29d113f0fa37fa04a642817c680fe953"> 59</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html#a29d113f0fa37fa04a642817c680fe953">Point3</a>(<span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5">x</a>, <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545">y</a>, <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6">z</a>);</div>
+<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; </div>
+<div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a062caf579ef643b25129cc35b3dbe756"> 62</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html#a062caf579ef643b25129cc35b3dbe756">Point3</a>(<span class="keywordtype">float</span> *p);</div>
+<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; </div>
+<div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a23534a1ce3d4466c303b9205bd21cd97"> 65</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html#a23534a1ce3d4466c303b9205bd21cd97">Point3</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; p);</div>
+<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
+<div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#aa55aef76986cc7424c2a535d6fd1ab7a"> 68</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_point3.html#aa55aef76986cc7424c2a535d6fd1ab7a">~Point3</a>();</div>
+<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; </div>
+<div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#ab22d5cc4631f26274ada550c90d39699"> 71</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_point3.html#ab22d5cc4631f26274ada550c90d39699">operator==</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; p) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; </div>
+<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#acccf9d3fca27174c18ada3b33209c71e"> 74</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_point3.html#acccf9d3fca27174c18ada3b33209c71e">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; p) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; </div>
+<div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a8e54b18bfaa39f4b7048b85c9ca43c3d"> 77</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; <a class="code" href="classmingfx_1_1_point3.html#a8e54b18bfaa39f4b7048b85c9ca43c3d">operator=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; p);</div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
+<div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a3a586db5b58d5f1fdaddb1e33e84d566"> 80</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point3.html#a3a586db5b58d5f1fdaddb1e33e84d566">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; </div>
+<div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a790468d68b6d957b22959f9078f85c3e"> 89</a></span>&#160; <span class="keywordtype">float</span>&amp; <a class="code" href="classmingfx_1_1_point3.html#a790468d68b6d957b22959f9078f85c3e">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i);</div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; </div>
+<div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5"> 93</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5">x</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> p[0]; }</div>
+<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
+<div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545"> 97</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545">y</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> p[1]; }</div>
+<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; </div>
+<div class="line"><a name="l00101"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6"> 101</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6">z</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> p[2]; }</div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
+<div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#abbf85b5749b37869f4c1b98443ebbd9e"> 104</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point3.html#abbf85b5749b37869f4c1b98443ebbd9e">w</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> 1.0; }</div>
+<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; </div>
+<div class="line"><a name="l00107"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#af0557bdc07452cf335e2b7e04fc0aa3c"> 107</a></span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> * <a class="code" href="classmingfx_1_1_point3.html#af0557bdc07452cf335e2b7e04fc0aa3c">value_ptr</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; </div>
+<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; </div>
+<div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a228a1f3754b8ee82b9bb148ce183fc5b"> 113</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_point3.html#a228a1f3754b8ee82b9bb148ce183fc5b">Lerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;b, <span class="keywordtype">float</span> alpha) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; </div>
+<div class="line"><a name="l00117"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#af554773b2d7f4492a0727e8e42efe002"> 117</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_point3.html#af554773b2d7f4492a0727e8e42efe002">DistanceToPlane</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;plane_origin, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;plane_normal);</div>
+<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; </div>
+<div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#ae31d5f91a03fabdf72b2fa54e177b743"> 121</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_point3.html#ae31d5f91a03fabdf72b2fa54e177b743">ClosestPointOnPlane</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;plane_origin, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;plane_normal);</div>
+<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; </div>
+<div class="line"><a name="l00124"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a9dd5396f53b7006ec4cb63abffd90a7c"> 124</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_point3.html#a9dd5396f53b7006ec4cb63abffd90a7c">ClosestPoint</a>(<span class="keyword">const</span> std::vector&lt;Point3&gt; &amp;point_list);</div>
+<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; </div>
+<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; </div>
+<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; </div>
+<div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#aecb7c3137356cd4470851c54a47c7930"> 129</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; <a class="code" href="classmingfx_1_1_point3.html#aecb7c3137356cd4470851c54a47c7930">Origin</a>();</div>
+<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; </div>
+<div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a9983b62979f9ac5a11efea08d9d283ed"> 132</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; <a class="code" href="classmingfx_1_1_point3.html#a9983b62979f9ac5a11efea08d9d283ed">Zero</a>();</div>
+<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; </div>
+<div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a2cfcbefe652720779e0d7beff1c86ece"> 135</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; <a class="code" href="classmingfx_1_1_point3.html#a2cfcbefe652720779e0d7beff1c86ece">One</a>();</div>
+<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; </div>
+<div class="line"><a name="l00139"></a><span class="lineno"><a class="line" href="classmingfx_1_1_point3.html#a206691c31872e537eefbf897603dba74"> 139</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_point3.html#a206691c31872e537eefbf897603dba74">Lerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;a, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;b, <span class="keywordtype">float</span> alpha);</div>
+<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; </div>
+<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; </div>
+<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; </div>
+<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keywordtype">float</span> p[3];</div>
+<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;};</div>
+<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; </div>
+<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; </div>
+<div class="line"><a name="l00148"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a53ce6bc4f4abdd3797d7af47adecbaf6"> 148</a></span>&#160;std::ostream &amp; <a class="code" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">operator&lt;&lt; </a>( std::ostream &amp;os, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;p);</div>
+<div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="namespacemingfx.html#ad95e9b494b9761895d57e2b698b69afd"> 149</a></span>&#160;std::istream &amp; <a class="code" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">operator&gt;&gt; </a>( std::istream &amp;is, <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;p);</div>
+<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; </div>
+<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; </div>
+<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;} <span class="comment">// namespace</span></div>
+<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; </div>
+<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a062caf579ef643b25129cc35b3dbe756"><div class="ttname"><a href="classmingfx_1_1_point3.html#a062caf579ef643b25129cc35b3dbe756">mingfx::Point3::Point3</a></div><div class="ttdeci">Point3(float *p)</div><div class="ttdoc">Constructs a point given a pointer to x,y,z data.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a0757315cd84f91879021d7afe18e0545"><div class="ttname"><a href="classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545">mingfx::Point3::y</a></div><div class="ttdeci">float y() const</div><div class="ttdoc">Read only access to the y coordinate. Can also use my_point[1]. Use the my_point[1] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00097">point3.h:97</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a206691c31872e537eefbf897603dba74"><div class="ttname"><a href="classmingfx_1_1_point3.html#a206691c31872e537eefbf897603dba74">mingfx::Point3::Lerp</a></div><div class="ttdeci">static Point3 Lerp(const Point3 &amp;a, const Point3 &amp;b, float alpha)</div><div class="ttdoc">Linear interpolation between two points. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b',...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a228a1f3754b8ee82b9bb148ce183fc5b"><div class="ttname"><a href="classmingfx_1_1_point3.html#a228a1f3754b8ee82b9bb148ce183fc5b">mingfx::Point3::Lerp</a></div><div class="ttdeci">Point3 Lerp(const Point3 &amp;b, float alpha) const</div><div class="ttdoc">Linear interpolation between this point and another. Alpha=0.0 returns this point,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a23534a1ce3d4466c303b9205bd21cd97"><div class="ttname"><a href="classmingfx_1_1_point3.html#a23534a1ce3d4466c303b9205bd21cd97">mingfx::Point3::Point3</a></div><div class="ttdeci">Point3(const Point3 &amp;p)</div><div class="ttdoc">Copy constructor for point.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a29d113f0fa37fa04a642817c680fe953"><div class="ttname"><a href="classmingfx_1_1_point3.html#a29d113f0fa37fa04a642817c680fe953">mingfx::Point3::Point3</a></div><div class="ttdeci">Point3(float x, float y, float z)</div><div class="ttdoc">Constructs a point given (x,y,z,1), where the 1 comes from the use of homogeneous coordinates in comp...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a2cfcbefe652720779e0d7beff1c86ece"><div class="ttname"><a href="classmingfx_1_1_point3.html#a2cfcbefe652720779e0d7beff1c86ece">mingfx::Point3::One</a></div><div class="ttdeci">static const Point3 &amp; One()</div><div class="ttdoc">(1,1,1) - a shortcut for a special point that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a3a586db5b58d5f1fdaddb1e33e84d566"><div class="ttname"><a href="classmingfx_1_1_point3.html#a3a586db5b58d5f1fdaddb1e33e84d566">mingfx::Point3::operator[]</a></div><div class="ttdeci">float operator[](const int i) const</div><div class="ttdoc">Read only access to the ith coordinate of the point.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a790468d68b6d957b22959f9078f85c3e"><div class="ttname"><a href="classmingfx_1_1_point3.html#a790468d68b6d957b22959f9078f85c3e">mingfx::Point3::operator[]</a></div><div class="ttdeci">float &amp; operator[](const int i)</div><div class="ttdoc">Returns a reference to the ith coordinate of the point. Use this accessor if you wish to set the coor...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a8e54b18bfaa39f4b7048b85c9ca43c3d"><div class="ttname"><a href="classmingfx_1_1_point3.html#a8e54b18bfaa39f4b7048b85c9ca43c3d">mingfx::Point3::operator=</a></div><div class="ttdeci">Point3 &amp; operator=(const Point3 &amp;p)</div><div class="ttdoc">Assignment operator.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a9983b62979f9ac5a11efea08d9d283ed"><div class="ttname"><a href="classmingfx_1_1_point3.html#a9983b62979f9ac5a11efea08d9d283ed">mingfx::Point3::Zero</a></div><div class="ttdeci">static const Point3 &amp; Zero()</div><div class="ttdoc">(0,0,0) - a shortcut for a special point that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_a9dd5396f53b7006ec4cb63abffd90a7c"><div class="ttname"><a href="classmingfx_1_1_point3.html#a9dd5396f53b7006ec4cb63abffd90a7c">mingfx::Point3::ClosestPoint</a></div><div class="ttdeci">Point3 ClosestPoint(const std::vector&lt; Point3 &gt; &amp;point_list)</div><div class="ttdoc">Given a list of points, returns the closest in the last to the current point.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_aa55aef76986cc7424c2a535d6fd1ab7a"><div class="ttname"><a href="classmingfx_1_1_point3.html#aa55aef76986cc7424c2a535d6fd1ab7a">mingfx::Point3::~Point3</a></div><div class="ttdeci">virtual ~Point3()</div><div class="ttdoc">Point destructor.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_ab22d5cc4631f26274ada550c90d39699"><div class="ttname"><a href="classmingfx_1_1_point3.html#ab22d5cc4631f26274ada550c90d39699">mingfx::Point3::operator==</a></div><div class="ttdeci">bool operator==(const Point3 &amp;p) const</div><div class="ttdoc">Check for &quot;equality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_abbf85b5749b37869f4c1b98443ebbd9e"><div class="ttname"><a href="classmingfx_1_1_point3.html#abbf85b5749b37869f4c1b98443ebbd9e">mingfx::Point3::w</a></div><div class="ttdeci">float w() const</div><div class="ttdoc">In homogeneous coordinates, the w coordinate for all points is 1.0.</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00104">point3.h:104</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_ac409e3213620b80c868245c1f6a6eea5"><div class="ttname"><a href="classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5">mingfx::Point3::x</a></div><div class="ttdeci">float x() const</div><div class="ttdoc">Read only access to the x coordinate. Can also use my_point[0]. Use the my_point[0] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00093">point3.h:93</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_ac463e3a3ec3edd02c86505ea6400d8e6"><div class="ttname"><a href="classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6">mingfx::Point3::z</a></div><div class="ttdeci">float z() const</div><div class="ttdoc">Read only access to the z coordinate. Can also use my_point[2]. Use the my_point[2] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00101">point3.h:101</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_acccf9d3fca27174c18ada3b33209c71e"><div class="ttname"><a href="classmingfx_1_1_point3.html#acccf9d3fca27174c18ada3b33209c71e">mingfx::Point3::operator!=</a></div><div class="ttdeci">bool operator!=(const Point3 &amp;p) const</div><div class="ttdoc">Check for &quot;inequality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_ae31d5f91a03fabdf72b2fa54e177b743"><div class="ttname"><a href="classmingfx_1_1_point3.html#ae31d5f91a03fabdf72b2fa54e177b743">mingfx::Point3::ClosestPointOnPlane</a></div><div class="ttdeci">Point3 ClosestPointOnPlane(const Point3 &amp;plane_origin, const Vector3 &amp;plane_normal)</div><div class="ttdoc">Returns the perpendicular projection of this point onto a plane defined by a point and a normal.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_ae8ab322852c24c6e03bed03cac443664"><div class="ttname"><a href="classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664">mingfx::Point3::Point3</a></div><div class="ttdeci">Point3()</div><div class="ttdoc">Default point at the origin.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_aecb7c3137356cd4470851c54a47c7930"><div class="ttname"><a href="classmingfx_1_1_point3.html#aecb7c3137356cd4470851c54a47c7930">mingfx::Point3::Origin</a></div><div class="ttdeci">static const Point3 &amp; Origin()</div><div class="ttdoc">(0,0,0) - a shortcut for a special point that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_af0557bdc07452cf335e2b7e04fc0aa3c"><div class="ttname"><a href="classmingfx_1_1_point3.html#af0557bdc07452cf335e2b7e04fc0aa3c">mingfx::Point3::value_ptr</a></div><div class="ttdeci">const float * value_ptr() const</div><div class="ttdoc">Returns a const pointer to the raw data array.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html_af554773b2d7f4492a0727e8e42efe002"><div class="ttname"><a href="classmingfx_1_1_point3.html#af554773b2d7f4492a0727e8e42efe002">mingfx::Point3::DistanceToPlane</a></div><div class="ttdeci">float DistanceToPlane(const Point3 &amp;plane_origin, const Vector3 &amp;plane_normal)</div><div class="ttdoc">Returns the shortest (i.e., perpendicular) distance from this point to a plane defined by a point and...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="anamespacemingfx_html_a6bc967741341f4f318a505d884192906"><div class="ttname"><a href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">mingfx::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a6eb31e6e81c6e29144799be4c9db404d"><div class="ttname"><a href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">mingfx::operator&gt;&gt;</a></div><div class="ttdeci">std::istream &amp; operator&gt;&gt;(std::istream &amp;is, Color &amp;c)</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/quaternion_8h.html b/dev/MinGfx/docs/html/quaternion_8h.html
new file mode 100644
index 0000000..eb5fc9f
--- /dev/null
+++ b/dev/MinGfx/docs/html/quaternion_8h.html
@@ -0,0 +1,133 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/quaternion.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">quaternion.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;iostream&gt;</code><br />
+<code>#include &quot;<a class="el" href="vector3_8h_source.html">vector3.h</a>&quot;</code><br />
+</div>
+<p><a href="quaternion_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A quaternion to represent rotations in 3D space. <a href="classmingfx_1_1_quaternion.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0a456bccfb238b9644cf21669cf35b8c"><td class="memItemLeft" align="right" valign="top">Quaternion&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a0a456bccfb238b9644cf21669cf35b8c">mingfx::operator*</a> (const Quaternion &amp;q1, const Quaternion &amp;q2)</td></tr>
+<tr class="separator:a0a456bccfb238b9644cf21669cf35b8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a444ae88d836b913ac8307fbf4357f7ed"><td class="memItemLeft" align="right" valign="top">Quaternion&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed">mingfx::operator/</a> (const Quaternion &amp;q, const float s)</td></tr>
+<tr class="separator:a444ae88d836b913ac8307fbf4357f7ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55f694123e83d1649c112e806359d4b6"><td class="memItemLeft" align="right" valign="top">Quaternion&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a55f694123e83d1649c112e806359d4b6">mingfx::operator*</a> (const float s, const Quaternion &amp;q)</td></tr>
+<tr class="separator:a55f694123e83d1649c112e806359d4b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adb96b0188d1ceda03ed8d297817502c9"><td class="memItemLeft" align="right" valign="top">Quaternion&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#adb96b0188d1ceda03ed8d297817502c9">mingfx::operator*</a> (const Quaternion &amp;q, const float s)</td></tr>
+<tr class="separator:adb96b0188d1ceda03ed8d297817502c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f5a225a54f07164d5172a3721a3aee6"><td class="memItemLeft" align="right" valign="top">Quaternion&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">mingfx::operator-</a> (const Quaternion &amp;q)</td></tr>
+<tr class="separator:a2f5a225a54f07164d5172a3721a3aee6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad49375487853a642b3f372c95cff1a96"><td class="memItemLeft" align="right" valign="top">Quaternion&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ad49375487853a642b3f372c95cff1a96">mingfx::operator+</a> (const Quaternion &amp;q1, const Quaternion &amp;q2)</td></tr>
+<tr class="separator:ad49375487853a642b3f372c95cff1a96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61f2d974c78e8884bb64c2759e455101"><td class="memItemLeft" align="right" valign="top">Quaternion&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a61f2d974c78e8884bb64c2759e455101">mingfx::operator-</a> (const Quaternion &amp;q1, const Quaternion &amp;q2)</td></tr>
+<tr class="separator:a61f2d974c78e8884bb64c2759e455101"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac4b78a682ff8d1ec298e0df7f742658d"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ac4b78a682ff8d1ec298e0df7f742658d">mingfx::operator&lt;&lt;</a> (std::ostream &amp;os, const Quaternion &amp;q)</td></tr>
+<tr class="separator:ac4b78a682ff8d1ec298e0df7f742658d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59fb7a99df5c572849e31065884b2235"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a59fb7a99df5c572849e31065884b2235">mingfx::operator&gt;&gt;</a> (std::istream &amp;is, Quaternion &amp;q)</td></tr>
+<tr class="separator:a59fb7a99df5c572849e31065884b2235"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/quaternion_8h_source.html b/dev/MinGfx/docs/html/quaternion_8h_source.html
new file mode 100644
index 0000000..78bd632
--- /dev/null
+++ b/dev/MinGfx/docs/html/quaternion_8h_source.html
@@ -0,0 +1,222 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/quaternion.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">quaternion.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="quaternion_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_QUATERNION_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_QUATERNION_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; </div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector3_8h.html">vector3.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
+<div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html"> 41</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> {</div>
+<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165"> 44</a></span>&#160; <a class="code" href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165">Quaternion</a>();</div>
+<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; </div>
+<div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a5c6cbe4fc70e8e4ec23142d0a5a2ba97"> 47</a></span>&#160; <a class="code" href="classmingfx_1_1_quaternion.html#a5c6cbe4fc70e8e4ec23142d0a5a2ba97">Quaternion</a>(<span class="keywordtype">float</span> qx, <span class="keywordtype">float</span> qy, <span class="keywordtype">float</span> qz, <span class="keywordtype">float</span> qw);</div>
+<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; </div>
+<div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a07bb09eb7d0b368ef5e8d9da02fbdad6"> 51</a></span>&#160; <a class="code" href="classmingfx_1_1_quaternion.html#a07bb09eb7d0b368ef5e8d9da02fbdad6">Quaternion</a>(<span class="keywordtype">float</span> *ptr);</div>
+<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; </div>
+<div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a0be885a1b3f2d54675c6866ec3578243"> 54</a></span>&#160; <a class="code" href="classmingfx_1_1_quaternion.html#a0be885a1b3f2d54675c6866ec3578243">Quaternion</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; other);</div>
+<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; </div>
+<div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a1f9ddd82678ccf51a462e4e03a02c7cc"> 56</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_quaternion.html#a1f9ddd82678ccf51a462e4e03a02c7cc">~Quaternion</a>();</div>
+<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; </div>
+<div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#aa89165641485cf9337cd6279df40a403"> 59</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_quaternion.html#aa89165641485cf9337cd6279df40a403">operator==</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; </div>
+<div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#ad72c021d2d1fa543c96ac4a8b360dd2e"> 62</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_quaternion.html#ad72c021d2d1fa543c96ac4a8b360dd2e">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; </div>
+<div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#ac5f82b7ed1d620c3c15f57aca028fcdd"> 65</a></span>&#160; <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; <a class="code" href="classmingfx_1_1_quaternion.html#ac5f82b7ed1d620c3c15f57aca028fcdd">operator=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q);</div>
+<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
+<div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a548d09ecd25788241d734240c0dd7ea8"> 68</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_quaternion.html#a548d09ecd25788241d734240c0dd7ea8">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; </div>
+<div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a40e6587cc0511572297c5507634db7e1"> 71</a></span>&#160; <span class="keywordtype">float</span>&amp; <a class="code" href="classmingfx_1_1_quaternion.html#a40e6587cc0511572297c5507634db7e1">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i);</div>
+<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; </div>
+<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a85464500e1d3c8ba10f1968426dc24ae"> 74</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_quaternion.html#a85464500e1d3c8ba10f1968426dc24ae">x</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> q[0]; }</div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; </div>
+<div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#adb294449db2a80bd11426148592d9e0b"> 77</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_quaternion.html#adb294449db2a80bd11426148592d9e0b">y</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> q[1]; }</div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
+<div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a75ec001cbbf08cf5c4e1f8978082a55f"> 80</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_quaternion.html#a75ec001cbbf08cf5c4e1f8978082a55f">z</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> q[2]; }</div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; </div>
+<div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a8aa53f71892f02c981d98d100a8b57c7"> 83</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_quaternion.html#a8aa53f71892f02c981d98d100a8b57c7">w</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> q[3]; }</div>
+<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; </div>
+<div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#abca597e756f257dc33838734ae19baf9"> 86</a></span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> * <a class="code" href="classmingfx_1_1_quaternion.html#abca597e756f257dc33838734ae19baf9">value_ptr</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; </div>
+<div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a90a9b715d06c75ba60eb1164dc6e9c6f"> 89</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_quaternion.html#a90a9b715d06c75ba60eb1164dc6e9c6f">Dot</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; </div>
+<div class="line"><a name="l00092"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#af6527ae19f31be2b265b8b8c4b34b77a"> 92</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_quaternion.html#af6527ae19f31be2b265b8b8c4b34b77a">Length</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; </div>
+<div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a05def5c8eb729037b3d9522711a5c2a2"> 95</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quaternion.html#a05def5c8eb729037b3d9522711a5c2a2">Normalize</a>();</div>
+<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; </div>
+<div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a3572b35419c51332204adb5bf35f0b03"> 99</a></span>&#160; <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="classmingfx_1_1_quaternion.html#a3572b35419c51332204adb5bf35f0b03">ToUnit</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; </div>
+<div class="line"><a name="l00102"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#ab0e3e20f78e537de0187def78d808584"> 102</a></span>&#160; <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="classmingfx_1_1_quaternion.html#ab0e3e20f78e537de0187def78d808584">Conjugate</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; </div>
+<div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a033f05ed7e7215a5c3c4cd26548c8007"> 105</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_quaternion.html#a033f05ed7e7215a5c3c4cd26548c8007">ToEulerAnglesZYX</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; </div>
+<div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a0290914928a2618f7faaa40989113d22"> 109</a></span>&#160; <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="classmingfx_1_1_quaternion.html#a0290914928a2618f7faaa40989113d22">Slerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;other, <span class="keywordtype">float</span> alpha) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; </div>
+<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="comment">// the specified axis.</span></div>
+<div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a5bacec2f9a3cbbcf24572f9c8eeb480c"> 113</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="classmingfx_1_1_quaternion.html#a5bacec2f9a3cbbcf24572f9c8eeb480c">FromAxisAngle</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;axis, <span class="keywordtype">float</span> angle);</div>
+<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; </div>
+<div class="line"><a name="l00116"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18"> 116</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18">FromEulerAnglesZYX</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;angles);</div>
+<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; </div>
+<div class="line"><a name="l00120"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quaternion.html#a31d37561099fab3d75a74455c5f43133"> 120</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="classmingfx_1_1_quaternion.html#a31d37561099fab3d75a74455c5f43133">Slerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;a, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;b, <span class="keywordtype">float</span> alpha);</div>
+<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; </div>
+<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="keywordtype">float</span> q[4];</div>
+<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;};</div>
+<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; </div>
+<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; </div>
+<div class="line"><a name="l00127"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a0a456bccfb238b9644cf21669cf35b8c"> 127</a></span>&#160;<a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q2);</div>
+<div class="line"><a name="l00128"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed"> 128</a></span>&#160;<a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed">operator/</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q, <span class="keyword">const</span> <span class="keywordtype">float</span> s);</div>
+<div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a55f694123e83d1649c112e806359d4b6"> 129</a></span>&#160;<a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <span class="keywordtype">float</span> s, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q);</div>
+<div class="line"><a name="l00130"></a><span class="lineno"><a class="line" href="namespacemingfx.html#adb96b0188d1ceda03ed8d297817502c9"> 130</a></span>&#160;<a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q, <span class="keyword">const</span> <span class="keywordtype">float</span> s);</div>
+<div class="line"><a name="l00131"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6"> 131</a></span>&#160;<a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">operator-</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q);</div>
+<div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="namespacemingfx.html#ad49375487853a642b3f372c95cff1a96"> 132</a></span>&#160;<a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">operator+</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q2);</div>
+<div class="line"><a name="l00133"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a61f2d974c78e8884bb64c2759e455101"> 133</a></span>&#160;<a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> <a class="code" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">operator-</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a>&amp; q2);</div>
+<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; </div>
+<div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="namespacemingfx.html#ac4b78a682ff8d1ec298e0df7f742658d"> 135</a></span>&#160;std::ostream &amp; <a class="code" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">operator&lt;&lt; </a>( std::ostream &amp;os, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q);</div>
+<div class="line"><a name="l00136"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a59fb7a99df5c572849e31065884b2235"> 136</a></span>&#160;std::istream &amp; <a class="code" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">operator&gt;&gt; </a>( std::istream &amp;is, <a class="code" href="classmingfx_1_1_quaternion.html">Quaternion</a> &amp;q);</div>
+<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; </div>
+<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; </div>
+<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; </div>
+<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; </div>
+<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html"><div class="ttname"><a href="classmingfx_1_1_quaternion.html">mingfx::Quaternion</a></div><div class="ttdoc">A quaternion to represent rotations in 3D space.</div><div class="ttdef"><b>Definition:</b> <a href="quaternion_8h_source.html#l00041">quaternion.h:41</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a0290914928a2618f7faaa40989113d22"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a0290914928a2618f7faaa40989113d22">mingfx::Quaternion::Slerp</a></div><div class="ttdeci">Quaternion Slerp(const Quaternion &amp;other, float alpha) const</div><div class="ttdoc">Uses spherical interpolation to interpoloate between the rotation stored in this quaternion and the r...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a033f05ed7e7215a5c3c4cd26548c8007"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a033f05ed7e7215a5c3c4cd26548c8007">mingfx::Quaternion::ToEulerAnglesZYX</a></div><div class="ttdeci">Vector3 ToEulerAnglesZYX() const</div><div class="ttdoc">Converts the rotation specified by the quaternion into Euler angles.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a05def5c8eb729037b3d9522711a5c2a2"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a05def5c8eb729037b3d9522711a5c2a2">mingfx::Quaternion::Normalize</a></div><div class="ttdeci">void Normalize()</div><div class="ttdoc">Normalizes the quat by making it unit length.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a07bb09eb7d0b368ef5e8d9da02fbdad6"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a07bb09eb7d0b368ef5e8d9da02fbdad6">mingfx::Quaternion::Quaternion</a></div><div class="ttdeci">Quaternion(float *ptr)</div><div class="ttdoc">Creates a quate from a pointer to 4 floating point numbers in the order qx, qy, qz,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a0be885a1b3f2d54675c6866ec3578243"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a0be885a1b3f2d54675c6866ec3578243">mingfx::Quaternion::Quaternion</a></div><div class="ttdeci">Quaternion(const Quaternion &amp;other)</div><div class="ttdoc">Copy constructor.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a1f9ddd82678ccf51a462e4e03a02c7cc"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a1f9ddd82678ccf51a462e4e03a02c7cc">mingfx::Quaternion::~Quaternion</a></div><div class="ttdeci">virtual ~Quaternion()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a31d37561099fab3d75a74455c5f43133"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a31d37561099fab3d75a74455c5f43133">mingfx::Quaternion::Slerp</a></div><div class="ttdeci">static Quaternion Slerp(const Quaternion &amp;a, const Quaternion &amp;b, float alpha)</div><div class="ttdoc">Uses spherical interpolation to interpoloate between the rotations specified by two quaternions.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a3572b35419c51332204adb5bf35f0b03"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a3572b35419c51332204adb5bf35f0b03">mingfx::Quaternion::ToUnit</a></div><div class="ttdeci">Quaternion ToUnit() const</div><div class="ttdoc">Returns a normalized (i.e., unit length) version of the quaternion without modifying the original.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a40e6587cc0511572297c5507634db7e1"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a40e6587cc0511572297c5507634db7e1">mingfx::Quaternion::operator[]</a></div><div class="ttdeci">float &amp; operator[](const int i)</div><div class="ttdoc">Writable access the ith coordinate of the quaternion (qx, qy, qz, qw).</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a548d09ecd25788241d734240c0dd7ea8"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a548d09ecd25788241d734240c0dd7ea8">mingfx::Quaternion::operator[]</a></div><div class="ttdeci">float operator[](const int i) const</div><div class="ttdoc">Read only access to the ith coordinate of the quaternion (qx, qy, qz, qw).</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a5bacec2f9a3cbbcf24572f9c8eeb480c"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a5bacec2f9a3cbbcf24572f9c8eeb480c">mingfx::Quaternion::FromAxisAngle</a></div><div class="ttdeci">static Quaternion FromAxisAngle(const Vector3 &amp;axis, float angle)</div><div class="ttdoc">Creates a new quaternion that describes a rotation by angle radians about.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a5c6cbe4fc70e8e4ec23142d0a5a2ba97"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a5c6cbe4fc70e8e4ec23142d0a5a2ba97">mingfx::Quaternion::Quaternion</a></div><div class="ttdeci">Quaternion(float qx, float qy, float qz, float qw)</div><div class="ttdoc">Creates a quat from the 4 parameters.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a75ec001cbbf08cf5c4e1f8978082a55f"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a75ec001cbbf08cf5c4e1f8978082a55f">mingfx::Quaternion::z</a></div><div class="ttdeci">float z() const</div><div class="ttdoc">Read only access to the z coordinate of the imaginary part of the quaternion.</div><div class="ttdef"><b>Definition:</b> <a href="quaternion_8h_source.html#l00080">quaternion.h:80</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a85464500e1d3c8ba10f1968426dc24ae"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a85464500e1d3c8ba10f1968426dc24ae">mingfx::Quaternion::x</a></div><div class="ttdeci">float x() const</div><div class="ttdoc">Read only access to the x coordinate of the imaginary part of the quaternion.</div><div class="ttdef"><b>Definition:</b> <a href="quaternion_8h_source.html#l00074">quaternion.h:74</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a8aa53f71892f02c981d98d100a8b57c7"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a8aa53f71892f02c981d98d100a8b57c7">mingfx::Quaternion::w</a></div><div class="ttdeci">float w() const</div><div class="ttdoc">Read only access to the w, real part, of the quaternion.</div><div class="ttdef"><b>Definition:</b> <a href="quaternion_8h_source.html#l00083">quaternion.h:83</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a90a9b715d06c75ba60eb1164dc6e9c6f"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a90a9b715d06c75ba60eb1164dc6e9c6f">mingfx::Quaternion::Dot</a></div><div class="ttdeci">float Dot(const Quaternion &amp;q) const</div><div class="ttdoc">Returns the dot product of this quaternion with another.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_a9548599ea5c527f9f67d2ea6710e3d18"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18">mingfx::Quaternion::FromEulerAnglesZYX</a></div><div class="ttdeci">static Quaternion FromEulerAnglesZYX(const Vector3 &amp;angles)</div><div class="ttdoc">Creates a new quaternion from a rotation defined in Euler angles.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_aa89165641485cf9337cd6279df40a403"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#aa89165641485cf9337cd6279df40a403">mingfx::Quaternion::operator==</a></div><div class="ttdeci">bool operator==(const Quaternion &amp;q) const</div><div class="ttdoc">Check for &quot;equality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_ab0e3e20f78e537de0187def78d808584"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#ab0e3e20f78e537de0187def78d808584">mingfx::Quaternion::Conjugate</a></div><div class="ttdeci">Quaternion Conjugate() const</div><div class="ttdoc">Returns the conjugate of the quaternion.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_abca597e756f257dc33838734ae19baf9"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#abca597e756f257dc33838734ae19baf9">mingfx::Quaternion::value_ptr</a></div><div class="ttdeci">const float * value_ptr() const</div><div class="ttdoc">Returns a const pointer to the raw data array, stored in the order qx, qy, qz, qw.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_ac5f82b7ed1d620c3c15f57aca028fcdd"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#ac5f82b7ed1d620c3c15f57aca028fcdd">mingfx::Quaternion::operator=</a></div><div class="ttdeci">Quaternion &amp; operator=(const Quaternion &amp;q)</div><div class="ttdoc">Assignment operator.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_ad58ac80804ec63af354912a71361f165"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165">mingfx::Quaternion::Quaternion</a></div><div class="ttdeci">Quaternion()</div><div class="ttdoc">Creates a quat with the identity rotation.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_ad72c021d2d1fa543c96ac4a8b360dd2e"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#ad72c021d2d1fa543c96ac4a8b360dd2e">mingfx::Quaternion::operator!=</a></div><div class="ttdeci">bool operator!=(const Quaternion &amp;q) const</div><div class="ttdoc">Check for &quot;inequality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_adb294449db2a80bd11426148592d9e0b"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#adb294449db2a80bd11426148592d9e0b">mingfx::Quaternion::y</a></div><div class="ttdeci">float y() const</div><div class="ttdoc">Read only access to the y coordinate of the imaginary part of the quaternion.</div><div class="ttdef"><b>Definition:</b> <a href="quaternion_8h_source.html#l00077">quaternion.h:77</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_quaternion_html_af6527ae19f31be2b265b8b8c4b34b77a"><div class="ttname"><a href="classmingfx_1_1_quaternion.html#af6527ae19f31be2b265b8b8c4b34b77a">mingfx::Quaternion::Length</a></div><div class="ttdeci">float Length() const</div><div class="ttdoc">Returns the length of the quaternion.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="anamespacemingfx_html_a2f5a225a54f07164d5172a3721a3aee6"><div class="ttname"><a href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">mingfx::operator-</a></div><div class="ttdeci">Quaternion operator-(const Quaternion &amp;q)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a3c3b45ed6edf3fe76f98a7fd165dca03"><div class="ttname"><a href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">mingfx::operator+</a></div><div class="ttdeci">AABB operator+(const AABB &amp;A, const AABB &amp;B)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a444ae88d836b913ac8307fbf4357f7ed"><div class="ttname"><a href="namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed">mingfx::operator/</a></div><div class="ttdeci">Quaternion operator/(const Quaternion &amp;q, const float s)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a6bc967741341f4f318a505d884192906"><div class="ttname"><a href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">mingfx::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a6eb31e6e81c6e29144799be4c9db404d"><div class="ttname"><a href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">mingfx::operator&gt;&gt;</a></div><div class="ttdeci">std::istream &amp; operator&gt;&gt;(std::istream &amp;is, Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_ae5708e414f585dde2a5418ddae259a57"><div class="ttname"><a href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">mingfx::operator*</a></div><div class="ttdeci">Matrix4 operator*(const Matrix4 &amp;m, const float &amp;s)</div><div class="ttdoc">Multiply matrix and scalar, returns the new matrix.</div></div>
+<div class="ttc" id="avector3_8h_html"><div class="ttname"><a href="vector3_8h.html">vector3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/quick__shapes_8h.html b/dev/MinGfx/docs/html/quick__shapes_8h.html
new file mode 100644
index 0000000..b6e0870
--- /dev/null
+++ b/dev/MinGfx/docs/html/quick__shapes_8h.html
@@ -0,0 +1,118 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/quick_shapes.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">quick_shapes.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="color_8h_source.html">color.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="default__shader_8h_source.html">default_shader.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mesh_8h_source.html">mesh.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="shader__program_8h_source.html">shader_program.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="texture2d_8h_source.html">texture2d.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector3_8h_source.html">vector3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="matrix4_8h_source.html">matrix4.h</a>&quot;</code><br />
+<code>#include &lt;vector&gt;</code><br />
+</div>
+<p><a href="quick__shapes_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This class provides a quick way to draw shapes for use in debugging or simple scenes. <a href="classmingfx_1_1_quick_shapes.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/quick__shapes_8h_source.html b/dev/MinGfx/docs/html/quick__shapes_8h_source.html
new file mode 100644
index 0000000..1a82221
--- /dev/null
+++ b/dev/MinGfx/docs/html/quick__shapes_8h_source.html
@@ -0,0 +1,283 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/quick_shapes.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">quick_shapes.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="quick__shapes_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2017, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_QUICK_SHAPES_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_QUICK_SHAPES_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="color_8h.html">color.h</a>&quot;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="default__shader_8h.html">default_shader.h</a>&quot;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="mesh_8h.html">mesh.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="shader__program_8h.html">shader_program.h</a>&quot;</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="texture2d_8h.html">texture2d.h</a>&quot;</span></div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector3_8h.html">vector3.h</a>&quot;</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="matrix4_8h.html">matrix4.h</a>&quot;</span></div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; </div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; </div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; </div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; </div>
+<div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html"> 69</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_quick_shapes.html">QuickShapes</a> {</div>
+<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; </div>
+<div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#a5764a0953013ece013bf3e2a72e4afa2"> 72</a></span>&#160; <a class="code" href="classmingfx_1_1_quick_shapes.html#a5764a0953013ece013bf3e2a72e4afa2">QuickShapes</a>();</div>
+<div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#a3a75dde188ec076ea46a6319ed1ca046"> 73</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#a3a75dde188ec076ea46a6319ed1ca046">~QuickShapes</a>();</div>
+<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; </div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; </div>
+<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="comment">// -------- 3D PRIMITIVES --------</span></div>
+<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; </div>
+<div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#adad98f87a40650ff7c605a94b6d937af"> 81</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#adad98f87a40650ff7c605a94b6d937af">DrawCube</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix,</div>
+<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix,</div>
+<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix,</div>
+<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color);</div>
+<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; </div>
+<div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#a69c442154f800c6bb3f6ffa8395e2844"> 90</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#a69c442154f800c6bb3f6ffa8395e2844">DrawCylinder</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix,</div>
+<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix,</div>
+<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix,</div>
+<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color);</div>
+<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
+<div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#a1880f6dd3e794cd9f6e5d9138f93a424"> 99</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#a1880f6dd3e794cd9f6e5d9138f93a424">DrawCone</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix,</div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix,</div>
+<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix,</div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color);</div>
+<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; </div>
+<div class="line"><a name="l00107"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#aa5f4f64e3708630a6d58f6b4ca7d2744"> 107</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#aa5f4f64e3708630a6d58f6b4ca7d2744">DrawSphere</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix,</div>
+<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix,</div>
+<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix,</div>
+<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color);</div>
+<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; </div>
+<div class="line"><a name="l00116"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#ab24811cfd980b3f2ec4ebccf6c0e8b30"> 116</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#ab24811cfd980b3f2ec4ebccf6c0e8b30">DrawBrush</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix,</div>
+<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix,</div>
+<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix,</div>
+<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color);</div>
+<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; </div>
+<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; </div>
+<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="comment">// -------- 3D COMPOSITE SHAPES --------</span></div>
+<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; </div>
+<div class="line"><a name="l00126"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#a0feae19a04d9f315a39e2bdbf659bd7e"> 126</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#a0feae19a04d9f315a39e2bdbf659bd7e">DrawLineSegment</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix,</div>
+<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix,</div>
+<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix,</div>
+<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color,</div>
+<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;p1,</div>
+<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;p2,</div>
+<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keywordtype">float</span> radius);</div>
+<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; </div>
+<div class="line"><a name="l00134"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603"> 134</a></span>&#160; <span class="keyword">enum class</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603">LinesType</a> {</div>
+<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <a class="code" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603ae585142391f356c60bcfe68279ec2727">LINES</a>,</div>
+<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <a class="code" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603ae64a4d2159ed46d077e21a505575c814">LINE_STRIP</a>,</div>
+<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <a class="code" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603a8e0df0247f66bd2cac06f16abb562134">LINE_LOOP</a></div>
+<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; };</div>
+<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; </div>
+<div class="line"><a name="l00156"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#af59ae8d8c5bd0447f3bb7f56112400bf"> 156</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#af59ae8d8c5bd0447f3bb7f56112400bf">DrawLines</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix,</div>
+<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix,</div>
+<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix,</div>
+<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color,</div>
+<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keyword">const</span> std::vector&lt;Point3&gt; &amp;points,</div>
+<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <a class="code" href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603">LinesType</a> linesType,</div>
+<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keywordtype">float</span> radius);</div>
+<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; </div>
+<div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#aebe27814a826558ac0475fef3d4481eb"> 168</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#aebe27814a826558ac0475fef3d4481eb">DrawArrow</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix,</div>
+<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix,</div>
+<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix,</div>
+<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color,</div>
+<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> p, <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> dir, <span class="keywordtype">float</span> radius);</div>
+<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; </div>
+<div class="line"><a name="l00178"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#a637876fdc13e84282922350b53dab5f8"> 178</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#a637876fdc13e84282922350b53dab5f8">DrawAxes</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix,</div>
+<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix,</div>
+<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix);</div>
+<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; </div>
+<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; </div>
+<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="comment">// -------- 2D PRIMITIVES --------</span></div>
+<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; </div>
+<div class="line"><a name="l00189"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#a4350ea23b8b9e0e8119310423d641ab3"> 189</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#a4350ea23b8b9e0e8119310423d641ab3">DrawSquare</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix,</div>
+<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color);</div>
+<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; </div>
+<div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#a7187f72fa8e12b38dcd0ce424fc85fbc"> 198</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#a7187f72fa8e12b38dcd0ce424fc85fbc">DrawSquare</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;modelMatrix, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;viewMatrix,</div>
+<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color,</div>
+<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;texture);</div>
+<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; </div>
+<div class="line"><a name="l00205"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#abec2513648c1238f36c41cf3c85dd868"> 205</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_quick_shapes.html#abec2513648c1238f36c41cf3c85dd868">DrawFullscreenTexture</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;texture);</div>
+<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; </div>
+<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; </div>
+<div class="line"><a name="l00211"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#aa7564a49dc2ff8efd93dec13186cb75b"> 211</a></span>&#160; <a class="code" href="classmingfx_1_1_default_shader.html">DefaultShader</a>* <a class="code" href="classmingfx_1_1_quick_shapes.html#aa7564a49dc2ff8efd93dec13186cb75b">default_shader</a>();</div>
+<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; </div>
+<div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="classmingfx_1_1_quick_shapes.html#ac8b702a25296cfea15eef1e185333272"> 217</a></span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html">DefaultShader::MaterialProperties</a>* <a class="code" href="classmingfx_1_1_quick_shapes.html#ac8b702a25296cfea15eef1e185333272">material</a>();</div>
+<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; </div>
+<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; </div>
+<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; </div>
+<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordtype">void</span> DrawWithFullscreen(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;color, <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> *mesh, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;tex);</div>
+<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; </div>
+<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> cubeMesh_;</div>
+<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keywordtype">void</span> initCube();</div>
+<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; </div>
+<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> squareMesh_;</div>
+<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keywordtype">void</span> initSquare();</div>
+<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; </div>
+<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> fullMesh_;</div>
+<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordtype">void</span> initFull();</div>
+<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; </div>
+<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> cylMesh_;</div>
+<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordtype">void</span> initCyl();</div>
+<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; </div>
+<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> coneMesh_;</div>
+<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordtype">void</span> initCone();</div>
+<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; </div>
+<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> sphereMesh_;</div>
+<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="keywordtype">void</span> initSph();</div>
+<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; </div>
+<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> brushMesh_;</div>
+<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordtype">void</span> initBrush();</div>
+<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; </div>
+<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <a class="code" href="classmingfx_1_1_default_shader.html">DefaultShader</a> defaultShader_;</div>
+<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; <a class="code" href="classmingfx_1_1_default_shader_1_1_material_properties.html">DefaultShader::MaterialProperties</a> defaultMaterial_;</div>
+<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <a class="code" href="classmingfx_1_1_texture2_d.html">Texture2D</a> emptyTex_;</div>
+<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; </div>
+<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <a class="code" href="classmingfx_1_1_shader_program.html">ShaderProgram</a> fullscreenShader_;</div>
+<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160;};</div>
+<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; </div>
+<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; </div>
+<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html"><div class="ttname"><a href="classmingfx_1_1_color.html">mingfx::Color</a></div><div class="ttdoc">Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with Op...</div><div class="ttdef"><b>Definition:</b> <a href="color_8h_source.html#l00041">color.h:41</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_1_1_material_properties_html"><div class="ttname"><a href="classmingfx_1_1_default_shader_1_1_material_properties.html">mingfx::DefaultShader::MaterialProperties</a></div><div class="ttdoc">Small data structure to hold properties of the material to be lit.</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00070">default_shader.h:70</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_default_shader_html"><div class="ttname"><a href="classmingfx_1_1_default_shader.html">mingfx::DefaultShader</a></div><div class="ttdoc">A simple GLSL shader for textured per-fragment Phong shading with multiple light sources.</div><div class="ttdef"><b>Definition:</b> <a href="default__shader_8h_source.html#l00062">default_shader.h:62</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html"><div class="ttname"><a href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></div><div class="ttdoc">A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...</div><div class="ttdef"><b>Definition:</b> <a href="matrix4_8h_source.html#l00050">matrix4.h:50</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html"><div class="ttname"><a href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></div><div class="ttdoc">A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.</div><div class="ttdef"><b>Definition:</b> <a href="mesh_8h_source.html#l00127">mesh.h:127</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></div><div class="ttdoc">This class provides a quick way to draw shapes for use in debugging or simple scenes.</div><div class="ttdef"><b>Definition:</b> <a href="quick__shapes_8h_source.html#l00069">quick_shapes.h:69</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_a0feae19a04d9f315a39e2bdbf659bd7e"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#a0feae19a04d9f315a39e2bdbf659bd7e">mingfx::QuickShapes::DrawLineSegment</a></div><div class="ttdeci">void DrawLineSegment(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color, const Point3 &amp;p1, const Point3 &amp;p2, float radius)</div><div class="ttdoc">Draws a cylinder between the two points.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_a1880f6dd3e794cd9f6e5d9138f93a424"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#a1880f6dd3e794cd9f6e5d9138f93a424">mingfx::QuickShapes::DrawCone</a></div><div class="ttdeci">void DrawCone(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</div><div class="ttdoc">Draws a cone with radius 1 and height y=-1 to 1 given the model, view, and projection matrices provid...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_a3a75dde188ec076ea46a6319ed1ca046"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#a3a75dde188ec076ea46a6319ed1ca046">mingfx::QuickShapes::~QuickShapes</a></div><div class="ttdeci">virtual ~QuickShapes()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_a4350ea23b8b9e0e8119310423d641ab3"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#a4350ea23b8b9e0e8119310423d641ab3">mingfx::QuickShapes::DrawSquare</a></div><div class="ttdeci">void DrawSquare(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</div><div class="ttdoc">Draws a square in the X-Y plane with extents -1 to 1 and normal in the +Y direction.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_a5764a0953013ece013bf3e2a72e4afa2"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#a5764a0953013ece013bf3e2a72e4afa2">mingfx::QuickShapes::QuickShapes</a></div><div class="ttdeci">QuickShapes()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_a637876fdc13e84282922350b53dab5f8"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#a637876fdc13e84282922350b53dab5f8">mingfx::QuickShapes::DrawAxes</a></div><div class="ttdeci">void DrawAxes(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix)</div><div class="ttdoc">Draws a right handed set of axes at the coordinate frame specified by the modelMatrix.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_a69c442154f800c6bb3f6ffa8395e2844"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#a69c442154f800c6bb3f6ffa8395e2844">mingfx::QuickShapes::DrawCylinder</a></div><div class="ttdeci">void DrawCylinder(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</div><div class="ttdoc">Draws a cylinder with radius 1 and height y=-1 to 1 given the model, view, and projection matrices pr...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_a7187f72fa8e12b38dcd0ce424fc85fbc"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#a7187f72fa8e12b38dcd0ce424fc85fbc">mingfx::QuickShapes::DrawSquare</a></div><div class="ttdeci">void DrawSquare(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color, const Texture2D &amp;texture)</div><div class="ttdoc">Draws a square, which you can deform into some other shape by adjusting the model matrix,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_aa5f4f64e3708630a6d58f6b4ca7d2744"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#aa5f4f64e3708630a6d58f6b4ca7d2744">mingfx::QuickShapes::DrawSphere</a></div><div class="ttdeci">void DrawSphere(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</div><div class="ttdoc">Draws a sphere with radius 1 given the model, view, and projection matrices provided and using the su...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_aa7564a49dc2ff8efd93dec13186cb75b"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#aa7564a49dc2ff8efd93dec13186cb75b">mingfx::QuickShapes::default_shader</a></div><div class="ttdeci">DefaultShader * default_shader()</div><div class="ttdoc">Returns a pointer to the default shader used internally by the Draw class so that you may change the ...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_aaea35a34a9495a9ab25cd9aa32a91603"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603">mingfx::QuickShapes::LinesType</a></div><div class="ttdeci">LinesType</div><div class="ttdef"><b>Definition:</b> <a href="quick__shapes_8h_source.html#l00134">quick_shapes.h:134</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_aaea35a34a9495a9ab25cd9aa32a91603a8e0df0247f66bd2cac06f16abb562134"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603a8e0df0247f66bd2cac06f16abb562134">mingfx::QuickShapes::LinesType::LINE_LOOP</a></div><div class="ttdeci">@ LINE_LOOP</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_aaea35a34a9495a9ab25cd9aa32a91603ae585142391f356c60bcfe68279ec2727"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603ae585142391f356c60bcfe68279ec2727">mingfx::QuickShapes::LinesType::LINES</a></div><div class="ttdeci">@ LINES</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_aaea35a34a9495a9ab25cd9aa32a91603ae64a4d2159ed46d077e21a505575c814"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603ae64a4d2159ed46d077e21a505575c814">mingfx::QuickShapes::LinesType::LINE_STRIP</a></div><div class="ttdeci">@ LINE_STRIP</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_ab24811cfd980b3f2ec4ebccf6c0e8b30"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#ab24811cfd980b3f2ec4ebccf6c0e8b30">mingfx::QuickShapes::DrawBrush</a></div><div class="ttdeci">void DrawBrush(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</div><div class="ttdoc">Draws the classic 3D paintbrush cursor from the 2001 Keefe et al.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_abec2513648c1238f36c41cf3c85dd868"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#abec2513648c1238f36c41cf3c85dd868">mingfx::QuickShapes::DrawFullscreenTexture</a></div><div class="ttdeci">void DrawFullscreenTexture(const Color &amp;color, const Texture2D &amp;texture)</div><div class="ttdoc">Draws a background texture across the whole screen.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_ac8b702a25296cfea15eef1e185333272"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#ac8b702a25296cfea15eef1e185333272">mingfx::QuickShapes::material</a></div><div class="ttdeci">DefaultShader::MaterialProperties * material()</div><div class="ttdoc">Returns a pointer to the default material properties for the shapes so that you may adjust the reflec...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_adad98f87a40650ff7c605a94b6d937af"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#adad98f87a40650ff7c605a94b6d937af">mingfx::QuickShapes::DrawCube</a></div><div class="ttdeci">void DrawCube(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)</div><div class="ttdoc">Draws a cube with extents -1 to 1 given the model, view, and projection matrices provided and using t...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_aebe27814a826558ac0475fef3d4481eb"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#aebe27814a826558ac0475fef3d4481eb">mingfx::QuickShapes::DrawArrow</a></div><div class="ttdeci">void DrawArrow(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color, Point3 p, Vector3 dir, float radius)</div><div class="ttdoc">Draws an arrow originating at point p and extending in the direction and length specified by dir.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html_af59ae8d8c5bd0447f3bb7f56112400bf"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html#af59ae8d8c5bd0447f3bb7f56112400bf">mingfx::QuickShapes::DrawLines</a></div><div class="ttdeci">void DrawLines(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color, const std::vector&lt; Point3 &gt; &amp;points, LinesType linesType, float radius)</div><div class="ttdoc">Draws a series of line segments.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html"><div class="ttname"><a href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></div><div class="ttdoc">A wrapper around GLSL shader programs.</div><div class="ttdef"><b>Definition:</b> <a href="shader__program_8h_source.html#l00066">shader_program.h:66</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></div><div class="ttdoc">A wrapper around a 2D texture that supports loading images from files or setting texture color data d...</div><div class="ttdef"><b>Definition:</b> <a href="texture2d_8h_source.html#l00042">texture2d.h:42</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="acolor_8h_html"><div class="ttname"><a href="color_8h.html">color.h</a></div></div>
+<div class="ttc" id="adefault__shader_8h_html"><div class="ttname"><a href="default__shader_8h.html">default_shader.h</a></div></div>
+<div class="ttc" id="amatrix4_8h_html"><div class="ttname"><a href="matrix4_8h.html">matrix4.h</a></div></div>
+<div class="ttc" id="amesh_8h_html"><div class="ttname"><a href="mesh_8h.html">mesh.h</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+<div class="ttc" id="ashader__program_8h_html"><div class="ttname"><a href="shader__program_8h.html">shader_program.h</a></div></div>
+<div class="ttc" id="atexture2d_8h_html"><div class="ttname"><a href="texture2d_8h.html">texture2d.h</a></div></div>
+<div class="ttc" id="avector3_8h_html"><div class="ttname"><a href="vector3_8h.html">vector3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/ray_8h.html b/dev/MinGfx/docs/html/ray_8h.html
new file mode 100644
index 0000000..2078015
--- /dev/null
+++ b/dev/MinGfx/docs/html/ray_8h.html
@@ -0,0 +1,122 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/ray.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">ray.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;iostream&gt;</code><br />
+<code>#include &quot;<a class="el" href="aabb_8h_source.html">aabb.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector3_8h_source.html">vector3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mesh_8h_source.html">mesh.h</a>&quot;</code><br />
+</div>
+<p><a href="ray_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_ray.html">mingfx::Ray</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stores the mathematical object of a ray that begins at an origin (a 3D point) and points in a direction (a unit 3D vector). <a href="classmingfx_1_1_ray.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad7c839e598b7be6c1b407330dfacc980"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ad7c839e598b7be6c1b407330dfacc980">mingfx::operator&lt;&lt;</a> (std::ostream &amp;os, const Ray &amp;r)</td></tr>
+<tr class="separator:ad7c839e598b7be6c1b407330dfacc980"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0412270963460363fa015b9b4785cc59"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a0412270963460363fa015b9b4785cc59">mingfx::operator&gt;&gt;</a> (std::istream &amp;is, Ray &amp;r)</td></tr>
+<tr class="separator:a0412270963460363fa015b9b4785cc59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/ray_8h_source.html b/dev/MinGfx/docs/html/ray_8h_source.html
new file mode 100644
index 0000000..cf44f40
--- /dev/null
+++ b/dev/MinGfx/docs/html/ray_8h_source.html
@@ -0,0 +1,202 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/ray.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">ray.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="ray_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_RAY_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_RAY_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; </div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="aabb_8h.html">aabb.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector3_8h.html">vector3.h</a>&quot;</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="mesh_8h.html">mesh.h</a>&quot;</span></div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; </div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; </div>
+<div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html"> 54</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_ray.html">Ray</a> {</div>
+<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
+<div class="line"><a name="l00058"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda"> 58</a></span>&#160; <a class="code" href="classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda">Ray</a>();</div>
+<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; </div>
+<div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#ab38cdd0793b3acfe55fa9ebca5ddebf6"> 61</a></span>&#160; <a class="code" href="classmingfx_1_1_ray.html#ab38cdd0793b3acfe55fa9ebca5ddebf6">Ray</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;<a class="code" href="classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe">origin</a>, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;<a class="code" href="classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe">direction</a>);</div>
+<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; </div>
+<div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#ac20909f30c07d5375598876c6d294625"> 64</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_ray.html#ac20909f30c07d5375598876c6d294625">~Ray</a>();</div>
+<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; </div>
+<div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#a87b07c4f7c9f33189efade7e519b5d9d"> 67</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_ray.html#a87b07c4f7c9f33189efade7e519b5d9d">operator==</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_ray.html">Ray</a>&amp; other) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; </div>
+<div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#ab62fa6ea1c20870f67c58401aefe3eff"> 70</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_ray.html#ab62fa6ea1c20870f67c58401aefe3eff">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_ray.html">Ray</a>&amp; other) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; </div>
+<div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#a3c926e2da6dfd1b0a435577617eae984"> 73</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_ray.html#a3c926e2da6dfd1b0a435577617eae984">Length</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; </div>
+<div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#a8707604031eb9437c449345d85d69d24"> 81</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_ray.html#a8707604031eb9437c449345d85d69d24">IntersectPlane</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;planePt, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;planeNormal,</div>
+<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordtype">float</span> *iTime, <a class="code" href="classmingfx_1_1_point3.html">Point3</a> *iPoint) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; </div>
+<div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#a1a6130616c4e4eebe9d09181b0f8b734"> 90</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_ray.html#a1a6130616c4e4eebe9d09181b0f8b734">IntersectTriangle</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;v2, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;v3,</div>
+<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordtype">float</span> *iTime, <a class="code" href="classmingfx_1_1_point3.html">Point3</a> *iPoint) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; </div>
+<div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#a37689523a0b73d3d3288ce60bdcb7ae3"> 99</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_ray.html#a37689523a0b73d3d3288ce60bdcb7ae3">IntersectQuad</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;v2, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;v3, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;v4,</div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keywordtype">float</span> *iTime, <a class="code" href="classmingfx_1_1_point3.html">Point3</a> *iPoint) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; </div>
+<div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#a970c7dbc19167be625967fabfb39b4ff"> 106</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_ray.html#a970c7dbc19167be625967fabfb39b4ff">IntersectSphere</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;center, <span class="keywordtype">float</span> radius,</div>
+<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordtype">float</span> *iTime, <a class="code" href="classmingfx_1_1_point3.html">Point3</a> *iPoint) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; </div>
+<div class="line"><a name="l00114"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#a79caa1df0839d13339575d3d5527ae6f"> 114</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_ray.html#a79caa1df0839d13339575d3d5527ae6f">IntersectMesh</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> &amp;mesh, <span class="keywordtype">float</span> *iTime,</div>
+<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> *iPoint, <span class="keywordtype">int</span> *iTriangleID) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; </div>
+<div class="line"><a name="l00126"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc"> 126</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc">FastIntersectMesh</a>(<a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> *mesh, <span class="keywordtype">float</span> *iTime,</div>
+<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> *iPoint, <span class="keywordtype">int</span> *iTriangleID) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; </div>
+<div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#a57d3ee10518ed361ae02d9cbdef842b7"> 142</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_ray.html#a57d3ee10518ed361ae02d9cbdef842b7">IntersectAABB</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_a_a_b_b.html">AABB</a> &amp;box, <span class="keywordtype">float</span> *iTime) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; </div>
+<div class="line"><a name="l00145"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe"> 145</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe">origin</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; </div>
+<div class="line"><a name="l00148"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe"> 148</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe">direction</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; </div>
+<div class="line"><a name="l00151"></a><span class="lineno"><a class="line" href="classmingfx_1_1_ray.html#a75593293307b4eead15a876bf3597071"> 151</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_ray.html#a75593293307b4eead15a876bf3597071">set</a>(<a class="code" href="classmingfx_1_1_point3.html">Point3</a> newOrigin, <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> newDir);</div>
+<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; </div>
+<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> p_;</div>
+<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> d_;</div>
+<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;};</div>
+<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; </div>
+<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; </div>
+<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;<span class="comment">// --- Stream operators ---</span></div>
+<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; </div>
+<div class="line"><a name="l00161"></a><span class="lineno"><a class="line" href="namespacemingfx.html#ad7c839e598b7be6c1b407330dfacc980"> 161</a></span>&#160;std::ostream &amp; <a class="code" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">operator&lt;&lt; </a>( std::ostream &amp;os, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_ray.html">Ray</a> &amp;r);</div>
+<div class="line"><a name="l00162"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a0412270963460363fa015b9b4785cc59"> 162</a></span>&#160;std::istream &amp; <a class="code" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">operator&gt;&gt; </a>( std::istream &amp;is, <a class="code" href="classmingfx_1_1_ray.html">Ray</a> &amp;r);</div>
+<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; </div>
+<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; </div>
+<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; </div>
+<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aaabb_8h_html"><div class="ttname"><a href="aabb_8h.html">aabb.h</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_a_a_b_b_html"><div class="ttname"><a href="classmingfx_1_1_a_a_b_b.html">mingfx::AABB</a></div><div class="ttdoc">A 3D axis-aligned bounding box defined by two corners (min and max).</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00031">aabb.h:31</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html"><div class="ttname"><a href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></div><div class="ttdoc">A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.</div><div class="ttdef"><b>Definition:</b> <a href="mesh_8h_source.html#l00127">mesh.h:127</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html"><div class="ttname"><a href="classmingfx_1_1_ray.html">mingfx::Ray</a></div><div class="ttdoc">Stores the mathematical object of a ray that begins at an origin (a 3D point) and points in a directi...</div><div class="ttdef"><b>Definition:</b> <a href="ray_8h_source.html#l00054">ray.h:54</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_a1a6130616c4e4eebe9d09181b0f8b734"><div class="ttname"><a href="classmingfx_1_1_ray.html#a1a6130616c4e4eebe9d09181b0f8b734">mingfx::Ray::IntersectTriangle</a></div><div class="ttdeci">bool IntersectTriangle(const Point3 &amp;v1, const Point3 &amp;v2, const Point3 &amp;v3, float *iTime, Point3 *iPoint) const</div><div class="ttdoc">Checks to see if the ray intersects a triangle defined by the vertices v1, v2, and v3.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe"><div class="ttname"><a href="classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe">mingfx::Ray::origin</a></div><div class="ttdeci">Point3 origin() const</div><div class="ttdoc">Returns the origin.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_a37689523a0b73d3d3288ce60bdcb7ae3"><div class="ttname"><a href="classmingfx_1_1_ray.html#a37689523a0b73d3d3288ce60bdcb7ae3">mingfx::Ray::IntersectQuad</a></div><div class="ttdeci">bool IntersectQuad(const Point3 &amp;v1, const Point3 &amp;v2, const Point3 &amp;v3, const Point3 &amp;v4, float *iTime, Point3 *iPoint) const</div><div class="ttdoc">Checks to see if the ray intersects a quad defined by the vertices v1, v2, v3, and v4.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_a3c926e2da6dfd1b0a435577617eae984"><div class="ttname"><a href="classmingfx_1_1_ray.html#a3c926e2da6dfd1b0a435577617eae984">mingfx::Ray::Length</a></div><div class="ttdeci">float Length() const</div><div class="ttdoc">Returns the length of the direction vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_a57d3ee10518ed361ae02d9cbdef842b7"><div class="ttname"><a href="classmingfx_1_1_ray.html#a57d3ee10518ed361ae02d9cbdef842b7">mingfx::Ray::IntersectAABB</a></div><div class="ttdeci">bool IntersectAABB(const AABB &amp;box, float *iTime) const</div><div class="ttdoc">Checks to see if the ray intersects an AABB (Axis-Aligned Bounding Box).</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_a75593293307b4eead15a876bf3597071"><div class="ttname"><a href="classmingfx_1_1_ray.html#a75593293307b4eead15a876bf3597071">mingfx::Ray::set</a></div><div class="ttdeci">void set(Point3 newOrigin, Vector3 newDir)</div><div class="ttdoc">Sets a new origin and direction.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_a79caa1df0839d13339575d3d5527ae6f"><div class="ttname"><a href="classmingfx_1_1_ray.html#a79caa1df0839d13339575d3d5527ae6f">mingfx::Ray::IntersectMesh</a></div><div class="ttdeci">bool IntersectMesh(const Mesh &amp;mesh, float *iTime, Point3 *iPoint, int *iTriangleID) const</div><div class="ttdoc">Checks to see if the ray intersects a triangle mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_a7b7826730a410c10be00122c99fe6dbe"><div class="ttname"><a href="classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe">mingfx::Ray::direction</a></div><div class="ttdeci">Vector3 direction() const</div><div class="ttdoc">Returns the direction.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_a8707604031eb9437c449345d85d69d24"><div class="ttname"><a href="classmingfx_1_1_ray.html#a8707604031eb9437c449345d85d69d24">mingfx::Ray::IntersectPlane</a></div><div class="ttdeci">bool IntersectPlane(const Point3 &amp;planePt, const Vector3 &amp;planeNormal, float *iTime, Point3 *iPoint) const</div><div class="ttdoc">Checks to see if the ray intersects a plane defined by a point and a normal.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_a87b07c4f7c9f33189efade7e519b5d9d"><div class="ttname"><a href="classmingfx_1_1_ray.html#a87b07c4f7c9f33189efade7e519b5d9d">mingfx::Ray::operator==</a></div><div class="ttdeci">bool operator==(const Ray &amp;other) const</div><div class="ttdoc">Check for &quot;equality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_a970c7dbc19167be625967fabfb39b4ff"><div class="ttname"><a href="classmingfx_1_1_ray.html#a970c7dbc19167be625967fabfb39b4ff">mingfx::Ray::IntersectSphere</a></div><div class="ttdeci">bool IntersectSphere(const Point3 &amp;center, float radius, float *iTime, Point3 *iPoint) const</div><div class="ttdoc">Checks to see if the ray intersects a sphere defined by a center point and a radius.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_ab38cdd0793b3acfe55fa9ebca5ddebf6"><div class="ttname"><a href="classmingfx_1_1_ray.html#ab38cdd0793b3acfe55fa9ebca5ddebf6">mingfx::Ray::Ray</a></div><div class="ttdeci">Ray(const Point3 &amp;origin, const Vector3 &amp;direction)</div><div class="ttdoc">Creates a ray from a 3D origin and direction.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_ab62fa6ea1c20870f67c58401aefe3eff"><div class="ttname"><a href="classmingfx_1_1_ray.html#ab62fa6ea1c20870f67c58401aefe3eff">mingfx::Ray::operator!=</a></div><div class="ttdeci">bool operator!=(const Ray &amp;other) const</div><div class="ttdoc">Check for &quot;inequality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_ac20909f30c07d5375598876c6d294625"><div class="ttname"><a href="classmingfx_1_1_ray.html#ac20909f30c07d5375598876c6d294625">mingfx::Ray::~Ray</a></div><div class="ttdeci">virtual ~Ray()</div><div class="ttdoc">Ray destructor.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_ac90097090f0f8f49db13f6f232712afc"><div class="ttname"><a href="classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc">mingfx::Ray::FastIntersectMesh</a></div><div class="ttdeci">bool FastIntersectMesh(Mesh *mesh, float *iTime, Point3 *iPoint, int *iTriangleID) const</div><div class="ttdoc">Checks to see if the ray intersects a triangle mesh.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_ray_html_aee3fe586869e00ae657a74bb4bbbbfda"><div class="ttname"><a href="classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda">mingfx::Ray::Ray</a></div><div class="ttdeci">Ray()</div><div class="ttdoc">Defaults to a ray at the origin and pointing in the -Z direction.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="amesh_8h_html"><div class="ttname"><a href="mesh_8h.html">mesh.h</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="anamespacemingfx_html_a6bc967741341f4f318a505d884192906"><div class="ttname"><a href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">mingfx::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a6eb31e6e81c6e29144799be4c9db404d"><div class="ttname"><a href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">mingfx::operator&gt;&gt;</a></div><div class="ttdeci">std::istream &amp; operator&gt;&gt;(std::istream &amp;is, Color &amp;c)</div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+<div class="ttc" id="avector3_8h_html"><div class="ttname"><a href="vector3_8h.html">vector3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_0.html b/dev/MinGfx/docs/html/search/all_0.html
new file mode 100644
index 0000000..1ec5b2d
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_0.js b/dev/MinGfx/docs/html/search/all_0.js
new file mode 100644
index 0000000..fd5078e
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_0.js
@@ -0,0 +1,20 @@
+var searchData=
+[
+ ['aabb_0',['AABB',['../classmingfx_1_1_a_a_b_b.html#af7acb376dbda50fa1d8c30d1b5eb85fb',1,'mingfx::AABB::AABB()'],['../classmingfx_1_1_a_a_b_b.html#a5bf74f4e7f64adae9ea66f213a4012d1',1,'mingfx::AABB::AABB(const Point3 &amp;a)'],['../classmingfx_1_1_a_a_b_b.html#aaa44f815006b66f67da76fd89c02a0cf',1,'mingfx::AABB::AABB(const Point3 &amp;a, const Point3 &amp;b, const Point3 &amp;c)'],['../classmingfx_1_1_a_a_b_b.html#a0f3e7d3b4012e25018ad4c51edafd4f8',1,'mingfx::AABB::AABB(const Vector3 &amp;extents)'],['../classmingfx_1_1_a_a_b_b.html#a7c47fca94d56a2845ca7729d580ee7d1',1,'mingfx::AABB::AABB(const Point3 &amp;center, const Vector3 &amp;extents)'],['../classmingfx_1_1_a_a_b_b.html#a95e244e6e0774c815de6b9434218ee09',1,'mingfx::AABB::AABB(const Mesh &amp;mesh)'],['../classmingfx_1_1_a_a_b_b.html#a2bf325127a89d7dbd5bb082ae69fb5e9',1,'mingfx::AABB::AABB(const Mesh &amp;mesh, unsigned int tri_id)'],['../classmingfx_1_1_a_a_b_b.html',1,'mingfx::AABB']]],
+ ['aabb_2eh_1',['aabb.h',['../aabb_8h.html',1,'']]],
+ ['active_5fhead_2',['active_head',['../structstbrp__context.html#a13277239636803aff28f00b0a0376120',1,'stbrp_context']]],
+ ['addfragmentshaderfromfile_3',['AddFragmentShaderFromFile',['../classmingfx_1_1_shader_program.html#acd94fc12beb85fe57aa80d3b825018b0',1,'mingfx::ShaderProgram']]],
+ ['addfragmentshaderfromsource_4',['AddFragmentShaderFromSource',['../classmingfx_1_1_shader_program.html#a7a3063ec42798c076e1ab0c0e6411e9c',1,'mingfx::ShaderProgram']]],
+ ['addlight_5',['AddLight',['../classmingfx_1_1_default_shader.html#af54a8e489d9fb34cfceb1c07562c6e2c',1,'mingfx::DefaultShader']]],
+ ['addtriangle_6',['AddTriangle',['../classmingfx_1_1_mesh.html#a29eeb2e778704350789033ec4940d55a',1,'mingfx::Mesh']]],
+ ['addvertexshaderfromfile_7',['AddVertexShaderFromFile',['../classmingfx_1_1_shader_program.html#a63ac061271fad9338e922389d4a179e5',1,'mingfx::ShaderProgram']]],
+ ['addvertexshaderfromsource_8',['AddVertexShaderFromSource',['../classmingfx_1_1_shader_program.html#ab5fed4904a59c6e83ebb43aebf4c043d',1,'mingfx::ShaderProgram']]],
+ ['advanceanimation_9',['AdvanceAnimation',['../classmingfx_1_1_uni_cam.html#aab253d966af52ac277ac51194745085c',1,'mingfx::UniCam']]],
+ ['align_10',['Align',['../classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d',1,'mingfx::Matrix4']]],
+ ['align_11',['align',['../structstbrp__context.html#ae36053e2001a725aec2b5756dc990481',1,'stbrp_context']]],
+ ['ambient_5fintensity_12',['ambient_intensity',['../classmingfx_1_1_default_shader_1_1_light_properties.html#a226c173b193459af291687dd45280fbb',1,'mingfx::DefaultShader::LightProperties']]],
+ ['ambient_5freflectance_13',['ambient_reflectance',['../classmingfx_1_1_default_shader_1_1_material_properties.html#ad4db9a1b0636db84f57f022c51ce7657',1,'mingfx::DefaultShader::MaterialProperties']]],
+ ['api_20_2d_20mingfx_20programming_20reference_20organized_20by_20topic_14',['API - MinGfx Programming Reference Organized by Topic',['../api.html',1,'']]],
+ ['api_2emd_15',['api.md',['../api_8md.html',1,'']]],
+ ['aspect_5fratio_16',['aspect_ratio',['../classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23',1,'mingfx::GraphicsApp']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_1.html b/dev/MinGfx/docs/html/search/all_1.html
new file mode 100644
index 0000000..9f80e90
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_1.js b/dev/MinGfx/docs/html/search/all_1.js
new file mode 100644
index 0000000..057894e
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_1.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['bindtexture_17',['BindTexture',['../classmingfx_1_1_shader_program.html#a4e5a2659f66f29433b15748f36c61ea2',1,'mingfx::ShaderProgram::BindTexture(const std::string &amp;name, const Texture2D &amp;tex)'],['../classmingfx_1_1_shader_program.html#af81d97c2843278eb40cdcdf8e5d54a96',1,'mingfx::ShaderProgram::BindTexture(const std::string &amp;name, const Texture2D &amp;tex, int texUnit)']]],
+ ['buildbvh_18',['BuildBVH',['../classmingfx_1_1_mesh.html#a8d96c1b5985cd836f2aa2b2994af64c1',1,'mingfx::Mesh']]],
+ ['bvh_19',['BVH',['../classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75',1,'mingfx::BVH::BVH()'],['../classmingfx_1_1_b_v_h.html',1,'mingfx::BVH']]],
+ ['bvh_2eh_20',['bvh.h',['../bvh_8h.html',1,'']]],
+ ['bvh_5fptr_21',['bvh_ptr',['../classmingfx_1_1_mesh.html#a978b1341d5613d399a68e40c61c57ba4',1,'mingfx::Mesh']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_10.html b/dev/MinGfx/docs/html/search/all_10.html
new file mode 100644
index 0000000..3bf1196
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_10.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_10.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_10.js b/dev/MinGfx/docs/html/search/all_10.js
new file mode 100644
index 0000000..4c6a3f0
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_10.js
@@ -0,0 +1,53 @@
+var searchData=
+[
+ ['scale_225',['Scale',['../classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e',1,'mingfx::Matrix4']]],
+ ['screen_226',['screen',['../classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16',1,'mingfx::GraphicsApp']]],
+ ['screentodepthplane_227',['ScreenToDepthPlane',['../classmingfx_1_1_gfx_math.html#aaa6af7c0de01fdad46d48d43efb6aa67',1,'mingfx::GfxMath']]],
+ ['screentonearplane_228',['ScreenToNearPlane',['../classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0',1,'mingfx::GfxMath']]],
+ ['screentoworld_229',['ScreenToWorld',['../classmingfx_1_1_gfx_math.html#a24048d7b688ae46317c3e8de8a701273',1,'mingfx::GfxMath']]],
+ ['set_230',['set',['../classmingfx_1_1_ray.html#a75593293307b4eead15a876bf3597071',1,'mingfx::Ray']]],
+ ['set_5fdefault_5fdepth_231',['set_default_depth',['../classmingfx_1_1_uni_cam.html#a71e0351ac19a18b9c02215a60dc51068',1,'mingfx::UniCam']]],
+ ['set_5ffilter_5fmode_232',['set_filter_mode',['../classmingfx_1_1_texture2_d.html#a4a3b2b550fefdf79f0fb392b04e7b013',1,'mingfx::Texture2D']]],
+ ['set_5flook_5fscale_233',['set_look_scale',['../classmingfx_1_1_craft_cam.html#a15092ae5de6920546e3ce79aeb196f44',1,'mingfx::CraftCam']]],
+ ['set_5frotation_5fscale_234',['set_rotation_scale',['../classmingfx_1_1_craft_cam.html#a352f5a42f6e88d2e599bd5acb42e5831',1,'mingfx::CraftCam']]],
+ ['set_5ftranslation_5fscale_235',['set_translation_scale',['../classmingfx_1_1_craft_cam.html#a151fde09d08001ee2a615f25ec1acea7',1,'mingfx::CraftCam']]],
+ ['set_5fuser_5fdata_236',['set_user_data',['../classmingfx_1_1_a_a_b_b.html#ade89d21e799a97e7d82be5d593ee2e4b',1,'mingfx::AABB']]],
+ ['set_5fview_5fmatrix_237',['set_view_matrix',['../classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8',1,'mingfx::CraftCam::set_view_matrix()'],['../classmingfx_1_1_uni_cam.html#a6b17bab82595ca468a3c638512011e5b',1,'mingfx::UniCam::set_view_matrix()']]],
+ ['set_5fwrap_5fmode_238',['set_wrap_mode',['../classmingfx_1_1_texture2_d.html#aa5cbe3396e4560ec0746e91dbc55bc9f',1,'mingfx::Texture2D']]],
+ ['setcolors_239',['SetColors',['../classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f',1,'mingfx::Mesh::SetColors(int triangle_id, Color c1, Color c2, Color c3)'],['../classmingfx_1_1_mesh.html#ab9b05a77591a9adad12032d513256dae',1,'mingfx::Mesh::SetColors(const std::vector&lt; Color &gt; &amp;colors)'],['../classmingfx_1_1_mesh.html#aed172bdd77858f3b59978cb8527e19ae',1,'mingfx::Mesh::SetColors(float *colors_array, int num_colors)']]],
+ ['setindices_240',['SetIndices',['../classmingfx_1_1_mesh.html#a1f94c9ca7867b65e04f7e02813a06581',1,'mingfx::Mesh::SetIndices(const std::vector&lt; unsigned int &gt; index_array)'],['../classmingfx_1_1_mesh.html#a84711746b8d37c8d9b12ae748a4c5b8c',1,'mingfx::Mesh::SetIndices(unsigned int *index_array, int num_indices)']]],
+ ['setinstancetransforms_241',['SetInstanceTransforms',['../classmingfx_1_1_mesh.html#a7175238f5874929e2258458b98421d87',1,'mingfx::Mesh']]],
+ ['setlight_242',['SetLight',['../classmingfx_1_1_default_shader.html#a41e74fb8af72a6b22c72b0916726b6d6',1,'mingfx::DefaultShader']]],
+ ['setnormals_243',['SetNormals',['../classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903',1,'mingfx::Mesh::SetNormals(int triangle_id, Vector3 n1, Vector3 n2, Vector3 n3)'],['../classmingfx_1_1_mesh.html#ad28dbd5b0ab77bec28f30f618dd9e57d',1,'mingfx::Mesh::SetNormals(const std::vector&lt; Vector3 &gt; &amp;norms)'],['../classmingfx_1_1_mesh.html#a6ab1128fab6f969564d3a1329baeade6',1,'mingfx::Mesh::SetNormals(float *norms_array, int num_norms)']]],
+ ['settexcoords_244',['SetTexCoords',['../classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3',1,'mingfx::Mesh::SetTexCoords(int triangle_id, int texture_unit, Point2 uv1, Point2 uv2, Point2 uv3)'],['../classmingfx_1_1_mesh.html#aba2dfd0ade2d8a728897d411ef3fdaf1',1,'mingfx::Mesh::SetTexCoords(int texture_unit, const std::vector&lt; Point2 &gt; &amp;tex_coords)'],['../classmingfx_1_1_mesh.html#ac9cd4e8d67bb70295a48fcbc72ae32f9',1,'mingfx::Mesh::SetTexCoords(int texture_unit, float *tex_coords_array, int num_tex_coords)']]],
+ ['setuniform_245',['SetUniform',['../classmingfx_1_1_shader_program.html#a0b3e6285354e007bf79a9ac1587f86f5',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Vector3 &amp;v)'],['../classmingfx_1_1_shader_program.html#a766988eac957e9d810fdf2cbd2eafae0',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Matrix4 &amp;m)'],['../classmingfx_1_1_shader_program.html#a9ec2b53ba4bea7e48ef459530b8c6d60',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Color &amp;c)'],['../classmingfx_1_1_shader_program.html#ab547dadc25582bec157b39de29d1419e',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, int i)'],['../classmingfx_1_1_shader_program.html#a707d2cb51a54151959c6570d6bfc7840',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, unsigned int ui)'],['../classmingfx_1_1_shader_program.html#a680fa87cb30343bb56abc48a090e823c',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, float f)'],['../classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Point2 &amp;p)'],['../classmingfx_1_1_shader_program.html#aef58537d81bdb9d88a5f1c56a2b98b25',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Vector2 &amp;v)'],['../classmingfx_1_1_shader_program.html#ac59b3d0542ce45631876615eabf66487',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Point3 &amp;p)']]],
+ ['setuniformarray1_246',['SetUniformArray1',['../classmingfx_1_1_shader_program.html#a51cd1c1d194b2f5c07e81d4f579f2f2b',1,'mingfx::ShaderProgram::SetUniformArray1(const std::string &amp;name, int *i, int count)'],['../classmingfx_1_1_shader_program.html#abba87d2b0baca89232dbd1d6331875de',1,'mingfx::ShaderProgram::SetUniformArray1(const std::string &amp;name, unsigned int *ui, int count)'],['../classmingfx_1_1_shader_program.html#a5c7891252d6b6c40982b56543820cd19',1,'mingfx::ShaderProgram::SetUniformArray1(const std::string &amp;name, float *f, int count)']]],
+ ['setuniformarray2_247',['SetUniformArray2',['../classmingfx_1_1_shader_program.html#a6fdca4b0ccaa8a0b2c8c68fd7645727c',1,'mingfx::ShaderProgram::SetUniformArray2(const std::string &amp;name, unsigned int *ui, int count)'],['../classmingfx_1_1_shader_program.html#a9bab504c74a1c4258258b91afe9a9623',1,'mingfx::ShaderProgram::SetUniformArray2(const std::string &amp;name, int *i, int count)'],['../classmingfx_1_1_shader_program.html#a93914cad6d8e751218c88010c51cf657',1,'mingfx::ShaderProgram::SetUniformArray2(const std::string &amp;name, float *f, int count)']]],
+ ['setuniformarray3_248',['SetUniformArray3',['../classmingfx_1_1_shader_program.html#ac582a2aa74a83095e0b8e359ce432511',1,'mingfx::ShaderProgram::SetUniformArray3(const std::string &amp;name, int *i, int count)'],['../classmingfx_1_1_shader_program.html#a8c31de93b17f050baecb5323a69bdbfa',1,'mingfx::ShaderProgram::SetUniformArray3(const std::string &amp;name, unsigned int *ui, int count)'],['../classmingfx_1_1_shader_program.html#afc84377716296a57299ebbc01884b65d',1,'mingfx::ShaderProgram::SetUniformArray3(const std::string &amp;name, float *f, int count)']]],
+ ['setuniformarray4_249',['SetUniformArray4',['../classmingfx_1_1_shader_program.html#ab06ef4682f801fca080a8f67dc6345ba',1,'mingfx::ShaderProgram::SetUniformArray4(const std::string &amp;name, int *i, int count)'],['../classmingfx_1_1_shader_program.html#a2854ad947f74432edc0b730462b7f695',1,'mingfx::ShaderProgram::SetUniformArray4(const std::string &amp;name, unsigned int *ui, int count)'],['../classmingfx_1_1_shader_program.html#a9710cf4c72a7321b9a1ff1b86ae42da1',1,'mingfx::ShaderProgram::SetUniformArray4(const std::string &amp;name, float *f, int count)']]],
+ ['setvertices_250',['SetVertices',['../classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6',1,'mingfx::Mesh::SetVertices(const std::vector&lt; Point3 &gt; &amp;verts)'],['../classmingfx_1_1_mesh.html#a033076b9bf1714c9b9e0eeef11ebcd49',1,'mingfx::Mesh::SetVertices(float *verts_array, int num_verts)']]],
+ ['shader_5fprogram_2eh_251',['shader_program.h',['../shader__program_8h.html',1,'']]],
+ ['shaderprogram_252',['ShaderProgram',['../classmingfx_1_1_shader_program.html',1,'mingfx::ShaderProgram'],['../classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700',1,'mingfx::ShaderProgram::ShaderProgram()']]],
+ ['shinniness_253',['shinniness',['../classmingfx_1_1_default_shader_1_1_material_properties.html#ad77e4c78a2bf60776c673b91bc4c8a13',1,'mingfx::DefaultShader::MaterialProperties']]],
+ ['size_254',['size',['../classmingfx_1_1_text_shader_1_1_text_format.html#aeecda817624276f0cfb812ddcdbbc2f0',1,'mingfx::TextShader::TextFormat']]],
+ ['slerp_255',['Slerp',['../classmingfx_1_1_quaternion.html#a0290914928a2618f7faaa40989113d22',1,'mingfx::Quaternion::Slerp(const Quaternion &amp;other, float alpha) const'],['../classmingfx_1_1_quaternion.html#a31d37561099fab3d75a74455c5f43133',1,'mingfx::Quaternion::Slerp(const Quaternion &amp;a, const Quaternion &amp;b, float alpha)']]],
+ ['specular_5fintensity_256',['specular_intensity',['../classmingfx_1_1_default_shader_1_1_light_properties.html#abef7666629dbb9da661b163e0584c9a4',1,'mingfx::DefaultShader::LightProperties']]],
+ ['specular_5freflectance_257',['specular_reflectance',['../classmingfx_1_1_default_shader_1_1_material_properties.html#acfd78796e08f527a24cce3c1e206148c',1,'mingfx::DefaultShader::MaterialProperties']]],
+ ['stb_5frect_5fpack_2eh_258',['stb_rect_pack.h',['../stb__rect__pack_8h.html',1,'']]],
+ ['stb_5frect_5fpack_5fversion_259',['STB_RECT_PACK_VERSION',['../stb__rect__pack_8h.html#af2f15dfcc6ad60b1df4f5902e2cc25ce',1,'stb_rect_pack.h']]],
+ ['stbrp_5fcontext_260',['stbrp_context',['../structstbrp__context.html',1,'stbrp_context'],['../stb__rect__pack_8h.html#a0455046a8d5457bbc4f3f3ec995c338f',1,'stbrp_context():&#160;stb_rect_pack.h']]],
+ ['stbrp_5fcoord_261',['stbrp_coord',['../stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9',1,'stb_rect_pack.h']]],
+ ['stbrp_5fdef_262',['STBRP_DEF',['../stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753',1,'stb_rect_pack.h']]],
+ ['stbrp_5fheuristic_5fskyline_5fbf_5fsortheight_263',['STBRP_HEURISTIC_Skyline_BF_sortHeight',['../stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c',1,'stb_rect_pack.h']]],
+ ['stbrp_5fheuristic_5fskyline_5fbl_5fsortheight_264',['STBRP_HEURISTIC_Skyline_BL_sortHeight',['../stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a',1,'stb_rect_pack.h']]],
+ ['stbrp_5fheuristic_5fskyline_5fdefault_265',['STBRP_HEURISTIC_Skyline_default',['../stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525',1,'stb_rect_pack.h']]],
+ ['stbrp_5finit_5ftarget_266',['stbrp_init_target',['../stb__rect__pack_8h.html#a8b32f5ad458f614f5d419ef26cef5b3c',1,'stb_rect_pack.h']]],
+ ['stbrp_5fnode_267',['stbrp_node',['../structstbrp__node.html',1,'stbrp_node'],['../stb__rect__pack_8h.html#ae8f871c209d2e6218baf9c0e2a209ea1',1,'stbrp_node():&#160;stb_rect_pack.h']]],
+ ['stbrp_5fpack_5frects_268',['stbrp_pack_rects',['../stb__rect__pack_8h.html#af038ae1b98573f24736c9a3eed0478ba',1,'stb_rect_pack.h']]],
+ ['stbrp_5frect_269',['stbrp_rect',['../structstbrp__rect.html',1,'stbrp_rect'],['../stb__rect__pack_8h.html#a7c4a99b31ea2207a0b2bbcbdab8f3840',1,'stbrp_rect():&#160;stb_rect_pack.h']]],
+ ['stbrp_5fsetup_5fallow_5fout_5fof_5fmem_270',['stbrp_setup_allow_out_of_mem',['../stb__rect__pack_8h.html#a1babd70b223e571305fd9753a83a4fda',1,'stb_rect_pack.h']]],
+ ['stbrp_5fsetup_5fheuristic_271',['stbrp_setup_heuristic',['../stb__rect__pack_8h.html#a5a8223866c146933da3e152066bf61a1',1,'stb_rect_pack.h']]],
+ ['stopprogram_272',['StopProgram',['../classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67',1,'mingfx::DefaultShader::StopProgram()'],['../classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da',1,'mingfx::ShaderProgram::StopProgram()']]],
+ ['subdeterminant_273',['SubDeterminant',['../classmingfx_1_1_matrix4.html#a3d9898bfac2510a695df6b033054e481',1,'mingfx::Matrix4']]],
+ ['surface_5ftexture_274',['surface_texture',['../classmingfx_1_1_default_shader_1_1_material_properties.html#ae26eed46a279c73e947880858763514e',1,'mingfx::DefaultShader::MaterialProperties']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_11.html b/dev/MinGfx/docs/html/search/all_11.html
new file mode 100644
index 0000000..c9f79d2
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_11.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_11.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_11.js b/dev/MinGfx/docs/html/search/all_11.js
new file mode 100644
index 0000000..7e7fecc
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_11.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+ ['text_5fshader_2eh_275',['text_shader.h',['../text__shader_8h.html',1,'']]],
+ ['textextents_276',['TextExtents',['../classmingfx_1_1_text_shader.html#ac4e9a150311fe6d74e9f6214ebeb6b28',1,'mingfx::TextShader']]],
+ ['textformat_277',['TextFormat',['../classmingfx_1_1_text_shader_1_1_text_format.html',1,'mingfx::TextShader::TextFormat'],['../classmingfx_1_1_text_shader_1_1_text_format.html#a2b7d7e2e540c881952b97b8948b49fcb',1,'mingfx::TextShader::TextFormat::TextFormat()']]],
+ ['textshader_278',['TextShader',['../classmingfx_1_1_text_shader.html',1,'mingfx::TextShader'],['../classmingfx_1_1_text_shader.html#a0ec5a6ba22abb3f86c611107925fca67',1,'mingfx::TextShader::TextShader()']]],
+ ['texture2d_279',['Texture2D',['../classmingfx_1_1_texture2_d.html',1,'mingfx::Texture2D'],['../classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d',1,'mingfx::Texture2D::Texture2D()']]],
+ ['texture2d_2eh_280',['texture2d.h',['../texture2d_8h.html',1,'']]],
+ ['todegrees_281',['ToDegrees',['../classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3',1,'mingfx::GfxMath::ToDegrees(float radians)'],['../classmingfx_1_1_gfx_math.html#aa5411a7d8bfc8e47d596362a328dbde8',1,'mingfx::GfxMath::ToDegrees(Vector3 radians)']]],
+ ['toeulerangleszyx_282',['ToEulerAnglesZYX',['../classmingfx_1_1_quaternion.html#a033f05ed7e7215a5c3c4cd26548c8007',1,'mingfx::Quaternion']]],
+ ['toradians_283',['ToRadians',['../classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637',1,'mingfx::GfxMath::ToRadians(float degrees)'],['../classmingfx_1_1_gfx_math.html#a38927f1f8ea4625d909e64efa93c5190',1,'mingfx::GfxMath::ToRadians(Vector3 degrees)']]],
+ ['tounit_284',['ToUnit',['../classmingfx_1_1_quaternion.html#a3572b35419c51332204adb5bf35f0b03',1,'mingfx::Quaternion::ToUnit()'],['../classmingfx_1_1_vector2.html#a70f9f612a99017bf051e40ebd7fa7f83',1,'mingfx::Vector2::ToUnit()'],['../classmingfx_1_1_vector3.html#a3caef3c6f24b90730ef70c84ce0e0d71',1,'mingfx::Vector3::ToUnit()']]],
+ ['tovector_285',['ToVector',['../classmingfx_1_1_color.html#ae7371e464c4af7ac93d9edd4c0772c2b',1,'mingfx::Color::ToVector()'],['../classmingfx_1_1_matrix4.html#a4e9433f0482b5e9688c12398900608db',1,'mingfx::Matrix4::ToVector() const']]],
+ ['translation_286',['Translation',['../classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84',1,'mingfx::Matrix4']]],
+ ['translation_5fscale_287',['translation_scale',['../classmingfx_1_1_craft_cam.html#a93567af7acbae2939d57cfd8a72bcef2',1,'mingfx::CraftCam']]],
+ ['transpose_288',['Transpose',['../classmingfx_1_1_matrix4.html#afd1030205567d23d4a2d1240d8214850',1,'mingfx::Matrix4']]],
+ ['two_5fpi_289',['TWO_PI',['../classmingfx_1_1_gfx_math.html#a0e5c7562116babf11c61f4c7f20f8b69',1,'mingfx::GfxMath']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_12.html b/dev/MinGfx/docs/html/search/all_12.html
new file mode 100644
index 0000000..ab93472
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_12.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_12.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_12.js b/dev/MinGfx/docs/html/search/all_12.js
new file mode 100644
index 0000000..98f79d0
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_12.js
@@ -0,0 +1,16 @@
+var searchData=
+[
+ ['unicam_290',['UniCam',['../classmingfx_1_1_uni_cam.html',1,'mingfx::UniCam'],['../classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e',1,'mingfx::UniCam::UniCam()'],['../classmingfx_1_1_uni_cam.html#af507e639c4bceb4c79e21a6f80c48d07',1,'mingfx::UniCam::UniCam(const Matrix4 &amp;initialViewMatrix)']]],
+ ['unicam_2eh_291',['unicam.h',['../unicam_8h.html',1,'']]],
+ ['unitx_292',['UnitX',['../classmingfx_1_1_vector2.html#a8ef6e0525ec34aaee9cf35bab098ecdb',1,'mingfx::Vector2::UnitX()'],['../classmingfx_1_1_vector3.html#ae8d822fdea67f63580b4e1f78f5b8922',1,'mingfx::Vector3::UnitX()']]],
+ ['unity_293',['UnitY',['../classmingfx_1_1_vector2.html#ab7b3ba42a5a63c512bd7b32fd4cc0db0',1,'mingfx::Vector2::UnitY()'],['../classmingfx_1_1_vector3.html#a8d31e433d1ac04aaceea1b1dcd1643df',1,'mingfx::Vector3::UnitY()']]],
+ ['unitz_294',['UnitZ',['../classmingfx_1_1_vector3.html#a4b696b0d1143d6e30a34a2f889d2ca61',1,'mingfx::Vector3']]],
+ ['updatefrombytes_295',['UpdateFromBytes',['../classmingfx_1_1_texture2_d.html#a0783ad70829ef353aa92344d320b107c',1,'mingfx::Texture2D']]],
+ ['updatefromfloats_296',['UpdateFromFloats',['../classmingfx_1_1_texture2_d.html#ad7640f0cbda6398a6bb80202b80dd693',1,'mingfx::Texture2D']]],
+ ['updategpumemory_297',['UpdateGPUMemory',['../classmingfx_1_1_mesh.html#ac74345bf4b2994de4ee1c509bcc6840e',1,'mingfx::Mesh']]],
+ ['updateheight_298',['UpdateHeight',['../classmingfx_1_1_craft_cam.html#ae3d9c7ea9307dbbadaa4b6e2f9933a7b',1,'mingfx::CraftCam']]],
+ ['updatesimulation_299',['UpdateSimulation',['../classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7',1,'mingfx::CraftCam::UpdateSimulation()'],['../classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa',1,'mingfx::GraphicsApp::UpdateSimulation()']]],
+ ['updatetriangle_300',['UpdateTriangle',['../classmingfx_1_1_mesh.html#a3e0ac86714f6b7c3f62761ef3952a044',1,'mingfx::Mesh']]],
+ ['useprogram_301',['UseProgram',['../classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0',1,'mingfx::DefaultShader::UseProgram()'],['../classmingfx_1_1_shader_program.html#af1c968f1c79f70e183c9d1239d3d205e',1,'mingfx::ShaderProgram::UseProgram()']]],
+ ['user_5fdata_302',['user_data',['../classmingfx_1_1_a_a_b_b.html#a35def5a4ee2ecd287f5c71436b2c5843',1,'mingfx::AABB']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_13.html b/dev/MinGfx/docs/html/search/all_13.html
new file mode 100644
index 0000000..51172c2
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_13.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_13.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_13.js b/dev/MinGfx/docs/html/search/all_13.js
new file mode 100644
index 0000000..867131d
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_13.js
@@ -0,0 +1,16 @@
+var searchData=
+[
+ ['v_5falign_303',['v_align',['../classmingfx_1_1_text_shader_1_1_text_format.html#a8455382a6829022020eb307ae9168bd7',1,'mingfx::TextShader::TextFormat']]],
+ ['value_5fptr_304',['value_ptr',['../classmingfx_1_1_color.html#aa3a93033db8e00aff817a125eb5b54a0',1,'mingfx::Color::value_ptr()'],['../classmingfx_1_1_matrix4.html#a2b7b30f23f08d70e83c7b7e01945dd3c',1,'mingfx::Matrix4::value_ptr()'],['../classmingfx_1_1_point2.html#a027b2412f1c36242ccb06cf37c7e29bc',1,'mingfx::Point2::value_ptr()'],['../classmingfx_1_1_point3.html#af0557bdc07452cf335e2b7e04fc0aa3c',1,'mingfx::Point3::value_ptr()'],['../classmingfx_1_1_quaternion.html#abca597e756f257dc33838734ae19baf9',1,'mingfx::Quaternion::value_ptr()'],['../classmingfx_1_1_vector2.html#a80ef53519d50a6a6f158f66755c040d1',1,'mingfx::Vector2::value_ptr()'],['../classmingfx_1_1_vector3.html#aa7ddfd662e866c019a772ba66eae7331',1,'mingfx::Vector3::value_ptr()']]],
+ ['vector2_305',['Vector2',['../classmingfx_1_1_vector2.html',1,'mingfx::Vector2'],['../classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f',1,'mingfx::Vector2::Vector2()'],['../classmingfx_1_1_vector2.html#acc16337b6b06ebea2fde4c4bd1be7abd',1,'mingfx::Vector2::Vector2(float x, float y)'],['../classmingfx_1_1_vector2.html#a6e3d063a7080bfe199acc70cd5afded2',1,'mingfx::Vector2::Vector2(float *v)'],['../classmingfx_1_1_vector2.html#a40f53939581f5d06a1b757b0398525f8',1,'mingfx::Vector2::Vector2(const Vector2 &amp;v)']]],
+ ['vector2_2eh_306',['vector2.h',['../vector2_8h.html',1,'']]],
+ ['vector3_307',['Vector3',['../classmingfx_1_1_vector3.html',1,'mingfx::Vector3'],['../classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd',1,'mingfx::Vector3::Vector3()'],['../classmingfx_1_1_vector3.html#a256018f34e230d542027d07d14fd6e65',1,'mingfx::Vector3::Vector3(float x, float y, float z)'],['../classmingfx_1_1_vector3.html#a95b274c7a5ff118af20bc71682c6b1f1',1,'mingfx::Vector3::Vector3(float *v)'],['../classmingfx_1_1_vector3.html#af6100965af7770f833dbf0c9f30f4fdd',1,'mingfx::Vector3::Vector3(const Vector3 &amp;v)']]],
+ ['vector3_2eh_308',['vector3.h',['../vector3_8h.html',1,'']]],
+ ['vert_5falign_5fbaseline_309',['VERT_ALIGN_BASELINE',['../classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa0400d0d77ea6770b313eedaf36fe71bb',1,'mingfx::TextShader']]],
+ ['vert_5falign_5fbottom_310',['VERT_ALIGN_BOTTOM',['../classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa080e12cacc0f01b361c8b93c73dd2e28',1,'mingfx::TextShader']]],
+ ['vert_5falign_5fcenter_311',['VERT_ALIGN_CENTER',['../classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aac49ae9c9553284e44f90228b9ce647af',1,'mingfx::TextShader']]],
+ ['vert_5falign_5ftop_312',['VERT_ALIGN_TOP',['../classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa970e4fcd7c426e6cd49709119fba6e04',1,'mingfx::TextShader']]],
+ ['vertalign_313',['VertAlign',['../classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a',1,'mingfx::TextShader']]],
+ ['view_5fmatrix_314',['view_matrix',['../classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36',1,'mingfx::CraftCam::view_matrix()'],['../classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3',1,'mingfx::UniCam::view_matrix()']]],
+ ['volume_315',['Volume',['../classmingfx_1_1_a_a_b_b.html#a1ea0cf1c4051185b3f4296d20dd330c9',1,'mingfx::AABB']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_14.html b/dev/MinGfx/docs/html/search/all_14.html
new file mode 100644
index 0000000..afecf56
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_14.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_14.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_14.js b/dev/MinGfx/docs/html/search/all_14.js
new file mode 100644
index 0000000..f9e92e4
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_14.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['w_316',['w',['../structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5',1,'stbrp_rect::w()'],['../classmingfx_1_1_point2.html#ab00e35eccdc4b7deae8172f5954a86e8',1,'mingfx::Point2::w()'],['../classmingfx_1_1_point3.html#abbf85b5749b37869f4c1b98443ebbd9e',1,'mingfx::Point3::w()'],['../classmingfx_1_1_quaternion.html#a8aa53f71892f02c981d98d100a8b57c7',1,'mingfx::Quaternion::w()'],['../classmingfx_1_1_vector2.html#a267e6749091f23263d1620f801f0a831',1,'mingfx::Vector2::w()'],['../classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5',1,'mingfx::Vector3::w()']]],
+ ['was_5fpacked_317',['was_packed',['../structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49',1,'stbrp_rect']]],
+ ['width_318',['width',['../structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2',1,'stbrp_context::width()'],['../classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869',1,'mingfx::Texture2D::width()']]],
+ ['window_319',['window',['../classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94',1,'mingfx::GraphicsApp']]],
+ ['window_5fheight_320',['window_height',['../classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016',1,'mingfx::GraphicsApp']]],
+ ['window_5fwidth_321',['window_width',['../classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0',1,'mingfx::GraphicsApp']]],
+ ['wrap_5fmode_322',['wrap_mode',['../classmingfx_1_1_texture2_d.html#a1c8827426f43343c0ad171e181a741ea',1,'mingfx::Texture2D']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_15.html b/dev/MinGfx/docs/html/search/all_15.html
new file mode 100644
index 0000000..69f382b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_15.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_15.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_15.js b/dev/MinGfx/docs/html/search/all_15.js
new file mode 100644
index 0000000..103250f
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_15.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['x_323',['x',['../structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18',1,'stbrp_rect::x()'],['../structstbrp__node.html#a45ab31a88025db27d08040d715b129ea',1,'stbrp_node::x()'],['../classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa',1,'mingfx::Point2::x()'],['../classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5',1,'mingfx::Point3::x()'],['../classmingfx_1_1_quaternion.html#a85464500e1d3c8ba10f1968426dc24ae',1,'mingfx::Quaternion::x()'],['../classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a',1,'mingfx::Vector2::x()'],['../classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4',1,'mingfx::Vector3::x()']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_16.html b/dev/MinGfx/docs/html/search/all_16.html
new file mode 100644
index 0000000..b19867a
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_16.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_16.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_16.js b/dev/MinGfx/docs/html/search/all_16.js
new file mode 100644
index 0000000..5eded29
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_16.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['y_324',['y',['../structstbrp__rect.html#ae3034c1fbf86043b568f5a4dddf946fa',1,'stbrp_rect::y()'],['../structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e',1,'stbrp_node::y()'],['../classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8',1,'mingfx::Point2::y()'],['../classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545',1,'mingfx::Point3::y()'],['../classmingfx_1_1_quaternion.html#adb294449db2a80bd11426148592d9e0b',1,'mingfx::Quaternion::y()'],['../classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b',1,'mingfx::Vector2::y()'],['../classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17',1,'mingfx::Vector3::y()']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_17.html b/dev/MinGfx/docs/html/search/all_17.html
new file mode 100644
index 0000000..1ad5d34
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_17.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_17.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_17.js b/dev/MinGfx/docs/html/search/all_17.js
new file mode 100644
index 0000000..8934ca2
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_17.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['z_325',['z',['../classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6',1,'mingfx::Point3::z()'],['../classmingfx_1_1_quaternion.html#a75ec001cbbf08cf5c4e1f8978082a55f',1,'mingfx::Quaternion::z()'],['../classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6',1,'mingfx::Vector3::z()']]],
+ ['zero_326',['Zero',['../classmingfx_1_1_point2.html#a60a2b348deab631b51caca3eb715461f',1,'mingfx::Point2::Zero()'],['../classmingfx_1_1_point3.html#a9983b62979f9ac5a11efea08d9d283ed',1,'mingfx::Point3::Zero()'],['../classmingfx_1_1_vector2.html#a7cb11f9fe8962ff9092fc1e5736faacf',1,'mingfx::Vector2::Zero()'],['../classmingfx_1_1_vector3.html#a52bf8582baa71e7d6f80c412687d9714',1,'mingfx::Vector3::Zero()']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_18.html b/dev/MinGfx/docs/html/search/all_18.html
new file mode 100644
index 0000000..507d0f8
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_18.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_18.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_18.js b/dev/MinGfx/docs/html/search/all_18.js
new file mode 100644
index 0000000..e80a560
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_18.js
@@ -0,0 +1,22 @@
+var searchData=
+[
+ ['_7eaabb_327',['~AABB',['../classmingfx_1_1_a_a_b_b.html#aeb63c176a2f2408e803d9a2f6848eee5',1,'mingfx::AABB']]],
+ ['_7ebvh_328',['~BVH',['../classmingfx_1_1_b_v_h.html#af81906830adcf4648cc8cf4e214b4269',1,'mingfx::BVH']]],
+ ['_7ecolor_329',['~Color',['../classmingfx_1_1_color.html#ab1a90432dd7fd7b2adf41d747be85378',1,'mingfx::Color']]],
+ ['_7ecraftcam_330',['~CraftCam',['../classmingfx_1_1_craft_cam.html#a85ef9bebdd1595be1288bc104245f4ff',1,'mingfx::CraftCam']]],
+ ['_7edefaultshader_331',['~DefaultShader',['../classmingfx_1_1_default_shader.html#a0fe7d605d039ecdbf17837bc5bbe0aba',1,'mingfx::DefaultShader']]],
+ ['_7egraphicsapp_332',['~GraphicsApp',['../classmingfx_1_1_graphics_app.html#aab7925c6b844e6bef428feacf4aa9afb',1,'mingfx::GraphicsApp']]],
+ ['_7ematrix4_333',['~Matrix4',['../classmingfx_1_1_matrix4.html#a8853a6b3fd0d08f1def5c9921bd47933',1,'mingfx::Matrix4']]],
+ ['_7emesh_334',['~Mesh',['../classmingfx_1_1_mesh.html#ace7b23730dbcb581c4886cf2b9998327',1,'mingfx::Mesh']]],
+ ['_7epoint2_335',['~Point2',['../classmingfx_1_1_point2.html#a7e5b2dcd7e079bdd00354e7ccf9c5c2a',1,'mingfx::Point2']]],
+ ['_7epoint3_336',['~Point3',['../classmingfx_1_1_point3.html#aa55aef76986cc7424c2a535d6fd1ab7a',1,'mingfx::Point3']]],
+ ['_7equaternion_337',['~Quaternion',['../classmingfx_1_1_quaternion.html#a1f9ddd82678ccf51a462e4e03a02c7cc',1,'mingfx::Quaternion']]],
+ ['_7equickshapes_338',['~QuickShapes',['../classmingfx_1_1_quick_shapes.html#a3a75dde188ec076ea46a6319ed1ca046',1,'mingfx::QuickShapes']]],
+ ['_7eray_339',['~Ray',['../classmingfx_1_1_ray.html#ac20909f30c07d5375598876c6d294625',1,'mingfx::Ray']]],
+ ['_7eshaderprogram_340',['~ShaderProgram',['../classmingfx_1_1_shader_program.html#a96da0dede354f2511084eeb25428edb4',1,'mingfx::ShaderProgram']]],
+ ['_7etextshader_341',['~TextShader',['../classmingfx_1_1_text_shader.html#a457f7a42eceb957cdb103664dd864feb',1,'mingfx::TextShader']]],
+ ['_7etexture2d_342',['~Texture2D',['../classmingfx_1_1_texture2_d.html#aab734dbbcf6211507ab65d5bb94a4ef9',1,'mingfx::Texture2D']]],
+ ['_7eunicam_343',['~UniCam',['../classmingfx_1_1_uni_cam.html#af98022627bcb52dbf54779cfaeb6ff7e',1,'mingfx::UniCam']]],
+ ['_7evector2_344',['~Vector2',['../classmingfx_1_1_vector2.html#ac49b009c4b6052ebe71d5cf4ce241b1f',1,'mingfx::Vector2']]],
+ ['_7evector3_345',['~Vector3',['../classmingfx_1_1_vector3.html#a6e0d09d774615bcfde5645c22a645969',1,'mingfx::Vector3']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_2.html b/dev/MinGfx/docs/html/search/all_2.html
new file mode 100644
index 0000000..02cfffc
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_2.js b/dev/MinGfx/docs/html/search/all_2.js
new file mode 100644
index 0000000..e558fe7
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_2.js
@@ -0,0 +1,21 @@
+var searchData=
+[
+ ['calcperfacenormals_22',['CalcPerFaceNormals',['../classmingfx_1_1_mesh.html#a1a5cea9cfdf4c672ba0c781ee54718f7',1,'mingfx::Mesh']]],
+ ['calcpervertexnormals_23',['CalcPerVertexNormals',['../classmingfx_1_1_mesh.html#acc7df547b0a2175287cc9f509c04e93c',1,'mingfx::Mesh']]],
+ ['clamp_24',['Clamp',['../classmingfx_1_1_gfx_math.html#af227209ec043b375497556ee2dcdf850',1,'mingfx::GfxMath']]],
+ ['closestpoint_25',['ClosestPoint',['../classmingfx_1_1_point3.html#a9dd5396f53b7006ec4cb63abffd90a7c',1,'mingfx::Point3']]],
+ ['closestpointonplane_26',['ClosestPointOnPlane',['../classmingfx_1_1_point3.html#ae31d5f91a03fabdf72b2fa54e177b743',1,'mingfx::Point3']]],
+ ['cofactor_27',['Cofactor',['../classmingfx_1_1_matrix4.html#a0d88ba8e15325d135157d115f2412e91',1,'mingfx::Matrix4']]],
+ ['color_28',['Color',['../classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d',1,'mingfx::Color::Color()'],['../classmingfx_1_1_color.html#a81b442b8afcd157c260487081f25dcc3',1,'mingfx::Color::Color(float red, float green, float blue, float alpha=1.0)'],['../classmingfx_1_1_color.html#ab4d6c067128e779add5390d83ea3410e',1,'mingfx::Color::Color(float *p)'],['../classmingfx_1_1_color.html#a7e0ca85141895a108c852f59f7ca00b9',1,'mingfx::Color::Color(const std::vector&lt; float &gt; &amp;vals)'],['../classmingfx_1_1_color.html#accb83cd759b7290ce2817724d57e246a',1,'mingfx::Color::Color(const Color &amp;p)']]],
+ ['color_29',['color',['../classmingfx_1_1_text_shader_1_1_text_format.html#af0483874ac3fcea58b6ff99ef6644ff7',1,'mingfx::TextShader::TextFormat']]],
+ ['color_30',['Color',['../classmingfx_1_1_color.html',1,'mingfx']]],
+ ['color_2eh_31',['color.h',['../color_8h.html',1,'']]],
+ ['columntopoint3_32',['ColumnToPoint3',['../classmingfx_1_1_matrix4.html#ae991be2b3bca290b44e676a9f8dc13bd',1,'mingfx::Matrix4']]],
+ ['columntovector3_33',['ColumnToVector3',['../classmingfx_1_1_matrix4.html#a7396dbff36cb732e1bd878020f52bbc3',1,'mingfx::Matrix4']]],
+ ['conjugate_34',['Conjugate',['../classmingfx_1_1_quaternion.html#ab0e3e20f78e537de0187def78d808584',1,'mingfx::Quaternion']]],
+ ['craft_5fcam_2eh_35',['craft_cam.h',['../craft__cam_8h.html',1,'']]],
+ ['craftcam_36',['CraftCam',['../classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171',1,'mingfx::CraftCam::CraftCam()'],['../classmingfx_1_1_craft_cam.html#ab9e1864b5859c22d27ba809b1ba7a51f',1,'mingfx::CraftCam::CraftCam(const Matrix4 &amp;initial_view_matrix)'],['../classmingfx_1_1_craft_cam.html',1,'mingfx::CraftCam']]],
+ ['createfromlistofboxes_37',['CreateFromListOfBoxes',['../classmingfx_1_1_b_v_h.html#a964420ca931fa93c420f0820e1b95942',1,'mingfx::BVH']]],
+ ['createfrommesh_38',['CreateFromMesh',['../classmingfx_1_1_b_v_h.html#a8ed3e91ecd2a0585a0dbac605d6f2c71',1,'mingfx::BVH']]],
+ ['cross_39',['Cross',['../classmingfx_1_1_vector3.html#a38cd4deed7d342464619b34b0ef95bec',1,'mingfx::Vector3::Cross(const Vector3 &amp;v) const'],['../classmingfx_1_1_vector3.html#a45d7d211135edd97ca21b047439db485',1,'mingfx::Vector3::Cross(const Vector3 &amp;v1, const Vector3 &amp;v2)']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_3.html b/dev/MinGfx/docs/html/search/all_3.html
new file mode 100644
index 0000000..39767b8
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_3.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_3.js b/dev/MinGfx/docs/html/search/all_3.js
new file mode 100644
index 0000000..21881e2
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_3.js
@@ -0,0 +1,28 @@
+var searchData=
+[
+ ['default_5fshader_40',['default_shader',['../classmingfx_1_1_quick_shapes.html#aa7564a49dc2ff8efd93dec13186cb75b',1,'mingfx::QuickShapes']]],
+ ['default_5fshader_2eh_41',['default_shader.h',['../default__shader_8h.html',1,'']]],
+ ['defaultshader_42',['DefaultShader',['../classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428',1,'mingfx::DefaultShader::DefaultShader()'],['../classmingfx_1_1_default_shader.html',1,'mingfx::DefaultShader']]],
+ ['determinant_43',['Determinant',['../classmingfx_1_1_matrix4.html#a0127ebae92b50e4f10ebee8565b0248c',1,'mingfx::Matrix4']]],
+ ['diffuse_5fintensity_44',['diffuse_intensity',['../classmingfx_1_1_default_shader_1_1_light_properties.html#a9a010057c15e3db5661b07a03d5176d7',1,'mingfx::DefaultShader::LightProperties']]],
+ ['diffuse_5freflectance_45',['diffuse_reflectance',['../classmingfx_1_1_default_shader_1_1_material_properties.html#aa7b75f95a45d7a1030c297192b14014f',1,'mingfx::DefaultShader::MaterialProperties']]],
+ ['dimensions_46',['Dimensions',['../classmingfx_1_1_a_a_b_b.html#a3bf7d5ffa3ccccf7111e98d88a3ffeec',1,'mingfx::AABB']]],
+ ['direction_47',['direction',['../classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe',1,'mingfx::Ray']]],
+ ['distancetoplane_48',['DistanceToPlane',['../classmingfx_1_1_point3.html#af554773b2d7f4492a0727e8e42efe002',1,'mingfx::Point3']]],
+ ['dot_49',['Dot',['../classmingfx_1_1_quaternion.html#a90a9b715d06c75ba60eb1164dc6e9c6f',1,'mingfx::Quaternion::Dot()'],['../classmingfx_1_1_vector2.html#ae2208539c6b29712c22f557dcfdd55d9',1,'mingfx::Vector2::Dot(const Vector2 &amp;v) const'],['../classmingfx_1_1_vector2.html#a9e81c518908ca06c98ba099b075fe1cd',1,'mingfx::Vector2::Dot(const Vector2 &amp;v1, const Vector2 &amp;v2)'],['../classmingfx_1_1_vector3.html#a31692a459a8056fe220d115eb5addc88',1,'mingfx::Vector3::Dot(const Vector3 &amp;v) const'],['../classmingfx_1_1_vector3.html#a235fb20d4075960d2ce6198dc95ac507',1,'mingfx::Vector3::Dot(const Vector3 &amp;v1, const Vector3 &amp;v2)']]],
+ ['draw_50',['Draw',['../classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b',1,'mingfx::DefaultShader::Draw()'],['../classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c',1,'mingfx::Mesh::Draw()'],['../classmingfx_1_1_uni_cam.html#ae45f3c80c205a539baeb4f1b8787777d',1,'mingfx::UniCam::Draw()']]],
+ ['draw3d_51',['Draw3D',['../classmingfx_1_1_text_shader.html#a2caaaf2decfac523b476951474e9a359',1,'mingfx::TextShader']]],
+ ['drawarrow_52',['DrawArrow',['../classmingfx_1_1_quick_shapes.html#aebe27814a826558ac0475fef3d4481eb',1,'mingfx::QuickShapes']]],
+ ['drawaxes_53',['DrawAxes',['../classmingfx_1_1_quick_shapes.html#a637876fdc13e84282922350b53dab5f8',1,'mingfx::QuickShapes']]],
+ ['drawbrush_54',['DrawBrush',['../classmingfx_1_1_quick_shapes.html#ab24811cfd980b3f2ec4ebccf6c0e8b30',1,'mingfx::QuickShapes']]],
+ ['drawcone_55',['DrawCone',['../classmingfx_1_1_quick_shapes.html#a1880f6dd3e794cd9f6e5d9138f93a424',1,'mingfx::QuickShapes']]],
+ ['drawcube_56',['DrawCube',['../classmingfx_1_1_quick_shapes.html#adad98f87a40650ff7c605a94b6d937af',1,'mingfx::QuickShapes']]],
+ ['drawcylinder_57',['DrawCylinder',['../classmingfx_1_1_quick_shapes.html#a69c442154f800c6bb3f6ffa8395e2844',1,'mingfx::QuickShapes']]],
+ ['drawfullscreentexture_58',['DrawFullscreenTexture',['../classmingfx_1_1_quick_shapes.html#abec2513648c1238f36c41cf3c85dd868',1,'mingfx::QuickShapes']]],
+ ['drawlines_59',['DrawLines',['../classmingfx_1_1_quick_shapes.html#af59ae8d8c5bd0447f3bb7f56112400bf',1,'mingfx::QuickShapes']]],
+ ['drawlinesegment_60',['DrawLineSegment',['../classmingfx_1_1_quick_shapes.html#a0feae19a04d9f315a39e2bdbf659bd7e',1,'mingfx::QuickShapes']]],
+ ['drawsphere_61',['DrawSphere',['../classmingfx_1_1_quick_shapes.html#aa5f4f64e3708630a6d58f6b4ca7d2744',1,'mingfx::QuickShapes']]],
+ ['drawsquare_62',['DrawSquare',['../classmingfx_1_1_quick_shapes.html#a4350ea23b8b9e0e8119310423d641ab3',1,'mingfx::QuickShapes::DrawSquare(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)'],['../classmingfx_1_1_quick_shapes.html#a7187f72fa8e12b38dcd0ce424fc85fbc',1,'mingfx::QuickShapes::DrawSquare(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color, const Texture2D &amp;texture)']]],
+ ['drawusingnanovg_63',['DrawUsingNanoVG',['../classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0',1,'mingfx::GraphicsApp']]],
+ ['drawusingopengl_64',['DrawUsingOpenGL',['../classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca',1,'mingfx::GraphicsApp']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_4.html b/dev/MinGfx/docs/html/search/all_4.html
new file mode 100644
index 0000000..fc40463
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_4.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_4.js b/dev/MinGfx/docs/html/search/all_4.js
new file mode 100644
index 0000000..bebfed9
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_4.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['extra_65',['extra',['../structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624',1,'stbrp_context']]],
+ ['eye_66',['eye',['../classmingfx_1_1_craft_cam.html#a82a8e20596247e2986e5929c1ef7f150',1,'mingfx::CraftCam::eye()'],['../classmingfx_1_1_uni_cam.html#a65d5735b4b3a8e38f2b30df4133cadd2',1,'mingfx::UniCam::eye()']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_5.html b/dev/MinGfx/docs/html/search/all_5.html
new file mode 100644
index 0000000..9dd9344
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_5.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_5.js b/dev/MinGfx/docs/html/search/all_5.js
new file mode 100644
index 0000000..37d0ac9
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_5.js
@@ -0,0 +1,16 @@
+var searchData=
+[
+ ['fastintersectmesh_67',['FastIntersectMesh',['../classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc',1,'mingfx::Ray']]],
+ ['fileexists_68',['FileExists',['../classmingfx_1_1_platform.html#a045007efda73123a7f4019837d83bc92',1,'mingfx::Platform']]],
+ ['filter_5fmode_69',['filter_mode',['../classmingfx_1_1_texture2_d.html#af0052203fcfd9bbb903a40d14700b13b',1,'mingfx::Texture2D']]],
+ ['findfile_70',['FindFile',['../classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1',1,'mingfx::Platform::FindFile(const std::string &amp;basename, const std::vector&lt; std::string &gt; &amp;searchpath)'],['../classmingfx_1_1_platform.html#a03ade910313dd9580c9e37a7b63f87b2',1,'mingfx::Platform::FindFile(const std::string &amp;basename, const std::string &amp;searchpath)']]],
+ ['findmingfxdatafile_71',['FindMinGfxDataFile',['../classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b',1,'mingfx::Platform']]],
+ ['findmingfxshaderfile_72',['FindMinGfxShaderFile',['../classmingfx_1_1_platform.html#af12cd63e1ede33529d8c282d7d916169',1,'mingfx::Platform']]],
+ ['framebuffer_5fheight_73',['framebuffer_height',['../classmingfx_1_1_graphics_app.html#af58153eb104f53216a3e67de2a472f32',1,'mingfx::GraphicsApp']]],
+ ['framebuffer_5fwidth_74',['framebuffer_width',['../classmingfx_1_1_graphics_app.html#ad596e69d030e7689ad91eaaec6975696',1,'mingfx::GraphicsApp']]],
+ ['free_5fhead_75',['free_head',['../structstbrp__context.html#a1336ae32373663847866cc65904c2839',1,'stbrp_context']]],
+ ['fromaxisangle_76',['FromAxisAngle',['../classmingfx_1_1_quaternion.html#a5bacec2f9a3cbbcf24572f9c8eeb480c',1,'mingfx::Quaternion']]],
+ ['fromeulerangleszyx_77',['FromEulerAnglesZYX',['../classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18',1,'mingfx::Quaternion']]],
+ ['fromrowmajorelements_78',['FromRowMajorElements',['../classmingfx_1_1_matrix4.html#add98bfa1cf6a10dbae0e8ae8defe728b',1,'mingfx::Matrix4']]],
+ ['frustum_79',['Frustum',['../classmingfx_1_1_matrix4.html#a8e2f7b50cd2c8853e007829df9863722',1,'mingfx::Matrix4']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_6.html b/dev/MinGfx/docs/html/search/all_6.html
new file mode 100644
index 0000000..f1e516d
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_6.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_6.js b/dev/MinGfx/docs/html/search/all_6.js
new file mode 100644
index 0000000..cdf66e4
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_6.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['gfxmath_80',['GfxMath',['../classmingfx_1_1_gfx_math.html',1,'mingfx']]],
+ ['gfxmath_2eh_81',['gfxmath.h',['../gfxmath_8h.html',1,'']]],
+ ['graphics_5fapp_2eh_82',['graphics_app.h',['../graphics__app_8h.html',1,'']]],
+ ['graphicsapp_83',['GraphicsApp',['../classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b',1,'mingfx::GraphicsApp::GraphicsApp()'],['../classmingfx_1_1_graphics_app.html',1,'mingfx::GraphicsApp']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_7.html b/dev/MinGfx/docs/html/search/all_7.html
new file mode 100644
index 0000000..8ddbf6c
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_7.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_7.js b/dev/MinGfx/docs/html/search/all_7.js
new file mode 100644
index 0000000..90ad431
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_7.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+ ['h_84',['h',['../structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398',1,'stbrp_rect']]],
+ ['h_5falign_85',['h_align',['../classmingfx_1_1_text_shader_1_1_text_format.html#acde55d28b0446e788e6c68b85df83066',1,'mingfx::TextShader::TextFormat']]],
+ ['half_5fpi_86',['HALF_PI',['../classmingfx_1_1_gfx_math.html#ab5ba8ba54257d86dcf95bd2bbeb534c0',1,'mingfx::GfxMath']]],
+ ['height_87',['height',['../structstbrp__context.html#af3715a6f3faecfb4fac8f6ccbb71f9c7',1,'stbrp_context::height()'],['../classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88',1,'mingfx::Texture2D::height()']]],
+ ['heuristic_88',['heuristic',['../structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a',1,'stbrp_context']]],
+ ['horiz_5falign_5fcenter_89',['HORIZ_ALIGN_CENTER',['../classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca5089ab07b80a999b45667e5711cae1f4',1,'mingfx::TextShader']]],
+ ['horiz_5falign_5fleft_90',['HORIZ_ALIGN_LEFT',['../classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca8e6d89d62375493a3cc1fb5dba289f92',1,'mingfx::TextShader']]],
+ ['horiz_5falign_5fright_91',['HORIZ_ALIGN_RIGHT',['../classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca6999f9ad8384a34813e7535baf44f78b',1,'mingfx::TextShader']]],
+ ['horizalign_92',['HorizAlign',['../classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c',1,'mingfx::TextShader']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_8.html b/dev/MinGfx/docs/html/search/all_8.html
new file mode 100644
index 0000000..83c55ae
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_8.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_8.js b/dev/MinGfx/docs/html/search/all_8.js
new file mode 100644
index 0000000..c3a9bd6
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_8.js
@@ -0,0 +1,28 @@
+var searchData=
+[
+ ['id_93',['id',['../structstbrp__rect.html#a92da8626bc99df041c0c3bfd01c25f7a',1,'stbrp_rect']]],
+ ['ilerp_94',['iLerp',['../classmingfx_1_1_gfx_math.html#af255bde64498e9b55be466abeea97f4d',1,'mingfx::GfxMath']]],
+ ['init_95',['Init',['../classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3',1,'mingfx::DefaultShader::Init()'],['../classmingfx_1_1_text_shader.html#ad60a8b572adc30dad47e2d163dc603a3',1,'mingfx::TextShader::Init()']]],
+ ['init_5fmode_96',['init_mode',['../structstbrp__context.html#a007509feee322404083034e4c2d3dc5d',1,'stbrp_context']]],
+ ['initfrombytes_97',['InitFromBytes',['../classmingfx_1_1_texture2_d.html#aba57b01065096fe9f6483e8f68622944',1,'mingfx::Texture2D']]],
+ ['initfromfile_98',['InitFromFile',['../classmingfx_1_1_texture2_d.html#a8eded044ccdf9bd3e1e5bcfe74526bdc',1,'mingfx::Texture2D']]],
+ ['initfromfloats_99',['InitFromFloats',['../classmingfx_1_1_texture2_d.html#aee8a0aad1795680cb840ffcf544ed7b8',1,'mingfx::Texture2D']]],
+ ['initgraphicscontext_100',['InitGraphicsContext',['../classmingfx_1_1_graphics_app.html#a04beb462aa04371dc86d807838f999e1',1,'mingfx::GraphicsApp']]],
+ ['initialized_101',['initialized',['../classmingfx_1_1_shader_program.html#a2eddd93e446ad2079d1c57676655ffbe',1,'mingfx::ShaderProgram::initialized()'],['../classmingfx_1_1_texture2_d.html#a15d5c319cf7e012e703668f4d4e7be87',1,'mingfx::Texture2D::initialized()']]],
+ ['initnanogui_102',['InitNanoGUI',['../classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a',1,'mingfx::GraphicsApp']]],
+ ['initopengl_103',['InitOpenGL',['../classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3',1,'mingfx::GraphicsApp']]],
+ ['installation_20guide_104',['Installation Guide',['../installation.html',1,'']]],
+ ['installation_2emd_105',['installation.md',['../installation_8md.html',1,'']]],
+ ['intersectaabb_106',['IntersectAABB',['../classmingfx_1_1_ray.html#a57d3ee10518ed361ae02d9cbdef842b7',1,'mingfx::Ray']]],
+ ['intersectandreturnuserdata_107',['IntersectAndReturnUserData',['../classmingfx_1_1_b_v_h.html#afad54f50a29e8b3aace6cdec5c792c56',1,'mingfx::BVH']]],
+ ['intersectmesh_108',['IntersectMesh',['../classmingfx_1_1_ray.html#a79caa1df0839d13339575d3d5527ae6f',1,'mingfx::Ray']]],
+ ['intersectplane_109',['IntersectPlane',['../classmingfx_1_1_ray.html#a8707604031eb9437c449345d85d69d24',1,'mingfx::Ray']]],
+ ['intersectquad_110',['IntersectQuad',['../classmingfx_1_1_ray.html#a37689523a0b73d3d3288ce60bdcb7ae3',1,'mingfx::Ray']]],
+ ['intersectsphere_111',['IntersectSphere',['../classmingfx_1_1_ray.html#a970c7dbc19167be625967fabfb39b4ff',1,'mingfx::Ray']]],
+ ['intersecttriangle_112',['IntersectTriangle',['../classmingfx_1_1_ray.html#a1a6130616c4e4eebe9d09181b0f8b734',1,'mingfx::Ray']]],
+ ['inverse_113',['Inverse',['../classmingfx_1_1_matrix4.html#ab3f360906e15730eee621826b5f0bbc5',1,'mingfx::Matrix4']]],
+ ['iskeydown_114',['IsKeyDown',['../classmingfx_1_1_graphics_app.html#a60688614e5dfeaabf57f8825cdaa08ac',1,'mingfx::GraphicsApp']]],
+ ['isleftmousedown_115',['IsLeftMouseDown',['../classmingfx_1_1_graphics_app.html#a5b78d79192180a6ef5271d2a2b2d1cc7',1,'mingfx::GraphicsApp']]],
+ ['ismiddlemousedown_116',['IsMiddleMouseDown',['../classmingfx_1_1_graphics_app.html#a941f7598400073bfa93aa194a3773434',1,'mingfx::GraphicsApp']]],
+ ['isrightmousedown_117',['IsRightMouseDown',['../classmingfx_1_1_graphics_app.html#a4aa30e3d33731178a9162454a81be08d',1,'mingfx::GraphicsApp']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_9.html b/dev/MinGfx/docs/html/search/all_9.html
new file mode 100644
index 0000000..1e263c1
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_9.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_9.js b/dev/MinGfx/docs/html/search/all_9.js
new file mode 100644
index 0000000..5ca1017
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_9.js
@@ -0,0 +1,16 @@
+var searchData=
+[
+ ['length_118',['Length',['../classmingfx_1_1_quaternion.html#af6527ae19f31be2b265b8b8c4b34b77a',1,'mingfx::Quaternion::Length()'],['../classmingfx_1_1_ray.html#a3c926e2da6dfd1b0a435577617eae984',1,'mingfx::Ray::Length()'],['../classmingfx_1_1_vector2.html#a71b90903d00cdc318ea42f593db6dbb9',1,'mingfx::Vector2::Length()'],['../classmingfx_1_1_vector3.html#a7633dc1625b1f2e6b381438e896b45a3',1,'mingfx::Vector3::Length()']]],
+ ['lerp_119',['Lerp',['../classmingfx_1_1_color.html#abdec9bbfdd82ed75afc45b103c8bbcf4',1,'mingfx::Color::Lerp(const Color &amp;b, float alpha) const'],['../classmingfx_1_1_color.html#a883787431fef36c06c724c3b9ed25363',1,'mingfx::Color::Lerp(const Color &amp;a, const Color &amp;b, float alpha)'],['../classmingfx_1_1_gfx_math.html#ace452fb6b86eb638897b474e9dd51647',1,'mingfx::GfxMath::Lerp()'],['../classmingfx_1_1_point2.html#a900567ad5e3c0e6de217b52167c49fd6',1,'mingfx::Point2::Lerp(const Point2 &amp;b, float alpha) const'],['../classmingfx_1_1_point2.html#a680648ae01c549c48f7a3d5d75d8791e',1,'mingfx::Point2::Lerp(const Point2 &amp;a, const Point2 &amp;b, float alpha)'],['../classmingfx_1_1_point3.html#a228a1f3754b8ee82b9bb148ce183fc5b',1,'mingfx::Point3::Lerp(const Point3 &amp;b, float alpha) const'],['../classmingfx_1_1_point3.html#a206691c31872e537eefbf897603dba74',1,'mingfx::Point3::Lerp(const Point3 &amp;a, const Point3 &amp;b, float alpha)'],['../classmingfx_1_1_vector2.html#a5813ffa3c185551eec1927e1daa4cb17',1,'mingfx::Vector2::Lerp(const Vector2 &amp;b, float alpha) const'],['../classmingfx_1_1_vector2.html#ac332b5f01b3357b85e6d279fb059d561',1,'mingfx::Vector2::Lerp(const Vector2 &amp;a, const Vector2 &amp;b, float alpha)'],['../classmingfx_1_1_vector3.html#a8dafc21c64a4964bac27519972d909b6',1,'mingfx::Vector3::Lerp(const Vector3 &amp;b, float alpha) const'],['../classmingfx_1_1_vector3.html#a489b042bedf8fa329ac05fe905ca1c6f',1,'mingfx::Vector3::Lerp(const Vector3 &amp;a, const Vector3 &amp;b, float alpha)']]],
+ ['light_120',['light',['../classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316',1,'mingfx::DefaultShader']]],
+ ['lightproperties_121',['LightProperties',['../classmingfx_1_1_default_shader_1_1_light_properties.html#a582ceee332260b06cbf2ec607257aba3',1,'mingfx::DefaultShader::LightProperties::LightProperties()'],['../classmingfx_1_1_default_shader_1_1_light_properties.html',1,'mingfx::DefaultShader::LightProperties']]],
+ ['line_5floop_122',['LINE_LOOP',['../classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603a8e0df0247f66bd2cac06f16abb562134',1,'mingfx::QuickShapes']]],
+ ['line_5fstrip_123',['LINE_STRIP',['../classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603ae64a4d2159ed46d077e21a505575c814',1,'mingfx::QuickShapes']]],
+ ['lines_124',['LINES',['../classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603ae585142391f356c60bcfe68279ec2727',1,'mingfx::QuickShapes']]],
+ ['linestype_125',['LinesType',['../classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603',1,'mingfx::QuickShapes']]],
+ ['linkprogram_126',['LinkProgram',['../classmingfx_1_1_shader_program.html#ad14c3a9a4ee1eef39f933bc46260c794',1,'mingfx::ShaderProgram']]],
+ ['loadfromobj_127',['LoadFromOBJ',['../classmingfx_1_1_mesh.html#a8d05faf18ef8d170fc3c2a343075823f',1,'mingfx::Mesh']]],
+ ['look_128',['look',['../classmingfx_1_1_craft_cam.html#a2c7546bccfbf986eb9cd0a2784f74859',1,'mingfx::CraftCam::look()'],['../classmingfx_1_1_uni_cam.html#a8363576bf0f85c74d80ced697bd73d40',1,'mingfx::UniCam::look()']]],
+ ['look_5fscale_129',['look_scale',['../classmingfx_1_1_craft_cam.html#a96ba4a36029ca8234576cbf2791c5ccb',1,'mingfx::CraftCam']]],
+ ['lookat_130',['LookAt',['../classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de',1,'mingfx::Matrix4']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_a.html b/dev/MinGfx/docs/html/search/all_a.html
new file mode 100644
index 0000000..3a6cac1
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_a.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_a.js b/dev/MinGfx/docs/html/search/all_a.js
new file mode 100644
index 0000000..fad4911
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_a.js
@@ -0,0 +1,22 @@
+var searchData=
+[
+ ['mainpage_2emd_131',['mainpage.md',['../mainpage_8md.html',1,'']]],
+ ['material_132',['material',['../classmingfx_1_1_quick_shapes.html#ac8b702a25296cfea15eef1e185333272',1,'mingfx::QuickShapes']]],
+ ['materialproperties_133',['MaterialProperties',['../classmingfx_1_1_default_shader_1_1_material_properties.html#aa24361a9c6eb0a87355d0ad00e47dd96',1,'mingfx::DefaultShader::MaterialProperties::MaterialProperties()'],['../classmingfx_1_1_default_shader_1_1_material_properties.html',1,'mingfx::DefaultShader::MaterialProperties']]],
+ ['matrix4_134',['Matrix4',['../classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22',1,'mingfx::Matrix4::Matrix4()'],['../classmingfx_1_1_matrix4.html#a09a366a3ef940ff355f8d5c521baa57d',1,'mingfx::Matrix4::Matrix4(const float *a)'],['../classmingfx_1_1_matrix4.html#a0abaeb690794c4a55e74c9b5fd82d138',1,'mingfx::Matrix4::Matrix4(const std::vector&lt; float &gt; &amp;a)'],['../classmingfx_1_1_matrix4.html#a4bcf311614006c551f57d2b0dcd32d87',1,'mingfx::Matrix4::Matrix4(const Matrix4 &amp;m2)'],['../classmingfx_1_1_matrix4.html',1,'mingfx::Matrix4']]],
+ ['matrix4_2eh_135',['matrix4.h',['../matrix4_8h.html',1,'']]],
+ ['max_136',['max',['../classmingfx_1_1_a_a_b_b.html#abac247fedc82467c6b058ed4fe77d2a4',1,'mingfx::AABB']]],
+ ['max_5flights_137',['MAX_LIGHTS',['../classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24',1,'mingfx::DefaultShader']]],
+ ['mesh_138',['Mesh',['../classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9',1,'mingfx::Mesh::Mesh()'],['../classmingfx_1_1_mesh.html#a76b4977f0a7f156aa8a0027f10dcbdc1',1,'mingfx::Mesh::Mesh(const Mesh &amp;other)'],['../classmingfx_1_1_mesh.html',1,'mingfx::Mesh']]],
+ ['mesh_2eh_139',['mesh.h',['../mesh_8h.html',1,'']]],
+ ['min_140',['min',['../classmingfx_1_1_a_a_b_b.html#a3b46cdd39ffed26b7982d641b53158e6',1,'mingfx::AABB']]],
+ ['mingfx_141',['mingfx',['../namespacemingfx.html',1,'']]],
+ ['mingfx_20toolkit_20documentation_142',['MinGfx Toolkit Documentation',['../index.html',1,'']]],
+ ['mingfx_2eh_143',['mingfx.h',['../mingfx_8h.html',1,'']]],
+ ['mingfx_5fconfig_2eh_144',['mingfx_config.h',['../mingfx__config_8h.html',1,'']]],
+ ['mingfx_5fdata_5fdir_5fbuild_145',['MINGFX_DATA_DIR_BUILD',['../mingfx__config_8h.html#a9ab97d1e09bf7a864495329de5dc7e03',1,'mingfx_config.h']]],
+ ['mingfx_5fdata_5fdir_5finstall_146',['MINGFX_DATA_DIR_INSTALL',['../mingfx__config_8h.html#a1e44357d7f17eb50f842d9e39e55e398',1,'mingfx_config.h']]],
+ ['mingfx_5fmath_5fepsilon_147',['MINGFX_MATH_EPSILON',['../point2_8h.html#a432350d21fbc10d5e65eeeb6859511ea',1,'MINGFX_MATH_EPSILON():&#160;point2.h'],['../point3_8h.html#a432350d21fbc10d5e65eeeb6859511ea',1,'MINGFX_MATH_EPSILON():&#160;point3.h']]],
+ ['mingfx_5fshaders_5fdir_5fbuild_148',['MINGFX_SHADERS_DIR_BUILD',['../mingfx__config_8h.html#a1908456b5481e0dbbe2b8252fa71d23f',1,'mingfx_config.h']]],
+ ['mingfx_5fshaders_5fdir_5finstall_149',['MINGFX_SHADERS_DIR_INSTALL',['../mingfx__config_8h.html#ab431df904057e50ac94550595473f5f4',1,'mingfx_config.h']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_b.html b/dev/MinGfx/docs/html/search/all_b.html
new file mode 100644
index 0000000..130deb4
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_b.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_b.js b/dev/MinGfx/docs/html/search/all_b.js
new file mode 100644
index 0000000..9dd041b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_b.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+ ['native_5ffont_5fsize_150',['native_font_size',['../classmingfx_1_1_text_shader.html#a707b2b36547db78d19139575003c8a0d',1,'mingfx::TextShader']]],
+ ['next_151',['next',['../structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4',1,'stbrp_node']]],
+ ['normalize_152',['Normalize',['../classmingfx_1_1_quaternion.html#a05def5c8eb729037b3d9522711a5c2a2',1,'mingfx::Quaternion::Normalize()'],['../classmingfx_1_1_vector2.html#a632ddd5b06c48fa0f6f39550e91082c0',1,'mingfx::Vector2::Normalize()'],['../classmingfx_1_1_vector2.html#a06d6c283aba957bddc2b9849698838b2',1,'mingfx::Vector2::Normalize(const Vector2 &amp;v)'],['../classmingfx_1_1_vector3.html#a9b8e9ecbe10477adec527842f62d0dca',1,'mingfx::Vector3::Normalize()'],['../classmingfx_1_1_vector3.html#aeff0177e2111139469b60733248fad8d',1,'mingfx::Vector3::Normalize(const Vector3 &amp;v)']]],
+ ['normalizeddevicecoordstopixels_153',['NormalizedDeviceCoordsToPixels',['../classmingfx_1_1_graphics_app.html#a6141ec6adc29572ee99ca26cf90e6248',1,'mingfx::GraphicsApp::NormalizedDeviceCoordsToPixels(const Point2 &amp;pointInNDC)'],['../classmingfx_1_1_graphics_app.html#a45596da36aa3905e7c752826a7fd9f93',1,'mingfx::GraphicsApp::NormalizedDeviceCoordsToPixels(const Vector2 &amp;pointInNDC)']]],
+ ['num_5flights_154',['num_lights',['../classmingfx_1_1_default_shader.html#ac5b779672a983df8aa67c9cbe026e0c2',1,'mingfx::DefaultShader']]],
+ ['num_5fnodes_155',['num_nodes',['../structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58',1,'stbrp_context']]],
+ ['num_5ftriangles_156',['num_triangles',['../classmingfx_1_1_mesh.html#ab3f3779506e15e3888ccbb8b9b572b8f',1,'mingfx::Mesh']]],
+ ['num_5fvertices_157',['num_vertices',['../classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d',1,'mingfx::Mesh']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_c.html b/dev/MinGfx/docs/html/search/all_c.html
new file mode 100644
index 0000000..3dd5af0
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_c.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_c.js b/dev/MinGfx/docs/html/search/all_c.js
new file mode 100644
index 0000000..807da6b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_c.js
@@ -0,0 +1,40 @@
+var searchData=
+[
+ ['onbuttondown_158',['OnButtonDown',['../classmingfx_1_1_uni_cam.html#a85afba6e8792636f3c6ba2433db1c52f',1,'mingfx::UniCam']]],
+ ['onbuttonup_159',['OnButtonUp',['../classmingfx_1_1_uni_cam.html#a2a9431dc3943c8dc485994d88ce2a58a',1,'mingfx::UniCam']]],
+ ['ondrag_160',['OnDrag',['../classmingfx_1_1_uni_cam.html#a33f1b41fcf53ea78ca2b3640902c5bbe',1,'mingfx::UniCam']]],
+ ['one_161',['One',['../classmingfx_1_1_point2.html#a38149d8797bf7406fc34cab0ea5a3ac8',1,'mingfx::Point2::One()'],['../classmingfx_1_1_point3.html#a2cfcbefe652720779e0d7beff1c86ece',1,'mingfx::Point3::One()'],['../classmingfx_1_1_vector2.html#a5b51e62f03e95d6be1262f037aecf0fd',1,'mingfx::Vector2::One()'],['../classmingfx_1_1_vector3.html#af71b12760516a9cc4837ba9e1dee28db',1,'mingfx::Vector3::One()']]],
+ ['onkeydown_162',['OnKeyDown',['../classmingfx_1_1_graphics_app.html#a002560456139e537877d079978db4b01',1,'mingfx::GraphicsApp']]],
+ ['onkeyrepeat_163',['OnKeyRepeat',['../classmingfx_1_1_graphics_app.html#a1d5831953b37fae615fbd1bf527214b0',1,'mingfx::GraphicsApp']]],
+ ['onkeyup_164',['OnKeyUp',['../classmingfx_1_1_graphics_app.html#a8376ef8eb0840b229a2301f995db3f6c',1,'mingfx::GraphicsApp']]],
+ ['onleftmousedown_165',['OnLeftMouseDown',['../classmingfx_1_1_graphics_app.html#ae12d9b192a2167a71e0c103405addb17',1,'mingfx::GraphicsApp']]],
+ ['onleftmousedrag_166',['OnLeftMouseDrag',['../classmingfx_1_1_graphics_app.html#a56d350a8b030998709a51630753d509b',1,'mingfx::GraphicsApp']]],
+ ['onleftmouseup_167',['OnLeftMouseUp',['../classmingfx_1_1_graphics_app.html#a536dbadf0b8a11ef59d7e855ca43f613',1,'mingfx::GraphicsApp']]],
+ ['onmiddlemousedown_168',['OnMiddleMouseDown',['../classmingfx_1_1_graphics_app.html#a588315d5c45490b440a764af2bc5bd48',1,'mingfx::GraphicsApp']]],
+ ['onmiddlemousedrag_169',['OnMiddleMouseDrag',['../classmingfx_1_1_graphics_app.html#ac7628fece754c0ac4875791e19712dc6',1,'mingfx::GraphicsApp']]],
+ ['onmiddlemouseup_170',['OnMiddleMouseUp',['../classmingfx_1_1_graphics_app.html#a378b8a102775eeb01a6da9dd68482d08',1,'mingfx::GraphicsApp']]],
+ ['onmousemove_171',['OnMouseMove',['../classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f',1,'mingfx::GraphicsApp::OnMouseMove()'],['../classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311',1,'mingfx::CraftCam::OnMouseMove()']]],
+ ['onrightmousedown_172',['OnRightMouseDown',['../classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c',1,'mingfx::GraphicsApp']]],
+ ['onrightmousedrag_173',['OnRightMouseDrag',['../classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7',1,'mingfx::GraphicsApp']]],
+ ['onrightmouseup_174',['OnRightMouseUp',['../classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3',1,'mingfx::GraphicsApp']]],
+ ['onspecialkeydown_175',['OnSpecialKeyDown',['../classmingfx_1_1_graphics_app.html#abcf1935e92550bcda311cac62f312952',1,'mingfx::GraphicsApp']]],
+ ['onspecialkeyrepeat_176',['OnSpecialKeyRepeat',['../classmingfx_1_1_graphics_app.html#a8362762489e287edfa59617a6602db22',1,'mingfx::GraphicsApp']]],
+ ['onspecialkeyup_177',['OnSpecialKeyUp',['../classmingfx_1_1_graphics_app.html#a0deb6da45fc0d3980e44556a861c7a14',1,'mingfx::GraphicsApp']]],
+ ['onwindowresize_178',['OnWindowResize',['../classmingfx_1_1_graphics_app.html#adafdc4631db256fefce3c4ffdfd5086a',1,'mingfx::GraphicsApp']]],
+ ['opengl_5fheaders_2eh_179',['opengl_headers.h',['../opengl__headers_8h.html',1,'']]],
+ ['opengl_5fid_180',['opengl_id',['../classmingfx_1_1_texture2_d.html#ad4e0faadfe016e6ee501e66fc0244504',1,'mingfx::Texture2D']]],
+ ['operator_21_3d_181',['operator!=',['../classmingfx_1_1_color.html#acf92f9f413cf11639b73dc0d7d431244',1,'mingfx::Color::operator!=()'],['../classmingfx_1_1_matrix4.html#ab186b0ae1ae669346c0718c2489cd71b',1,'mingfx::Matrix4::operator!=()'],['../classmingfx_1_1_point2.html#a5b99fcf93a0c6d2b247290f5564f8a84',1,'mingfx::Point2::operator!=()'],['../classmingfx_1_1_point3.html#acccf9d3fca27174c18ada3b33209c71e',1,'mingfx::Point3::operator!=()'],['../classmingfx_1_1_quaternion.html#ad72c021d2d1fa543c96ac4a8b360dd2e',1,'mingfx::Quaternion::operator!=()'],['../classmingfx_1_1_ray.html#ab62fa6ea1c20870f67c58401aefe3eff',1,'mingfx::Ray::operator!=()'],['../classmingfx_1_1_vector2.html#a1cf3488f1f14a9bf7f6e1278c1c63cdb',1,'mingfx::Vector2::operator!=()'],['../classmingfx_1_1_vector3.html#ab93acb916c310920b9c011159eaaa016',1,'mingfx::Vector3::operator!=()']]],
+ ['operator_28_29_182',['operator()',['../classmingfx_1_1_matrix4.html#aa324d0cec02c452fb938af28725d5df9',1,'mingfx::Matrix4::operator()(const int row, const int col) const'],['../classmingfx_1_1_matrix4.html#a470bba77b8e3c47de7adaa18046e6096',1,'mingfx::Matrix4::operator()(const int row, const int col)']]],
+ ['operator_2a_183',['operator*',['../namespacemingfx.html#a0a456bccfb238b9644cf21669cf35b8c',1,'mingfx::operator*(const Quaternion &amp;q1, const Quaternion &amp;q2)'],['../namespacemingfx.html#a1af1c07624961984759120b7af7f9ce4',1,'mingfx::operator*(const Matrix4 &amp;m, const Ray &amp;r)'],['../namespacemingfx.html#adb96b0188d1ceda03ed8d297817502c9',1,'mingfx::operator*(const Quaternion &amp;q, const float s)'],['../namespacemingfx.html#a55f694123e83d1649c112e806359d4b6',1,'mingfx::operator*(const float s, const Quaternion &amp;q)'],['../namespacemingfx.html#aa8a18cb8506dee589eaf6883a32e6fb5',1,'mingfx::operator*(const Vector3 &amp;v, const float s)'],['../namespacemingfx.html#a7e3941689c65388690916d00e0d423d4',1,'mingfx::operator*(const float s, const Vector3 &amp;v)'],['../namespacemingfx.html#a8358de6421374fb037e8c51e8f2d5878',1,'mingfx::operator*(const Vector2 &amp;v, const float s)'],['../namespacemingfx.html#a8bc25e621d21323fdd96f2c4a4141432',1,'mingfx::operator*(const float s, const Vector2 &amp;v)'],['../namespacemingfx.html#aadc0e86a31d54469e730669067b102c2',1,'mingfx::operator*(const Matrix4 &amp;m1, const Matrix4 &amp;m2)'],['../namespacemingfx.html#abb2cfd42e696494e4797d8f7e11f6d77',1,'mingfx::operator*(const Matrix4 &amp;m, const Vector3 &amp;v)'],['../namespacemingfx.html#a5b8dabff5d6c9ddcef5e15b0ef807c80',1,'mingfx::operator*(const Matrix4 &amp;m, const Point3 &amp;p)'],['../namespacemingfx.html#a061ff38340cf1aad4612790b0a600aeb',1,'mingfx::operator*(const float &amp;s, const Matrix4 &amp;m)'],['../namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57',1,'mingfx::operator*(const Matrix4 &amp;m, const float &amp;s)']]],
+ ['operator_2b_184',['operator+',['../namespacemingfx.html#ab2083f9992ba509a275db11522f16a2e',1,'mingfx::operator+(const Point2 &amp;p, const Vector2 &amp;v)'],['../namespacemingfx.html#ac71c01d7c300671cb343a24b68a875bf',1,'mingfx::operator+(const Vector2 &amp;v, const Point2 &amp;p)'],['../namespacemingfx.html#ad49375487853a642b3f372c95cff1a96',1,'mingfx::operator+(const Quaternion &amp;q1, const Quaternion &amp;q2)'],['../namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03',1,'mingfx::operator+(const AABB &amp;A, const AABB &amp;B)'],['../classmingfx_1_1_a_a_b_b.html#a60e301aa632dd49eccdc27bab7c6d231',1,'mingfx::AABB::operator+()'],['../namespacemingfx.html#aeeeb04b70f8e8becbcda7a3dc7024c1b',1,'mingfx::operator+(const Vector3 &amp;v1, const Vector3 &amp;v2)'],['../namespacemingfx.html#aadea317107a50ec6847ce01927b61c82',1,'mingfx::operator+(const Point3 &amp;p, const Vector3 &amp;v)'],['../namespacemingfx.html#a4b4428d2cf65ba5226ef4036352d311e',1,'mingfx::operator+(const Vector3 &amp;v, const Point3 &amp;p)'],['../namespacemingfx.html#acdffada748181cc17ec93784f858ff9f',1,'mingfx::operator+(const Vector2 &amp;v1, const Vector2 &amp;v2)']]],
+ ['operator_2d_185',['operator-',['../namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6',1,'mingfx::operator-(const Quaternion &amp;q)'],['../namespacemingfx.html#a61f2d974c78e8884bb64c2759e455101',1,'mingfx::operator-(const Quaternion &amp;q1, const Quaternion &amp;q2)'],['../namespacemingfx.html#a5daeaa383c40eed6f41b2c1b7930499f',1,'mingfx::operator-(const Vector2 &amp;v)'],['../namespacemingfx.html#ae81fac825c0f6eca59cc1a1cc06d63f2',1,'mingfx::operator-(const Point2 &amp;p, const Vector2 &amp;v)'],['../namespacemingfx.html#a128585c0b87e03beda4a660d4e58789b',1,'mingfx::operator-(const Vector2 &amp;v1, const Vector2 &amp;v2)'],['../namespacemingfx.html#ad370bce0bb5b88beb974aad1d44890e8',1,'mingfx::operator-(const Point2 &amp;p1, const Point2 &amp;p2)'],['../namespacemingfx.html#afd07add6169773bae12d40201f8af7db',1,'mingfx::operator-(const Vector3 &amp;v)'],['../namespacemingfx.html#a579b90d99a1d6f794ca44017ded3a8db',1,'mingfx::operator-(const Point3 &amp;p, const Vector3 &amp;v)'],['../namespacemingfx.html#aecdf7f36c4feb04034f1d07c49d5c0e3',1,'mingfx::operator-(const Vector3 &amp;v1, const Vector3 &amp;v2)'],['../namespacemingfx.html#a77d92da8f1a866306518422cd9d2f0af',1,'mingfx::operator-(const Point3 &amp;p1, const Point3 &amp;p2)']]],
+ ['operator_2f_186',['operator/',['../namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed',1,'mingfx::operator/(const Quaternion &amp;q, const float s)'],['../namespacemingfx.html#a79ffb6c38c6c0b68ce1fdb7ae76ea6bd',1,'mingfx::operator/(const Vector2 &amp;v, const float s)'],['../namespacemingfx.html#aa19b1dea0b7aa468950e56044fda328a',1,'mingfx::operator/(const Vector3 &amp;v, const float s)']]],
+ ['operator_3c_3c_187',['operator&lt;&lt;',['../namespacemingfx.html#a6bc967741341f4f318a505d884192906',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Color &amp;c)'],['../namespacemingfx.html#a1584104dea1f0a5636c868b67ddf6b10',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Matrix4 &amp;m)'],['../namespacemingfx.html#a58ddc500b8c3e12f8af4515f258540cb',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Point2 &amp;p)'],['../namespacemingfx.html#a53ce6bc4f4abdd3797d7af47adecbaf6',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Point3 &amp;p)'],['../namespacemingfx.html#ac4b78a682ff8d1ec298e0df7f742658d',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Quaternion &amp;q)'],['../namespacemingfx.html#ad7c839e598b7be6c1b407330dfacc980',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Ray &amp;r)'],['../namespacemingfx.html#acbe43aa24ecedf663c65becf2be282c7',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Vector2 &amp;v)'],['../namespacemingfx.html#a3425c24faf923364cd3a764d50601c52',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Vector3 &amp;v)']]],
+ ['operator_3d_188',['operator=',['../classmingfx_1_1_vector3.html#aa5b1c05c285fad7f2709f6f351a63608',1,'mingfx::Vector3::operator=()'],['../classmingfx_1_1_vector2.html#a28c44a323e5bd1a251dee9e00e2e1769',1,'mingfx::Vector2::operator=()'],['../classmingfx_1_1_quaternion.html#ac5f82b7ed1d620c3c15f57aca028fcdd',1,'mingfx::Quaternion::operator=()'],['../classmingfx_1_1_point3.html#a8e54b18bfaa39f4b7048b85c9ca43c3d',1,'mingfx::Point3::operator=()'],['../classmingfx_1_1_point2.html#afc68153cce7dc528e95cf5ad81c63902',1,'mingfx::Point2::operator=()'],['../classmingfx_1_1_matrix4.html#a9ad8a8bc180ce213956d6d7d3fa19770',1,'mingfx::Matrix4::operator=()'],['../classmingfx_1_1_color.html#ae51a066a9bb018e4f050d9b8cc7f330e',1,'mingfx::Color::operator=()']]],
+ ['operator_3d_3d_189',['operator==',['../classmingfx_1_1_vector2.html#ad7acc2cf4dcd2eca210899c846bb7dfe',1,'mingfx::Vector2::operator==()'],['../classmingfx_1_1_ray.html#a87b07c4f7c9f33189efade7e519b5d9d',1,'mingfx::Ray::operator==()'],['../classmingfx_1_1_quaternion.html#aa89165641485cf9337cd6279df40a403',1,'mingfx::Quaternion::operator==()'],['../classmingfx_1_1_point3.html#ab22d5cc4631f26274ada550c90d39699',1,'mingfx::Point3::operator==()'],['../classmingfx_1_1_point2.html#ae8729260293b993bbf3cb31c0a33edfa',1,'mingfx::Point2::operator==()'],['../classmingfx_1_1_matrix4.html#a9ec2ee167a450cd7b992384e4cc5bb73',1,'mingfx::Matrix4::operator==()'],['../classmingfx_1_1_color.html#a5411077527ff2a12d18ce1ae52688cf0',1,'mingfx::Color::operator==()'],['../classmingfx_1_1_vector3.html#a85486d0a355417fe4b41fa64146c9e98',1,'mingfx::Vector3::operator==()']]],
+ ['operator_3e_3e_190',['operator&gt;&gt;',['../namespacemingfx.html#a256924759a6718882a2b40e17d3e523d',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Point2 &amp;p)'],['../namespacemingfx.html#ad95e9b494b9761895d57e2b698b69afd',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Point3 &amp;p)'],['../namespacemingfx.html#a59fb7a99df5c572849e31065884b2235',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Quaternion &amp;q)'],['../namespacemingfx.html#a0412270963460363fa015b9b4785cc59',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Ray &amp;r)'],['../namespacemingfx.html#ab3f12496d7a5028b71882373d6fa7203',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Vector2 &amp;v)'],['../namespacemingfx.html#a8cc2f52569661416cb2ca67c516b7c93',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Vector3 &amp;v)'],['../namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Color &amp;c)'],['../namespacemingfx.html#a05fc1c0b2b6011283c019242d6a2de74',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Matrix4 &amp;m)']]],
+ ['operator_5b_5d_191',['operator[]',['../classmingfx_1_1_quaternion.html#a548d09ecd25788241d734240c0dd7ea8',1,'mingfx::Quaternion::operator[](const int i) const'],['../classmingfx_1_1_quaternion.html#a40e6587cc0511572297c5507634db7e1',1,'mingfx::Quaternion::operator[](const int i)'],['../classmingfx_1_1_vector2.html#ae1fc0ce3ca1af3d0546af32742e13000',1,'mingfx::Vector2::operator[](const int i) const'],['../classmingfx_1_1_vector2.html#a93acf7f4f150cfe53859e31d90eddd1e',1,'mingfx::Vector2::operator[](const int i)'],['../classmingfx_1_1_vector3.html#aa37b1fc4b1df9f72726d981c08cd0d1b',1,'mingfx::Vector3::operator[]()'],['../classmingfx_1_1_point3.html#a790468d68b6d957b22959f9078f85c3e',1,'mingfx::Point3::operator[]()'],['../classmingfx_1_1_matrix4.html#acd64f0db45e255d61dde4f6fa10a4127',1,'mingfx::Matrix4::operator[]()'],['../classmingfx_1_1_color.html#a474ed028db8b31e359d8bfec50147bcc',1,'mingfx::Color::operator[](const int i)'],['../classmingfx_1_1_color.html#aa879c4f6e90c419a2c121e323ce31500',1,'mingfx::Color::operator[](const int i) const'],['../classmingfx_1_1_vector3.html#abcdda4627b24af879aba38d4fc0e6f71',1,'mingfx::Vector3::operator[]()'],['../classmingfx_1_1_point3.html#a3a586db5b58d5f1fdaddb1e33e84d566',1,'mingfx::Point3::operator[]()'],['../classmingfx_1_1_point2.html#a50f09df619fd226e6dc3ccff452abab3',1,'mingfx::Point2::operator[](const int i)'],['../classmingfx_1_1_point2.html#af4c0cc334dfbfe8e8068156e6da16542',1,'mingfx::Point2::operator[](const int i) const'],['../classmingfx_1_1_matrix4.html#af9b02807d81eac55d66238f246c53656',1,'mingfx::Matrix4::operator[]()']]],
+ ['origin_192',['origin',['../classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe',1,'mingfx::Ray']]],
+ ['origin_193',['Origin',['../classmingfx_1_1_point2.html#a24d7a5121fceba01b46f3ba0f6525630',1,'mingfx::Point2::Origin()'],['../classmingfx_1_1_point3.html#aecb7c3137356cd4470851c54a47c7930',1,'mingfx::Point3::Origin()']]],
+ ['orthonormal_194',['Orthonormal',['../classmingfx_1_1_matrix4.html#a9ad5c85784e84fa0a941361eaaae0250',1,'mingfx::Matrix4']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_d.html b/dev/MinGfx/docs/html/search/all_d.html
new file mode 100644
index 0000000..af7f2f0
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_d.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_d.js b/dev/MinGfx/docs/html/search/all_d.js
new file mode 100644
index 0000000..06660c9
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_d.js
@@ -0,0 +1,14 @@
+var searchData=
+[
+ ['perspective_195',['Perspective',['../classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e',1,'mingfx::Matrix4']]],
+ ['pi_196',['PI',['../classmingfx_1_1_gfx_math.html#aaa14e60a5f7c158db443f8b6d87958b4',1,'mingfx::GfxMath']]],
+ ['pixel_197',['Pixel',['../classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b',1,'mingfx::Texture2D']]],
+ ['pixelstonormalizeddevicecoords_198',['PixelsToNormalizedDeviceCoords',['../classmingfx_1_1_graphics_app.html#a94b19404e61411ef64c0ddde8ad6c07a',1,'mingfx::GraphicsApp::PixelsToNormalizedDeviceCoords(const Point2 &amp;pointInPixels)'],['../classmingfx_1_1_graphics_app.html#a4e8ac965474de9046448b8811bf25dd1',1,'mingfx::GraphicsApp::PixelsToNormalizedDeviceCoords(const Vector2 &amp;vectorInPixels)']]],
+ ['platform_199',['Platform',['../classmingfx_1_1_platform.html',1,'mingfx']]],
+ ['platform_2eh_200',['platform.h',['../platform_8h.html',1,'']]],
+ ['point2_201',['Point2',['../classmingfx_1_1_point2.html',1,'mingfx::Point2'],['../classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1',1,'mingfx::Point2::Point2()'],['../classmingfx_1_1_point2.html#a716fcff21456f29561ec27118a646483',1,'mingfx::Point2::Point2(float x, float y)'],['../classmingfx_1_1_point2.html#a4ba487a2038ebc78b461b66f1987053f',1,'mingfx::Point2::Point2(float *p)'],['../classmingfx_1_1_point2.html#a97464af92444984e275dca38a3f4eef0',1,'mingfx::Point2::Point2(const Point2 &amp;p)']]],
+ ['point2_2eh_202',['point2.h',['../point2_8h.html',1,'']]],
+ ['point3_203',['Point3',['../classmingfx_1_1_point3.html',1,'mingfx::Point3'],['../classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664',1,'mingfx::Point3::Point3()'],['../classmingfx_1_1_point3.html#a29d113f0fa37fa04a642817c680fe953',1,'mingfx::Point3::Point3(float x, float y, float z)'],['../classmingfx_1_1_point3.html#a062caf579ef643b25129cc35b3dbe756',1,'mingfx::Point3::Point3(float *p)'],['../classmingfx_1_1_point3.html#a23534a1ce3d4466c303b9205bd21cd97',1,'mingfx::Point3::Point3(const Point3 &amp;p)']]],
+ ['point3_2eh_204',['point3.h',['../point3_8h.html',1,'']]],
+ ['position_205',['position',['../classmingfx_1_1_default_shader_1_1_light_properties.html#a160b58a0e70294008b9dac8eb6291d3e',1,'mingfx::DefaultShader::LightProperties']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_e.html b/dev/MinGfx/docs/html/search/all_e.html
new file mode 100644
index 0000000..e25df42
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_e.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_e.js b/dev/MinGfx/docs/html/search/all_e.js
new file mode 100644
index 0000000..9afb687
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_e.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['quaternion_206',['Quaternion',['../classmingfx_1_1_quaternion.html',1,'mingfx::Quaternion'],['../classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165',1,'mingfx::Quaternion::Quaternion()'],['../classmingfx_1_1_quaternion.html#a5c6cbe4fc70e8e4ec23142d0a5a2ba97',1,'mingfx::Quaternion::Quaternion(float qx, float qy, float qz, float qw)'],['../classmingfx_1_1_quaternion.html#a07bb09eb7d0b368ef5e8d9da02fbdad6',1,'mingfx::Quaternion::Quaternion(float *ptr)'],['../classmingfx_1_1_quaternion.html#a0be885a1b3f2d54675c6866ec3578243',1,'mingfx::Quaternion::Quaternion(const Quaternion &amp;other)']]],
+ ['quaternion_2eh_207',['quaternion.h',['../quaternion_8h.html',1,'']]],
+ ['quick_5fshapes_2eh_208',['quick_shapes.h',['../quick__shapes_8h.html',1,'']]],
+ ['quickshapes_209',['QuickShapes',['../classmingfx_1_1_quick_shapes.html',1,'mingfx::QuickShapes'],['../classmingfx_1_1_quick_shapes.html#a5764a0953013ece013bf3e2a72e4afa2',1,'mingfx::QuickShapes::QuickShapes()']]]
+];
diff --git a/dev/MinGfx/docs/html/search/all_f.html b/dev/MinGfx/docs/html/search/all_f.html
new file mode 100644
index 0000000..b23da6c
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_f.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/all_f.js b/dev/MinGfx/docs/html/search/all_f.js
new file mode 100644
index 0000000..2954e71
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/all_f.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+ ['ray_210',['Ray',['../classmingfx_1_1_ray.html',1,'mingfx::Ray'],['../classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda',1,'mingfx::Ray::Ray()'],['../classmingfx_1_1_ray.html#ab38cdd0793b3acfe55fa9ebca5ddebf6',1,'mingfx::Ray::Ray(const Point3 &amp;origin, const Vector3 &amp;direction)']]],
+ ['ray_2eh_211',['ray.h',['../ray_8h.html',1,'']]],
+ ['read_5fcolor_5fdata_212',['read_color_data',['../classmingfx_1_1_mesh.html#ac5fc517fd8ea4cea8459d3f4d5d6ced3',1,'mingfx::Mesh']]],
+ ['read_5fnormal_5fdata_213',['read_normal_data',['../classmingfx_1_1_mesh.html#a439361e454ca63c35f564aed5cd0de65',1,'mingfx::Mesh']]],
+ ['read_5ftex_5fcoords_5fdata_214',['read_tex_coords_data',['../classmingfx_1_1_mesh.html#a51aaa8d6a80af46f22ea9dfecd2f0b31',1,'mingfx::Mesh']]],
+ ['read_5ftriangle_5findices_5fdata_215',['read_triangle_indices_data',['../classmingfx_1_1_mesh.html#a15d79cbc48a6ef72ef1208d734cc2f8a',1,'mingfx::Mesh']]],
+ ['read_5fvertex_5fdata_216',['read_vertex_data',['../classmingfx_1_1_mesh.html#ada9371e85aa0b61df79b26fc880b1863',1,'mingfx::Mesh']]],
+ ['readzvalueatpixel_217',['ReadZValueAtPixel',['../classmingfx_1_1_graphics_app.html#a471951dbf45ffa88027cb92707443646',1,'mingfx::GraphicsApp']]],
+ ['resizewindow_218',['ResizeWindow',['../classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5',1,'mingfx::GraphicsApp']]],
+ ['rotation_219',['Rotation',['../classmingfx_1_1_matrix4.html#acf4abaf4a45826f14b435edf80a8d0e0',1,'mingfx::Matrix4']]],
+ ['rotation_5fscale_220',['rotation_scale',['../classmingfx_1_1_craft_cam.html#a9fe22cc3b933b12674a5b8f1b5c834ac',1,'mingfx::CraftCam']]],
+ ['rotationx_221',['RotationX',['../classmingfx_1_1_matrix4.html#a48615deb30590055c0aa9f207eee7f08',1,'mingfx::Matrix4']]],
+ ['rotationy_222',['RotationY',['../classmingfx_1_1_matrix4.html#aef94f0e9d298a7ba57e0119ef09b71b6',1,'mingfx::Matrix4']]],
+ ['rotationz_223',['RotationZ',['../classmingfx_1_1_matrix4.html#a4bf1dced8875fdc5827b5b8869e9de93',1,'mingfx::Matrix4']]],
+ ['run_224',['Run',['../classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9',1,'mingfx::GraphicsApp']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_0.html b/dev/MinGfx/docs/html/search/classes_0.html
new file mode 100644
index 0000000..af8159e
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_0.js b/dev/MinGfx/docs/html/search/classes_0.js
new file mode 100644
index 0000000..330629d
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['aabb_346',['AABB',['../classmingfx_1_1_a_a_b_b.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_1.html b/dev/MinGfx/docs/html/search/classes_1.html
new file mode 100644
index 0000000..576e916
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_1.js b/dev/MinGfx/docs/html/search/classes_1.js
new file mode 100644
index 0000000..f319bae
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['bvh_347',['BVH',['../classmingfx_1_1_b_v_h.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_2.html b/dev/MinGfx/docs/html/search/classes_2.html
new file mode 100644
index 0000000..956405e
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_2.js b/dev/MinGfx/docs/html/search/classes_2.js
new file mode 100644
index 0000000..df49d92
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_2.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['color_348',['Color',['../classmingfx_1_1_color.html',1,'mingfx']]],
+ ['craftcam_349',['CraftCam',['../classmingfx_1_1_craft_cam.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_3.html b/dev/MinGfx/docs/html/search/classes_3.html
new file mode 100644
index 0000000..d33343b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_3.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_3.js b/dev/MinGfx/docs/html/search/classes_3.js
new file mode 100644
index 0000000..7bdfefb
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_3.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['defaultshader_350',['DefaultShader',['../classmingfx_1_1_default_shader.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_4.html b/dev/MinGfx/docs/html/search/classes_4.html
new file mode 100644
index 0000000..8430b07
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_4.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_4.js b/dev/MinGfx/docs/html/search/classes_4.js
new file mode 100644
index 0000000..11c5783
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_4.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['gfxmath_351',['GfxMath',['../classmingfx_1_1_gfx_math.html',1,'mingfx']]],
+ ['graphicsapp_352',['GraphicsApp',['../classmingfx_1_1_graphics_app.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_5.html b/dev/MinGfx/docs/html/search/classes_5.html
new file mode 100644
index 0000000..c2f1b76
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_5.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_5.js b/dev/MinGfx/docs/html/search/classes_5.js
new file mode 100644
index 0000000..eac06bc
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_5.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['lightproperties_353',['LightProperties',['../classmingfx_1_1_default_shader_1_1_light_properties.html',1,'mingfx::DefaultShader']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_6.html b/dev/MinGfx/docs/html/search/classes_6.html
new file mode 100644
index 0000000..e39847c
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_6.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_6.js b/dev/MinGfx/docs/html/search/classes_6.js
new file mode 100644
index 0000000..48928b8
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_6.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['materialproperties_354',['MaterialProperties',['../classmingfx_1_1_default_shader_1_1_material_properties.html',1,'mingfx::DefaultShader']]],
+ ['matrix4_355',['Matrix4',['../classmingfx_1_1_matrix4.html',1,'mingfx']]],
+ ['mesh_356',['Mesh',['../classmingfx_1_1_mesh.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_7.html b/dev/MinGfx/docs/html/search/classes_7.html
new file mode 100644
index 0000000..a2c4d1a
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_7.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_7.js b/dev/MinGfx/docs/html/search/classes_7.js
new file mode 100644
index 0000000..89c36aa
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_7.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['platform_357',['Platform',['../classmingfx_1_1_platform.html',1,'mingfx']]],
+ ['point2_358',['Point2',['../classmingfx_1_1_point2.html',1,'mingfx']]],
+ ['point3_359',['Point3',['../classmingfx_1_1_point3.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_8.html b/dev/MinGfx/docs/html/search/classes_8.html
new file mode 100644
index 0000000..17003e4
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_8.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_8.js b/dev/MinGfx/docs/html/search/classes_8.js
new file mode 100644
index 0000000..fe32295
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_8.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['quaternion_360',['Quaternion',['../classmingfx_1_1_quaternion.html',1,'mingfx']]],
+ ['quickshapes_361',['QuickShapes',['../classmingfx_1_1_quick_shapes.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_9.html b/dev/MinGfx/docs/html/search/classes_9.html
new file mode 100644
index 0000000..b8afa8c
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_9.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_9.js b/dev/MinGfx/docs/html/search/classes_9.js
new file mode 100644
index 0000000..0676d34
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_9.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['ray_362',['Ray',['../classmingfx_1_1_ray.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_a.html b/dev/MinGfx/docs/html/search/classes_a.html
new file mode 100644
index 0000000..6788af2
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_a.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_a.js b/dev/MinGfx/docs/html/search/classes_a.js
new file mode 100644
index 0000000..4afb3be
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_a.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['shaderprogram_363',['ShaderProgram',['../classmingfx_1_1_shader_program.html',1,'mingfx']]],
+ ['stbrp_5fcontext_364',['stbrp_context',['../structstbrp__context.html',1,'']]],
+ ['stbrp_5fnode_365',['stbrp_node',['../structstbrp__node.html',1,'']]],
+ ['stbrp_5frect_366',['stbrp_rect',['../structstbrp__rect.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_b.html b/dev/MinGfx/docs/html/search/classes_b.html
new file mode 100644
index 0000000..3fcb498
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_b.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_b.js b/dev/MinGfx/docs/html/search/classes_b.js
new file mode 100644
index 0000000..ca7a3e8
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_b.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['textformat_367',['TextFormat',['../classmingfx_1_1_text_shader_1_1_text_format.html',1,'mingfx::TextShader']]],
+ ['textshader_368',['TextShader',['../classmingfx_1_1_text_shader.html',1,'mingfx']]],
+ ['texture2d_369',['Texture2D',['../classmingfx_1_1_texture2_d.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_c.html b/dev/MinGfx/docs/html/search/classes_c.html
new file mode 100644
index 0000000..2f7b1f3
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_c.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_c.js b/dev/MinGfx/docs/html/search/classes_c.js
new file mode 100644
index 0000000..dda4c58
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_c.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['unicam_370',['UniCam',['../classmingfx_1_1_uni_cam.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/classes_d.html b/dev/MinGfx/docs/html/search/classes_d.html
new file mode 100644
index 0000000..f9011e7
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_d.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/classes_d.js b/dev/MinGfx/docs/html/search/classes_d.js
new file mode 100644
index 0000000..85c37ae
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/classes_d.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['vector2_371',['Vector2',['../classmingfx_1_1_vector2.html',1,'mingfx']]],
+ ['vector3_372',['Vector3',['../classmingfx_1_1_vector3.html',1,'mingfx']]]
+];
diff --git a/dev/MinGfx/docs/html/search/close.svg b/dev/MinGfx/docs/html/search/close.svg
new file mode 100644
index 0000000..a933eea
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/close.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ viewBox="0 0 11 11"
+ height="11"
+ width="11"
+ id="svg2"
+ version="1.1">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <path
+ id="path12"
+ d="M 5.5 0.5 A 5 5 0 0 0 0.5 5.5 A 5 5 0 0 0 5.5 10.5 A 5 5 0 0 0 10.5 5.5 A 5 5 0 0 0 5.5 0.5 z M 3.5820312 3 A 0.58291923 0.58291923 0 0 1 4 3.1757812 L 5.5 4.6757812 L 7 3.1757812 A 0.58291923 0.58291923 0 0 1 7.4003906 3 A 0.58291923 0.58291923 0 0 1 7.8242188 4 L 6.3242188 5.5 L 7.8242188 7 A 0.58291923 0.58291923 0 1 1 7 7.8242188 L 5.5 6.3242188 L 4 7.8242188 A 0.58291923 0.58291923 0 1 1 3.1757812 7 L 4.6757812 5.5 L 3.1757812 4 A 0.58291923 0.58291923 0 0 1 3.5820312 3 z "
+ style="stroke-width:1.09870648;fill:#bababa;fill-opacity:1" />
+</svg>
diff --git a/dev/MinGfx/docs/html/search/defines_0.html b/dev/MinGfx/docs/html/search/defines_0.html
new file mode 100644
index 0000000..15cc3de
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/defines_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/defines_0.js b/dev/MinGfx/docs/html/search/defines_0.js
new file mode 100644
index 0000000..9072bee
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/defines_0.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['mingfx_5fdata_5fdir_5fbuild_712',['MINGFX_DATA_DIR_BUILD',['../mingfx__config_8h.html#a9ab97d1e09bf7a864495329de5dc7e03',1,'mingfx_config.h']]],
+ ['mingfx_5fdata_5fdir_5finstall_713',['MINGFX_DATA_DIR_INSTALL',['../mingfx__config_8h.html#a1e44357d7f17eb50f842d9e39e55e398',1,'mingfx_config.h']]],
+ ['mingfx_5fmath_5fepsilon_714',['MINGFX_MATH_EPSILON',['../point2_8h.html#a432350d21fbc10d5e65eeeb6859511ea',1,'MINGFX_MATH_EPSILON():&#160;point2.h'],['../point3_8h.html#a432350d21fbc10d5e65eeeb6859511ea',1,'MINGFX_MATH_EPSILON():&#160;point3.h']]],
+ ['mingfx_5fshaders_5fdir_5fbuild_715',['MINGFX_SHADERS_DIR_BUILD',['../mingfx__config_8h.html#a1908456b5481e0dbbe2b8252fa71d23f',1,'mingfx_config.h']]],
+ ['mingfx_5fshaders_5fdir_5finstall_716',['MINGFX_SHADERS_DIR_INSTALL',['../mingfx__config_8h.html#ab431df904057e50ac94550595473f5f4',1,'mingfx_config.h']]]
+];
diff --git a/dev/MinGfx/docs/html/search/defines_1.html b/dev/MinGfx/docs/html/search/defines_1.html
new file mode 100644
index 0000000..c49009c
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/defines_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/defines_1.js b/dev/MinGfx/docs/html/search/defines_1.js
new file mode 100644
index 0000000..44f55f6
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/defines_1.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['stb_5frect_5fpack_5fversion_717',['STB_RECT_PACK_VERSION',['../stb__rect__pack_8h.html#af2f15dfcc6ad60b1df4f5902e2cc25ce',1,'stb_rect_pack.h']]],
+ ['stbrp_5fdef_718',['STBRP_DEF',['../stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753',1,'stb_rect_pack.h']]]
+];
diff --git a/dev/MinGfx/docs/html/search/enums_0.html b/dev/MinGfx/docs/html/search/enums_0.html
new file mode 100644
index 0000000..141fff5
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enums_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/enums_0.js b/dev/MinGfx/docs/html/search/enums_0.js
new file mode 100644
index 0000000..f6e19fe
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enums_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['horizalign_695',['HorizAlign',['../classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c',1,'mingfx::TextShader']]]
+];
diff --git a/dev/MinGfx/docs/html/search/enums_1.html b/dev/MinGfx/docs/html/search/enums_1.html
new file mode 100644
index 0000000..d29f3b1
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enums_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/enums_1.js b/dev/MinGfx/docs/html/search/enums_1.js
new file mode 100644
index 0000000..875d520
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enums_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['linestype_696',['LinesType',['../classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603',1,'mingfx::QuickShapes']]]
+];
diff --git a/dev/MinGfx/docs/html/search/enums_2.html b/dev/MinGfx/docs/html/search/enums_2.html
new file mode 100644
index 0000000..59aadf2
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enums_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/enums_2.js b/dev/MinGfx/docs/html/search/enums_2.js
new file mode 100644
index 0000000..5007801
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enums_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['vertalign_697',['VertAlign',['../classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a',1,'mingfx::TextShader']]]
+];
diff --git a/dev/MinGfx/docs/html/search/enumvalues_0.html b/dev/MinGfx/docs/html/search/enumvalues_0.html
new file mode 100644
index 0000000..0d131d9
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enumvalues_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enumvalues_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/enumvalues_0.js b/dev/MinGfx/docs/html/search/enumvalues_0.js
new file mode 100644
index 0000000..4b0ef18
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enumvalues_0.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['horiz_5falign_5fcenter_698',['HORIZ_ALIGN_CENTER',['../classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca5089ab07b80a999b45667e5711cae1f4',1,'mingfx::TextShader']]],
+ ['horiz_5falign_5fleft_699',['HORIZ_ALIGN_LEFT',['../classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca8e6d89d62375493a3cc1fb5dba289f92',1,'mingfx::TextShader']]],
+ ['horiz_5falign_5fright_700',['HORIZ_ALIGN_RIGHT',['../classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca6999f9ad8384a34813e7535baf44f78b',1,'mingfx::TextShader']]]
+];
diff --git a/dev/MinGfx/docs/html/search/enumvalues_1.html b/dev/MinGfx/docs/html/search/enumvalues_1.html
new file mode 100644
index 0000000..cd9187a
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enumvalues_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enumvalues_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/enumvalues_1.js b/dev/MinGfx/docs/html/search/enumvalues_1.js
new file mode 100644
index 0000000..9c7ccc3
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enumvalues_1.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['line_5floop_701',['LINE_LOOP',['../classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603a8e0df0247f66bd2cac06f16abb562134',1,'mingfx::QuickShapes']]],
+ ['line_5fstrip_702',['LINE_STRIP',['../classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603ae64a4d2159ed46d077e21a505575c814',1,'mingfx::QuickShapes']]],
+ ['lines_703',['LINES',['../classmingfx_1_1_quick_shapes.html#aaea35a34a9495a9ab25cd9aa32a91603ae585142391f356c60bcfe68279ec2727',1,'mingfx::QuickShapes']]]
+];
diff --git a/dev/MinGfx/docs/html/search/enumvalues_2.html b/dev/MinGfx/docs/html/search/enumvalues_2.html
new file mode 100644
index 0000000..2b95d92
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enumvalues_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enumvalues_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/enumvalues_2.js b/dev/MinGfx/docs/html/search/enumvalues_2.js
new file mode 100644
index 0000000..467d394
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enumvalues_2.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['stbrp_5fheuristic_5fskyline_5fbf_5fsortheight_704',['STBRP_HEURISTIC_Skyline_BF_sortHeight',['../stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c',1,'stb_rect_pack.h']]],
+ ['stbrp_5fheuristic_5fskyline_5fbl_5fsortheight_705',['STBRP_HEURISTIC_Skyline_BL_sortHeight',['../stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a',1,'stb_rect_pack.h']]],
+ ['stbrp_5fheuristic_5fskyline_5fdefault_706',['STBRP_HEURISTIC_Skyline_default',['../stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525',1,'stb_rect_pack.h']]]
+];
diff --git a/dev/MinGfx/docs/html/search/enumvalues_3.html b/dev/MinGfx/docs/html/search/enumvalues_3.html
new file mode 100644
index 0000000..bc0ac8a
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enumvalues_3.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enumvalues_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/enumvalues_3.js b/dev/MinGfx/docs/html/search/enumvalues_3.js
new file mode 100644
index 0000000..b59c94c
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/enumvalues_3.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['vert_5falign_5fbaseline_707',['VERT_ALIGN_BASELINE',['../classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa0400d0d77ea6770b313eedaf36fe71bb',1,'mingfx::TextShader']]],
+ ['vert_5falign_5fbottom_708',['VERT_ALIGN_BOTTOM',['../classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa080e12cacc0f01b361c8b93c73dd2e28',1,'mingfx::TextShader']]],
+ ['vert_5falign_5fcenter_709',['VERT_ALIGN_CENTER',['../classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aac49ae9c9553284e44f90228b9ce647af',1,'mingfx::TextShader']]],
+ ['vert_5falign_5ftop_710',['VERT_ALIGN_TOP',['../classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa970e4fcd7c426e6cd49709119fba6e04',1,'mingfx::TextShader']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_0.html b/dev/MinGfx/docs/html/search/files_0.html
new file mode 100644
index 0000000..9498842
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_0.js b/dev/MinGfx/docs/html/search/files_0.js
new file mode 100644
index 0000000..aaf51ac
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_0.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['aabb_2eh_374',['aabb.h',['../aabb_8h.html',1,'']]],
+ ['api_2emd_375',['api.md',['../api_8md.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_1.html b/dev/MinGfx/docs/html/search/files_1.html
new file mode 100644
index 0000000..7050ef4
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_1.js b/dev/MinGfx/docs/html/search/files_1.js
new file mode 100644
index 0000000..8409ba0
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['bvh_2eh_376',['bvh.h',['../bvh_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_2.html b/dev/MinGfx/docs/html/search/files_2.html
new file mode 100644
index 0000000..497cdf5
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_2.js b/dev/MinGfx/docs/html/search/files_2.js
new file mode 100644
index 0000000..bd7e345
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_2.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['color_2eh_377',['color.h',['../color_8h.html',1,'']]],
+ ['craft_5fcam_2eh_378',['craft_cam.h',['../craft__cam_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_3.html b/dev/MinGfx/docs/html/search/files_3.html
new file mode 100644
index 0000000..1ba106b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_3.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_3.js b/dev/MinGfx/docs/html/search/files_3.js
new file mode 100644
index 0000000..aa9d1d0
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_3.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['default_5fshader_2eh_379',['default_shader.h',['../default__shader_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_4.html b/dev/MinGfx/docs/html/search/files_4.html
new file mode 100644
index 0000000..753b7b1
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_4.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_4.js b/dev/MinGfx/docs/html/search/files_4.js
new file mode 100644
index 0000000..b3b80f3
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_4.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['gfxmath_2eh_380',['gfxmath.h',['../gfxmath_8h.html',1,'']]],
+ ['graphics_5fapp_2eh_381',['graphics_app.h',['../graphics__app_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_5.html b/dev/MinGfx/docs/html/search/files_5.html
new file mode 100644
index 0000000..7b6affd
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_5.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_5.js b/dev/MinGfx/docs/html/search/files_5.js
new file mode 100644
index 0000000..54b7dd2
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_5.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['installation_2emd_382',['installation.md',['../installation_8md.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_6.html b/dev/MinGfx/docs/html/search/files_6.html
new file mode 100644
index 0000000..802ebf7
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_6.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_6.js b/dev/MinGfx/docs/html/search/files_6.js
new file mode 100644
index 0000000..5763269
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_6.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['mainpage_2emd_383',['mainpage.md',['../mainpage_8md.html',1,'']]],
+ ['matrix4_2eh_384',['matrix4.h',['../matrix4_8h.html',1,'']]],
+ ['mesh_2eh_385',['mesh.h',['../mesh_8h.html',1,'']]],
+ ['mingfx_2eh_386',['mingfx.h',['../mingfx_8h.html',1,'']]],
+ ['mingfx_5fconfig_2eh_387',['mingfx_config.h',['../mingfx__config_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_7.html b/dev/MinGfx/docs/html/search/files_7.html
new file mode 100644
index 0000000..365e648
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_7.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_7.js b/dev/MinGfx/docs/html/search/files_7.js
new file mode 100644
index 0000000..eb72b51
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_7.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['opengl_5fheaders_2eh_388',['opengl_headers.h',['../opengl__headers_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_8.html b/dev/MinGfx/docs/html/search/files_8.html
new file mode 100644
index 0000000..3df0f2f
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_8.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_8.js b/dev/MinGfx/docs/html/search/files_8.js
new file mode 100644
index 0000000..86d1516
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_8.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['platform_2eh_389',['platform.h',['../platform_8h.html',1,'']]],
+ ['point2_2eh_390',['point2.h',['../point2_8h.html',1,'']]],
+ ['point3_2eh_391',['point3.h',['../point3_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_9.html b/dev/MinGfx/docs/html/search/files_9.html
new file mode 100644
index 0000000..52f8b6c
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_9.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_9.js b/dev/MinGfx/docs/html/search/files_9.js
new file mode 100644
index 0000000..2b14d84
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_9.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['quaternion_2eh_392',['quaternion.h',['../quaternion_8h.html',1,'']]],
+ ['quick_5fshapes_2eh_393',['quick_shapes.h',['../quick__shapes_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_a.html b/dev/MinGfx/docs/html/search/files_a.html
new file mode 100644
index 0000000..11d4c11
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_a.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_a.js b/dev/MinGfx/docs/html/search/files_a.js
new file mode 100644
index 0000000..036951b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_a.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['ray_2eh_394',['ray.h',['../ray_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_b.html b/dev/MinGfx/docs/html/search/files_b.html
new file mode 100644
index 0000000..9fc8343
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_b.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_b.js b/dev/MinGfx/docs/html/search/files_b.js
new file mode 100644
index 0000000..a20ab03
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_b.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['shader_5fprogram_2eh_395',['shader_program.h',['../shader__program_8h.html',1,'']]],
+ ['stb_5frect_5fpack_2eh_396',['stb_rect_pack.h',['../stb__rect__pack_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_c.html b/dev/MinGfx/docs/html/search/files_c.html
new file mode 100644
index 0000000..c266b4c
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_c.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_c.js b/dev/MinGfx/docs/html/search/files_c.js
new file mode 100644
index 0000000..949202b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_c.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['text_5fshader_2eh_397',['text_shader.h',['../text__shader_8h.html',1,'']]],
+ ['texture2d_2eh_398',['texture2d.h',['../texture2d_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_d.html b/dev/MinGfx/docs/html/search/files_d.html
new file mode 100644
index 0000000..d2ca3c1
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_d.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_d.js b/dev/MinGfx/docs/html/search/files_d.js
new file mode 100644
index 0000000..7d42d13
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_d.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['unicam_2eh_399',['unicam.h',['../unicam_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/files_e.html b/dev/MinGfx/docs/html/search/files_e.html
new file mode 100644
index 0000000..9df4116
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_e.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/files_e.js b/dev/MinGfx/docs/html/search/files_e.js
new file mode 100644
index 0000000..1bfafe1
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/files_e.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['vector2_2eh_400',['vector2.h',['../vector2_8h.html',1,'']]],
+ ['vector3_2eh_401',['vector3.h',['../vector3_8h.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_0.html b/dev/MinGfx/docs/html/search/functions_0.html
new file mode 100644
index 0000000..eb4c501
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_0.js b/dev/MinGfx/docs/html/search/functions_0.js
new file mode 100644
index 0000000..16cad36
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_0.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['aabb_402',['AABB',['../classmingfx_1_1_a_a_b_b.html#af7acb376dbda50fa1d8c30d1b5eb85fb',1,'mingfx::AABB::AABB()'],['../classmingfx_1_1_a_a_b_b.html#a5bf74f4e7f64adae9ea66f213a4012d1',1,'mingfx::AABB::AABB(const Point3 &amp;a)'],['../classmingfx_1_1_a_a_b_b.html#aaa44f815006b66f67da76fd89c02a0cf',1,'mingfx::AABB::AABB(const Point3 &amp;a, const Point3 &amp;b, const Point3 &amp;c)'],['../classmingfx_1_1_a_a_b_b.html#a0f3e7d3b4012e25018ad4c51edafd4f8',1,'mingfx::AABB::AABB(const Vector3 &amp;extents)'],['../classmingfx_1_1_a_a_b_b.html#a7c47fca94d56a2845ca7729d580ee7d1',1,'mingfx::AABB::AABB(const Point3 &amp;center, const Vector3 &amp;extents)'],['../classmingfx_1_1_a_a_b_b.html#a95e244e6e0774c815de6b9434218ee09',1,'mingfx::AABB::AABB(const Mesh &amp;mesh)'],['../classmingfx_1_1_a_a_b_b.html#a2bf325127a89d7dbd5bb082ae69fb5e9',1,'mingfx::AABB::AABB(const Mesh &amp;mesh, unsigned int tri_id)']]],
+ ['addfragmentshaderfromfile_403',['AddFragmentShaderFromFile',['../classmingfx_1_1_shader_program.html#acd94fc12beb85fe57aa80d3b825018b0',1,'mingfx::ShaderProgram']]],
+ ['addfragmentshaderfromsource_404',['AddFragmentShaderFromSource',['../classmingfx_1_1_shader_program.html#a7a3063ec42798c076e1ab0c0e6411e9c',1,'mingfx::ShaderProgram']]],
+ ['addlight_405',['AddLight',['../classmingfx_1_1_default_shader.html#af54a8e489d9fb34cfceb1c07562c6e2c',1,'mingfx::DefaultShader']]],
+ ['addtriangle_406',['AddTriangle',['../classmingfx_1_1_mesh.html#a29eeb2e778704350789033ec4940d55a',1,'mingfx::Mesh']]],
+ ['addvertexshaderfromfile_407',['AddVertexShaderFromFile',['../classmingfx_1_1_shader_program.html#a63ac061271fad9338e922389d4a179e5',1,'mingfx::ShaderProgram']]],
+ ['addvertexshaderfromsource_408',['AddVertexShaderFromSource',['../classmingfx_1_1_shader_program.html#ab5fed4904a59c6e83ebb43aebf4c043d',1,'mingfx::ShaderProgram']]],
+ ['advanceanimation_409',['AdvanceAnimation',['../classmingfx_1_1_uni_cam.html#aab253d966af52ac277ac51194745085c',1,'mingfx::UniCam']]],
+ ['align_410',['Align',['../classmingfx_1_1_matrix4.html#ae61cdabb318a03cd4dae8a1c8ecafa4d',1,'mingfx::Matrix4']]],
+ ['aspect_5fratio_411',['aspect_ratio',['../classmingfx_1_1_graphics_app.html#ac682691ee96ea32037abafd74d144a23',1,'mingfx::GraphicsApp']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_1.html b/dev/MinGfx/docs/html/search/functions_1.html
new file mode 100644
index 0000000..ef4088b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_1.js b/dev/MinGfx/docs/html/search/functions_1.js
new file mode 100644
index 0000000..49f66cb
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_1.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['bindtexture_412',['BindTexture',['../classmingfx_1_1_shader_program.html#a4e5a2659f66f29433b15748f36c61ea2',1,'mingfx::ShaderProgram::BindTexture(const std::string &amp;name, const Texture2D &amp;tex)'],['../classmingfx_1_1_shader_program.html#af81d97c2843278eb40cdcdf8e5d54a96',1,'mingfx::ShaderProgram::BindTexture(const std::string &amp;name, const Texture2D &amp;tex, int texUnit)']]],
+ ['buildbvh_413',['BuildBVH',['../classmingfx_1_1_mesh.html#a8d96c1b5985cd836f2aa2b2994af64c1',1,'mingfx::Mesh']]],
+ ['bvh_414',['BVH',['../classmingfx_1_1_b_v_h.html#af812656193d247be31dd038a8e2fff75',1,'mingfx::BVH']]],
+ ['bvh_5fptr_415',['bvh_ptr',['../classmingfx_1_1_mesh.html#a978b1341d5613d399a68e40c61c57ba4',1,'mingfx::Mesh']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_10.html b/dev/MinGfx/docs/html/search/functions_10.html
new file mode 100644
index 0000000..1bdc125
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_10.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_10.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_10.js b/dev/MinGfx/docs/html/search/functions_10.js
new file mode 100644
index 0000000..f6a91bb
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_10.js
@@ -0,0 +1,37 @@
+var searchData=
+[
+ ['scale_566',['Scale',['../classmingfx_1_1_matrix4.html#a0232a58d20b1da5374cf8c72fb113a4e',1,'mingfx::Matrix4']]],
+ ['screen_567',['screen',['../classmingfx_1_1_graphics_app.html#adc68196c3f03bd0608c41f6e4d7dad16',1,'mingfx::GraphicsApp']]],
+ ['screentodepthplane_568',['ScreenToDepthPlane',['../classmingfx_1_1_gfx_math.html#aaa6af7c0de01fdad46d48d43efb6aa67',1,'mingfx::GfxMath']]],
+ ['screentonearplane_569',['ScreenToNearPlane',['../classmingfx_1_1_gfx_math.html#a2086a2f885f887fb53da8a5adb5860f0',1,'mingfx::GfxMath']]],
+ ['screentoworld_570',['ScreenToWorld',['../classmingfx_1_1_gfx_math.html#a24048d7b688ae46317c3e8de8a701273',1,'mingfx::GfxMath']]],
+ ['set_571',['set',['../classmingfx_1_1_ray.html#a75593293307b4eead15a876bf3597071',1,'mingfx::Ray']]],
+ ['set_5fdefault_5fdepth_572',['set_default_depth',['../classmingfx_1_1_uni_cam.html#a71e0351ac19a18b9c02215a60dc51068',1,'mingfx::UniCam']]],
+ ['set_5ffilter_5fmode_573',['set_filter_mode',['../classmingfx_1_1_texture2_d.html#a4a3b2b550fefdf79f0fb392b04e7b013',1,'mingfx::Texture2D']]],
+ ['set_5flook_5fscale_574',['set_look_scale',['../classmingfx_1_1_craft_cam.html#a15092ae5de6920546e3ce79aeb196f44',1,'mingfx::CraftCam']]],
+ ['set_5frotation_5fscale_575',['set_rotation_scale',['../classmingfx_1_1_craft_cam.html#a352f5a42f6e88d2e599bd5acb42e5831',1,'mingfx::CraftCam']]],
+ ['set_5ftranslation_5fscale_576',['set_translation_scale',['../classmingfx_1_1_craft_cam.html#a151fde09d08001ee2a615f25ec1acea7',1,'mingfx::CraftCam']]],
+ ['set_5fuser_5fdata_577',['set_user_data',['../classmingfx_1_1_a_a_b_b.html#ade89d21e799a97e7d82be5d593ee2e4b',1,'mingfx::AABB']]],
+ ['set_5fview_5fmatrix_578',['set_view_matrix',['../classmingfx_1_1_craft_cam.html#a79a194be8675a0a968f14fe3dcd79da8',1,'mingfx::CraftCam::set_view_matrix()'],['../classmingfx_1_1_uni_cam.html#a6b17bab82595ca468a3c638512011e5b',1,'mingfx::UniCam::set_view_matrix()']]],
+ ['set_5fwrap_5fmode_579',['set_wrap_mode',['../classmingfx_1_1_texture2_d.html#aa5cbe3396e4560ec0746e91dbc55bc9f',1,'mingfx::Texture2D']]],
+ ['setcolors_580',['SetColors',['../classmingfx_1_1_mesh.html#a0f59e19b74f4f9dc2ad580756f8b319f',1,'mingfx::Mesh::SetColors(int triangle_id, Color c1, Color c2, Color c3)'],['../classmingfx_1_1_mesh.html#ab9b05a77591a9adad12032d513256dae',1,'mingfx::Mesh::SetColors(const std::vector&lt; Color &gt; &amp;colors)'],['../classmingfx_1_1_mesh.html#aed172bdd77858f3b59978cb8527e19ae',1,'mingfx::Mesh::SetColors(float *colors_array, int num_colors)']]],
+ ['setindices_581',['SetIndices',['../classmingfx_1_1_mesh.html#a1f94c9ca7867b65e04f7e02813a06581',1,'mingfx::Mesh::SetIndices(const std::vector&lt; unsigned int &gt; index_array)'],['../classmingfx_1_1_mesh.html#a84711746b8d37c8d9b12ae748a4c5b8c',1,'mingfx::Mesh::SetIndices(unsigned int *index_array, int num_indices)']]],
+ ['setinstancetransforms_582',['SetInstanceTransforms',['../classmingfx_1_1_mesh.html#a7175238f5874929e2258458b98421d87',1,'mingfx::Mesh']]],
+ ['setlight_583',['SetLight',['../classmingfx_1_1_default_shader.html#a41e74fb8af72a6b22c72b0916726b6d6',1,'mingfx::DefaultShader']]],
+ ['setnormals_584',['SetNormals',['../classmingfx_1_1_mesh.html#a43d5a5cc3ef742a8c2b5e3f1b4da0903',1,'mingfx::Mesh::SetNormals(int triangle_id, Vector3 n1, Vector3 n2, Vector3 n3)'],['../classmingfx_1_1_mesh.html#ad28dbd5b0ab77bec28f30f618dd9e57d',1,'mingfx::Mesh::SetNormals(const std::vector&lt; Vector3 &gt; &amp;norms)'],['../classmingfx_1_1_mesh.html#a6ab1128fab6f969564d3a1329baeade6',1,'mingfx::Mesh::SetNormals(float *norms_array, int num_norms)']]],
+ ['settexcoords_585',['SetTexCoords',['../classmingfx_1_1_mesh.html#a17cb896939007357014c74a1ece6f1f3',1,'mingfx::Mesh::SetTexCoords(int triangle_id, int texture_unit, Point2 uv1, Point2 uv2, Point2 uv3)'],['../classmingfx_1_1_mesh.html#aba2dfd0ade2d8a728897d411ef3fdaf1',1,'mingfx::Mesh::SetTexCoords(int texture_unit, const std::vector&lt; Point2 &gt; &amp;tex_coords)'],['../classmingfx_1_1_mesh.html#ac9cd4e8d67bb70295a48fcbc72ae32f9',1,'mingfx::Mesh::SetTexCoords(int texture_unit, float *tex_coords_array, int num_tex_coords)']]],
+ ['setuniform_586',['SetUniform',['../classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Point2 &amp;p)'],['../classmingfx_1_1_shader_program.html#aef58537d81bdb9d88a5f1c56a2b98b25',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Vector2 &amp;v)'],['../classmingfx_1_1_shader_program.html#ac59b3d0542ce45631876615eabf66487',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Point3 &amp;p)'],['../classmingfx_1_1_shader_program.html#a0b3e6285354e007bf79a9ac1587f86f5',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Vector3 &amp;v)'],['../classmingfx_1_1_shader_program.html#a766988eac957e9d810fdf2cbd2eafae0',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Matrix4 &amp;m)'],['../classmingfx_1_1_shader_program.html#a9ec2b53ba4bea7e48ef459530b8c6d60',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, const Color &amp;c)'],['../classmingfx_1_1_shader_program.html#ab547dadc25582bec157b39de29d1419e',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, int i)'],['../classmingfx_1_1_shader_program.html#a707d2cb51a54151959c6570d6bfc7840',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, unsigned int ui)'],['../classmingfx_1_1_shader_program.html#a680fa87cb30343bb56abc48a090e823c',1,'mingfx::ShaderProgram::SetUniform(const std::string &amp;name, float f)']]],
+ ['setuniformarray1_587',['SetUniformArray1',['../classmingfx_1_1_shader_program.html#a51cd1c1d194b2f5c07e81d4f579f2f2b',1,'mingfx::ShaderProgram::SetUniformArray1(const std::string &amp;name, int *i, int count)'],['../classmingfx_1_1_shader_program.html#abba87d2b0baca89232dbd1d6331875de',1,'mingfx::ShaderProgram::SetUniformArray1(const std::string &amp;name, unsigned int *ui, int count)'],['../classmingfx_1_1_shader_program.html#a5c7891252d6b6c40982b56543820cd19',1,'mingfx::ShaderProgram::SetUniformArray1(const std::string &amp;name, float *f, int count)']]],
+ ['setuniformarray2_588',['SetUniformArray2',['../classmingfx_1_1_shader_program.html#a9bab504c74a1c4258258b91afe9a9623',1,'mingfx::ShaderProgram::SetUniformArray2(const std::string &amp;name, int *i, int count)'],['../classmingfx_1_1_shader_program.html#a6fdca4b0ccaa8a0b2c8c68fd7645727c',1,'mingfx::ShaderProgram::SetUniformArray2(const std::string &amp;name, unsigned int *ui, int count)'],['../classmingfx_1_1_shader_program.html#a93914cad6d8e751218c88010c51cf657',1,'mingfx::ShaderProgram::SetUniformArray2(const std::string &amp;name, float *f, int count)']]],
+ ['setuniformarray3_589',['SetUniformArray3',['../classmingfx_1_1_shader_program.html#ac582a2aa74a83095e0b8e359ce432511',1,'mingfx::ShaderProgram::SetUniformArray3(const std::string &amp;name, int *i, int count)'],['../classmingfx_1_1_shader_program.html#a8c31de93b17f050baecb5323a69bdbfa',1,'mingfx::ShaderProgram::SetUniformArray3(const std::string &amp;name, unsigned int *ui, int count)'],['../classmingfx_1_1_shader_program.html#afc84377716296a57299ebbc01884b65d',1,'mingfx::ShaderProgram::SetUniformArray3(const std::string &amp;name, float *f, int count)']]],
+ ['setuniformarray4_590',['SetUniformArray4',['../classmingfx_1_1_shader_program.html#ab06ef4682f801fca080a8f67dc6345ba',1,'mingfx::ShaderProgram::SetUniformArray4(const std::string &amp;name, int *i, int count)'],['../classmingfx_1_1_shader_program.html#a2854ad947f74432edc0b730462b7f695',1,'mingfx::ShaderProgram::SetUniformArray4(const std::string &amp;name, unsigned int *ui, int count)'],['../classmingfx_1_1_shader_program.html#a9710cf4c72a7321b9a1ff1b86ae42da1',1,'mingfx::ShaderProgram::SetUniformArray4(const std::string &amp;name, float *f, int count)']]],
+ ['setvertices_591',['SetVertices',['../classmingfx_1_1_mesh.html#a1dd243b53826765ba468f505645102a6',1,'mingfx::Mesh::SetVertices(const std::vector&lt; Point3 &gt; &amp;verts)'],['../classmingfx_1_1_mesh.html#a033076b9bf1714c9b9e0eeef11ebcd49',1,'mingfx::Mesh::SetVertices(float *verts_array, int num_verts)']]],
+ ['shaderprogram_592',['ShaderProgram',['../classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700',1,'mingfx::ShaderProgram']]],
+ ['slerp_593',['Slerp',['../classmingfx_1_1_quaternion.html#a0290914928a2618f7faaa40989113d22',1,'mingfx::Quaternion::Slerp(const Quaternion &amp;other, float alpha) const'],['../classmingfx_1_1_quaternion.html#a31d37561099fab3d75a74455c5f43133',1,'mingfx::Quaternion::Slerp(const Quaternion &amp;a, const Quaternion &amp;b, float alpha)']]],
+ ['stbrp_5finit_5ftarget_594',['stbrp_init_target',['../stb__rect__pack_8h.html#a8b32f5ad458f614f5d419ef26cef5b3c',1,'stb_rect_pack.h']]],
+ ['stbrp_5fpack_5frects_595',['stbrp_pack_rects',['../stb__rect__pack_8h.html#af038ae1b98573f24736c9a3eed0478ba',1,'stb_rect_pack.h']]],
+ ['stbrp_5fsetup_5fallow_5fout_5fof_5fmem_596',['stbrp_setup_allow_out_of_mem',['../stb__rect__pack_8h.html#a1babd70b223e571305fd9753a83a4fda',1,'stb_rect_pack.h']]],
+ ['stbrp_5fsetup_5fheuristic_597',['stbrp_setup_heuristic',['../stb__rect__pack_8h.html#a5a8223866c146933da3e152066bf61a1',1,'stb_rect_pack.h']]],
+ ['stopprogram_598',['StopProgram',['../classmingfx_1_1_default_shader.html#a2c188bc0fc5f7fc7405f04b036bd4d67',1,'mingfx::DefaultShader::StopProgram()'],['../classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da',1,'mingfx::ShaderProgram::StopProgram()']]],
+ ['subdeterminant_599',['SubDeterminant',['../classmingfx_1_1_matrix4.html#a3d9898bfac2510a695df6b033054e481',1,'mingfx::Matrix4']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_11.html b/dev/MinGfx/docs/html/search/functions_11.html
new file mode 100644
index 0000000..188076e
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_11.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_11.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_11.js b/dev/MinGfx/docs/html/search/functions_11.js
new file mode 100644
index 0000000..00f445a
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_11.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+ ['textextents_600',['TextExtents',['../classmingfx_1_1_text_shader.html#ac4e9a150311fe6d74e9f6214ebeb6b28',1,'mingfx::TextShader']]],
+ ['textformat_601',['TextFormat',['../classmingfx_1_1_text_shader_1_1_text_format.html#a2b7d7e2e540c881952b97b8948b49fcb',1,'mingfx::TextShader::TextFormat']]],
+ ['textshader_602',['TextShader',['../classmingfx_1_1_text_shader.html#a0ec5a6ba22abb3f86c611107925fca67',1,'mingfx::TextShader']]],
+ ['texture2d_603',['Texture2D',['../classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d',1,'mingfx::Texture2D']]],
+ ['todegrees_604',['ToDegrees',['../classmingfx_1_1_gfx_math.html#a39a2b5973249fb3aefc210b18b0fdff3',1,'mingfx::GfxMath::ToDegrees(float radians)'],['../classmingfx_1_1_gfx_math.html#aa5411a7d8bfc8e47d596362a328dbde8',1,'mingfx::GfxMath::ToDegrees(Vector3 radians)']]],
+ ['toeulerangleszyx_605',['ToEulerAnglesZYX',['../classmingfx_1_1_quaternion.html#a033f05ed7e7215a5c3c4cd26548c8007',1,'mingfx::Quaternion']]],
+ ['toradians_606',['ToRadians',['../classmingfx_1_1_gfx_math.html#a1336de2695bc3bb750b23fb0ea211637',1,'mingfx::GfxMath::ToRadians(float degrees)'],['../classmingfx_1_1_gfx_math.html#a38927f1f8ea4625d909e64efa93c5190',1,'mingfx::GfxMath::ToRadians(Vector3 degrees)']]],
+ ['tounit_607',['ToUnit',['../classmingfx_1_1_quaternion.html#a3572b35419c51332204adb5bf35f0b03',1,'mingfx::Quaternion::ToUnit()'],['../classmingfx_1_1_vector2.html#a70f9f612a99017bf051e40ebd7fa7f83',1,'mingfx::Vector2::ToUnit()'],['../classmingfx_1_1_vector3.html#a3caef3c6f24b90730ef70c84ce0e0d71',1,'mingfx::Vector3::ToUnit()']]],
+ ['tovector_608',['ToVector',['../classmingfx_1_1_color.html#ae7371e464c4af7ac93d9edd4c0772c2b',1,'mingfx::Color::ToVector()'],['../classmingfx_1_1_matrix4.html#a4e9433f0482b5e9688c12398900608db',1,'mingfx::Matrix4::ToVector() const']]],
+ ['translation_609',['Translation',['../classmingfx_1_1_matrix4.html#ae82bab81df82dc03f5eb11e74ba1dd84',1,'mingfx::Matrix4']]],
+ ['translation_5fscale_610',['translation_scale',['../classmingfx_1_1_craft_cam.html#a93567af7acbae2939d57cfd8a72bcef2',1,'mingfx::CraftCam']]],
+ ['transpose_611',['Transpose',['../classmingfx_1_1_matrix4.html#afd1030205567d23d4a2d1240d8214850',1,'mingfx::Matrix4']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_12.html b/dev/MinGfx/docs/html/search/functions_12.html
new file mode 100644
index 0000000..eb29d8f
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_12.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_12.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_12.js b/dev/MinGfx/docs/html/search/functions_12.js
new file mode 100644
index 0000000..f0951ec
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_12.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+ ['unicam_612',['UniCam',['../classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e',1,'mingfx::UniCam::UniCam()'],['../classmingfx_1_1_uni_cam.html#af507e639c4bceb4c79e21a6f80c48d07',1,'mingfx::UniCam::UniCam(const Matrix4 &amp;initialViewMatrix)']]],
+ ['unitx_613',['UnitX',['../classmingfx_1_1_vector2.html#a8ef6e0525ec34aaee9cf35bab098ecdb',1,'mingfx::Vector2::UnitX()'],['../classmingfx_1_1_vector3.html#ae8d822fdea67f63580b4e1f78f5b8922',1,'mingfx::Vector3::UnitX()']]],
+ ['unity_614',['UnitY',['../classmingfx_1_1_vector2.html#ab7b3ba42a5a63c512bd7b32fd4cc0db0',1,'mingfx::Vector2::UnitY()'],['../classmingfx_1_1_vector3.html#a8d31e433d1ac04aaceea1b1dcd1643df',1,'mingfx::Vector3::UnitY()']]],
+ ['unitz_615',['UnitZ',['../classmingfx_1_1_vector3.html#a4b696b0d1143d6e30a34a2f889d2ca61',1,'mingfx::Vector3']]],
+ ['updatefrombytes_616',['UpdateFromBytes',['../classmingfx_1_1_texture2_d.html#a0783ad70829ef353aa92344d320b107c',1,'mingfx::Texture2D']]],
+ ['updatefromfloats_617',['UpdateFromFloats',['../classmingfx_1_1_texture2_d.html#ad7640f0cbda6398a6bb80202b80dd693',1,'mingfx::Texture2D']]],
+ ['updategpumemory_618',['UpdateGPUMemory',['../classmingfx_1_1_mesh.html#ac74345bf4b2994de4ee1c509bcc6840e',1,'mingfx::Mesh']]],
+ ['updateheight_619',['UpdateHeight',['../classmingfx_1_1_craft_cam.html#ae3d9c7ea9307dbbadaa4b6e2f9933a7b',1,'mingfx::CraftCam']]],
+ ['updatesimulation_620',['UpdateSimulation',['../classmingfx_1_1_craft_cam.html#a2b7808e489933b117583cf709fa46bc7',1,'mingfx::CraftCam::UpdateSimulation()'],['../classmingfx_1_1_graphics_app.html#a9e2b4cd7eeabe1ace9d5e9220349fbaa',1,'mingfx::GraphicsApp::UpdateSimulation()']]],
+ ['updatetriangle_621',['UpdateTriangle',['../classmingfx_1_1_mesh.html#a3e0ac86714f6b7c3f62761ef3952a044',1,'mingfx::Mesh']]],
+ ['useprogram_622',['UseProgram',['../classmingfx_1_1_default_shader.html#a053599d8c7acd9920461aab8ce945ab0',1,'mingfx::DefaultShader::UseProgram()'],['../classmingfx_1_1_shader_program.html#af1c968f1c79f70e183c9d1239d3d205e',1,'mingfx::ShaderProgram::UseProgram()']]],
+ ['user_5fdata_623',['user_data',['../classmingfx_1_1_a_a_b_b.html#a35def5a4ee2ecd287f5c71436b2c5843',1,'mingfx::AABB']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_13.html b/dev/MinGfx/docs/html/search/functions_13.html
new file mode 100644
index 0000000..3da2ea6
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_13.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_13.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_13.js b/dev/MinGfx/docs/html/search/functions_13.js
new file mode 100644
index 0000000..f2298c0
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_13.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['value_5fptr_624',['value_ptr',['../classmingfx_1_1_color.html#aa3a93033db8e00aff817a125eb5b54a0',1,'mingfx::Color::value_ptr()'],['../classmingfx_1_1_matrix4.html#a2b7b30f23f08d70e83c7b7e01945dd3c',1,'mingfx::Matrix4::value_ptr()'],['../classmingfx_1_1_point2.html#a027b2412f1c36242ccb06cf37c7e29bc',1,'mingfx::Point2::value_ptr()'],['../classmingfx_1_1_point3.html#af0557bdc07452cf335e2b7e04fc0aa3c',1,'mingfx::Point3::value_ptr()'],['../classmingfx_1_1_quaternion.html#abca597e756f257dc33838734ae19baf9',1,'mingfx::Quaternion::value_ptr()'],['../classmingfx_1_1_vector2.html#a80ef53519d50a6a6f158f66755c040d1',1,'mingfx::Vector2::value_ptr()'],['../classmingfx_1_1_vector3.html#aa7ddfd662e866c019a772ba66eae7331',1,'mingfx::Vector3::value_ptr()']]],
+ ['vector2_625',['Vector2',['../classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f',1,'mingfx::Vector2::Vector2()'],['../classmingfx_1_1_vector2.html#acc16337b6b06ebea2fde4c4bd1be7abd',1,'mingfx::Vector2::Vector2(float x, float y)'],['../classmingfx_1_1_vector2.html#a6e3d063a7080bfe199acc70cd5afded2',1,'mingfx::Vector2::Vector2(float *v)'],['../classmingfx_1_1_vector2.html#a40f53939581f5d06a1b757b0398525f8',1,'mingfx::Vector2::Vector2(const Vector2 &amp;v)']]],
+ ['vector3_626',['Vector3',['../classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd',1,'mingfx::Vector3::Vector3()'],['../classmingfx_1_1_vector3.html#a256018f34e230d542027d07d14fd6e65',1,'mingfx::Vector3::Vector3(float x, float y, float z)'],['../classmingfx_1_1_vector3.html#a95b274c7a5ff118af20bc71682c6b1f1',1,'mingfx::Vector3::Vector3(float *v)'],['../classmingfx_1_1_vector3.html#af6100965af7770f833dbf0c9f30f4fdd',1,'mingfx::Vector3::Vector3(const Vector3 &amp;v)']]],
+ ['view_5fmatrix_627',['view_matrix',['../classmingfx_1_1_craft_cam.html#acccdadc08d8d8a0b7b9426f18209ff36',1,'mingfx::CraftCam::view_matrix()'],['../classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3',1,'mingfx::UniCam::view_matrix()']]],
+ ['volume_628',['Volume',['../classmingfx_1_1_a_a_b_b.html#a1ea0cf1c4051185b3f4296d20dd330c9',1,'mingfx::AABB']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_14.html b/dev/MinGfx/docs/html/search/functions_14.html
new file mode 100644
index 0000000..29237b4
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_14.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_14.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_14.js b/dev/MinGfx/docs/html/search/functions_14.js
new file mode 100644
index 0000000..28b70bc
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_14.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['w_629',['w',['../classmingfx_1_1_point2.html#ab00e35eccdc4b7deae8172f5954a86e8',1,'mingfx::Point2::w()'],['../classmingfx_1_1_point3.html#abbf85b5749b37869f4c1b98443ebbd9e',1,'mingfx::Point3::w()'],['../classmingfx_1_1_quaternion.html#a8aa53f71892f02c981d98d100a8b57c7',1,'mingfx::Quaternion::w()'],['../classmingfx_1_1_vector2.html#a267e6749091f23263d1620f801f0a831',1,'mingfx::Vector2::w()'],['../classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5',1,'mingfx::Vector3::w()']]],
+ ['width_630',['width',['../classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869',1,'mingfx::Texture2D']]],
+ ['window_631',['window',['../classmingfx_1_1_graphics_app.html#abd0ee14f7e12146000cdb3532d54ba94',1,'mingfx::GraphicsApp']]],
+ ['window_5fheight_632',['window_height',['../classmingfx_1_1_graphics_app.html#ad7a641f7ccf174cd0a059347b623e016',1,'mingfx::GraphicsApp']]],
+ ['window_5fwidth_633',['window_width',['../classmingfx_1_1_graphics_app.html#a1c682fa2dd0bce855e1e32ffeac532b0',1,'mingfx::GraphicsApp']]],
+ ['wrap_5fmode_634',['wrap_mode',['../classmingfx_1_1_texture2_d.html#a1c8827426f43343c0ad171e181a741ea',1,'mingfx::Texture2D']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_15.html b/dev/MinGfx/docs/html/search/functions_15.html
new file mode 100644
index 0000000..6d5decd
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_15.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_15.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_15.js b/dev/MinGfx/docs/html/search/functions_15.js
new file mode 100644
index 0000000..19d8f67
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_15.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['x_635',['x',['../classmingfx_1_1_point2.html#a92447f64ca82f67e855da0c42db12ffa',1,'mingfx::Point2::x()'],['../classmingfx_1_1_point3.html#ac409e3213620b80c868245c1f6a6eea5',1,'mingfx::Point3::x()'],['../classmingfx_1_1_quaternion.html#a85464500e1d3c8ba10f1968426dc24ae',1,'mingfx::Quaternion::x()'],['../classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a',1,'mingfx::Vector2::x()'],['../classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4',1,'mingfx::Vector3::x()']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_16.html b/dev/MinGfx/docs/html/search/functions_16.html
new file mode 100644
index 0000000..5aed7d0
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_16.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_16.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_16.js b/dev/MinGfx/docs/html/search/functions_16.js
new file mode 100644
index 0000000..bc67585
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_16.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['y_636',['y',['../classmingfx_1_1_point2.html#a4f97a7a75276a147ac06fc4dec810ec8',1,'mingfx::Point2::y()'],['../classmingfx_1_1_point3.html#a0757315cd84f91879021d7afe18e0545',1,'mingfx::Point3::y()'],['../classmingfx_1_1_quaternion.html#adb294449db2a80bd11426148592d9e0b',1,'mingfx::Quaternion::y()'],['../classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b',1,'mingfx::Vector2::y()'],['../classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17',1,'mingfx::Vector3::y()']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_17.html b/dev/MinGfx/docs/html/search/functions_17.html
new file mode 100644
index 0000000..ad6d5a7
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_17.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_17.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_17.js b/dev/MinGfx/docs/html/search/functions_17.js
new file mode 100644
index 0000000..9dfee6b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_17.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['z_637',['z',['../classmingfx_1_1_point3.html#ac463e3a3ec3edd02c86505ea6400d8e6',1,'mingfx::Point3::z()'],['../classmingfx_1_1_quaternion.html#a75ec001cbbf08cf5c4e1f8978082a55f',1,'mingfx::Quaternion::z()'],['../classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6',1,'mingfx::Vector3::z()']]],
+ ['zero_638',['Zero',['../classmingfx_1_1_point2.html#a60a2b348deab631b51caca3eb715461f',1,'mingfx::Point2::Zero()'],['../classmingfx_1_1_point3.html#a9983b62979f9ac5a11efea08d9d283ed',1,'mingfx::Point3::Zero()'],['../classmingfx_1_1_vector2.html#a7cb11f9fe8962ff9092fc1e5736faacf',1,'mingfx::Vector2::Zero()'],['../classmingfx_1_1_vector3.html#a52bf8582baa71e7d6f80c412687d9714',1,'mingfx::Vector3::Zero()']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_18.html b/dev/MinGfx/docs/html/search/functions_18.html
new file mode 100644
index 0000000..b5c5c06
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_18.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_18.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_18.js b/dev/MinGfx/docs/html/search/functions_18.js
new file mode 100644
index 0000000..e7e9b22
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_18.js
@@ -0,0 +1,22 @@
+var searchData=
+[
+ ['_7eaabb_639',['~AABB',['../classmingfx_1_1_a_a_b_b.html#aeb63c176a2f2408e803d9a2f6848eee5',1,'mingfx::AABB']]],
+ ['_7ebvh_640',['~BVH',['../classmingfx_1_1_b_v_h.html#af81906830adcf4648cc8cf4e214b4269',1,'mingfx::BVH']]],
+ ['_7ecolor_641',['~Color',['../classmingfx_1_1_color.html#ab1a90432dd7fd7b2adf41d747be85378',1,'mingfx::Color']]],
+ ['_7ecraftcam_642',['~CraftCam',['../classmingfx_1_1_craft_cam.html#a85ef9bebdd1595be1288bc104245f4ff',1,'mingfx::CraftCam']]],
+ ['_7edefaultshader_643',['~DefaultShader',['../classmingfx_1_1_default_shader.html#a0fe7d605d039ecdbf17837bc5bbe0aba',1,'mingfx::DefaultShader']]],
+ ['_7egraphicsapp_644',['~GraphicsApp',['../classmingfx_1_1_graphics_app.html#aab7925c6b844e6bef428feacf4aa9afb',1,'mingfx::GraphicsApp']]],
+ ['_7ematrix4_645',['~Matrix4',['../classmingfx_1_1_matrix4.html#a8853a6b3fd0d08f1def5c9921bd47933',1,'mingfx::Matrix4']]],
+ ['_7emesh_646',['~Mesh',['../classmingfx_1_1_mesh.html#ace7b23730dbcb581c4886cf2b9998327',1,'mingfx::Mesh']]],
+ ['_7epoint2_647',['~Point2',['../classmingfx_1_1_point2.html#a7e5b2dcd7e079bdd00354e7ccf9c5c2a',1,'mingfx::Point2']]],
+ ['_7epoint3_648',['~Point3',['../classmingfx_1_1_point3.html#aa55aef76986cc7424c2a535d6fd1ab7a',1,'mingfx::Point3']]],
+ ['_7equaternion_649',['~Quaternion',['../classmingfx_1_1_quaternion.html#a1f9ddd82678ccf51a462e4e03a02c7cc',1,'mingfx::Quaternion']]],
+ ['_7equickshapes_650',['~QuickShapes',['../classmingfx_1_1_quick_shapes.html#a3a75dde188ec076ea46a6319ed1ca046',1,'mingfx::QuickShapes']]],
+ ['_7eray_651',['~Ray',['../classmingfx_1_1_ray.html#ac20909f30c07d5375598876c6d294625',1,'mingfx::Ray']]],
+ ['_7eshaderprogram_652',['~ShaderProgram',['../classmingfx_1_1_shader_program.html#a96da0dede354f2511084eeb25428edb4',1,'mingfx::ShaderProgram']]],
+ ['_7etextshader_653',['~TextShader',['../classmingfx_1_1_text_shader.html#a457f7a42eceb957cdb103664dd864feb',1,'mingfx::TextShader']]],
+ ['_7etexture2d_654',['~Texture2D',['../classmingfx_1_1_texture2_d.html#aab734dbbcf6211507ab65d5bb94a4ef9',1,'mingfx::Texture2D']]],
+ ['_7eunicam_655',['~UniCam',['../classmingfx_1_1_uni_cam.html#af98022627bcb52dbf54779cfaeb6ff7e',1,'mingfx::UniCam']]],
+ ['_7evector2_656',['~Vector2',['../classmingfx_1_1_vector2.html#ac49b009c4b6052ebe71d5cf4ce241b1f',1,'mingfx::Vector2']]],
+ ['_7evector3_657',['~Vector3',['../classmingfx_1_1_vector3.html#a6e0d09d774615bcfde5645c22a645969',1,'mingfx::Vector3']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_2.html b/dev/MinGfx/docs/html/search/functions_2.html
new file mode 100644
index 0000000..ca5aa10
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_2.js b/dev/MinGfx/docs/html/search/functions_2.js
new file mode 100644
index 0000000..607a674
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_2.js
@@ -0,0 +1,17 @@
+var searchData=
+[
+ ['calcperfacenormals_416',['CalcPerFaceNormals',['../classmingfx_1_1_mesh.html#a1a5cea9cfdf4c672ba0c781ee54718f7',1,'mingfx::Mesh']]],
+ ['calcpervertexnormals_417',['CalcPerVertexNormals',['../classmingfx_1_1_mesh.html#acc7df547b0a2175287cc9f509c04e93c',1,'mingfx::Mesh']]],
+ ['clamp_418',['Clamp',['../classmingfx_1_1_gfx_math.html#af227209ec043b375497556ee2dcdf850',1,'mingfx::GfxMath']]],
+ ['closestpoint_419',['ClosestPoint',['../classmingfx_1_1_point3.html#a9dd5396f53b7006ec4cb63abffd90a7c',1,'mingfx::Point3']]],
+ ['closestpointonplane_420',['ClosestPointOnPlane',['../classmingfx_1_1_point3.html#ae31d5f91a03fabdf72b2fa54e177b743',1,'mingfx::Point3']]],
+ ['cofactor_421',['Cofactor',['../classmingfx_1_1_matrix4.html#a0d88ba8e15325d135157d115f2412e91',1,'mingfx::Matrix4']]],
+ ['color_422',['Color',['../classmingfx_1_1_color.html#ab4d264b5a1189b73443948c01eab088d',1,'mingfx::Color::Color()'],['../classmingfx_1_1_color.html#a81b442b8afcd157c260487081f25dcc3',1,'mingfx::Color::Color(float red, float green, float blue, float alpha=1.0)'],['../classmingfx_1_1_color.html#ab4d6c067128e779add5390d83ea3410e',1,'mingfx::Color::Color(float *p)'],['../classmingfx_1_1_color.html#a7e0ca85141895a108c852f59f7ca00b9',1,'mingfx::Color::Color(const std::vector&lt; float &gt; &amp;vals)'],['../classmingfx_1_1_color.html#accb83cd759b7290ce2817724d57e246a',1,'mingfx::Color::Color(const Color &amp;p)']]],
+ ['columntopoint3_423',['ColumnToPoint3',['../classmingfx_1_1_matrix4.html#ae991be2b3bca290b44e676a9f8dc13bd',1,'mingfx::Matrix4']]],
+ ['columntovector3_424',['ColumnToVector3',['../classmingfx_1_1_matrix4.html#a7396dbff36cb732e1bd878020f52bbc3',1,'mingfx::Matrix4']]],
+ ['conjugate_425',['Conjugate',['../classmingfx_1_1_quaternion.html#ab0e3e20f78e537de0187def78d808584',1,'mingfx::Quaternion']]],
+ ['craftcam_426',['CraftCam',['../classmingfx_1_1_craft_cam.html#ae0b0e8d75ffc69c6373a13f1f9c2f171',1,'mingfx::CraftCam::CraftCam()'],['../classmingfx_1_1_craft_cam.html#ab9e1864b5859c22d27ba809b1ba7a51f',1,'mingfx::CraftCam::CraftCam(const Matrix4 &amp;initial_view_matrix)']]],
+ ['createfromlistofboxes_427',['CreateFromListOfBoxes',['../classmingfx_1_1_b_v_h.html#a964420ca931fa93c420f0820e1b95942',1,'mingfx::BVH']]],
+ ['createfrommesh_428',['CreateFromMesh',['../classmingfx_1_1_b_v_h.html#a8ed3e91ecd2a0585a0dbac605d6f2c71',1,'mingfx::BVH']]],
+ ['cross_429',['Cross',['../classmingfx_1_1_vector3.html#a38cd4deed7d342464619b34b0ef95bec',1,'mingfx::Vector3::Cross(const Vector3 &amp;v) const'],['../classmingfx_1_1_vector3.html#a45d7d211135edd97ca21b047439db485',1,'mingfx::Vector3::Cross(const Vector3 &amp;v1, const Vector3 &amp;v2)']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_3.html b/dev/MinGfx/docs/html/search/functions_3.html
new file mode 100644
index 0000000..d79f55b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_3.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_3.js b/dev/MinGfx/docs/html/search/functions_3.js
new file mode 100644
index 0000000..3658160
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_3.js
@@ -0,0 +1,25 @@
+var searchData=
+[
+ ['default_5fshader_430',['default_shader',['../classmingfx_1_1_quick_shapes.html#aa7564a49dc2ff8efd93dec13186cb75b',1,'mingfx::QuickShapes']]],
+ ['defaultshader_431',['DefaultShader',['../classmingfx_1_1_default_shader.html#ac030575fd76a6076262bdd09bbb93428',1,'mingfx::DefaultShader']]],
+ ['determinant_432',['Determinant',['../classmingfx_1_1_matrix4.html#a0127ebae92b50e4f10ebee8565b0248c',1,'mingfx::Matrix4']]],
+ ['dimensions_433',['Dimensions',['../classmingfx_1_1_a_a_b_b.html#a3bf7d5ffa3ccccf7111e98d88a3ffeec',1,'mingfx::AABB']]],
+ ['direction_434',['direction',['../classmingfx_1_1_ray.html#a7b7826730a410c10be00122c99fe6dbe',1,'mingfx::Ray']]],
+ ['distancetoplane_435',['DistanceToPlane',['../classmingfx_1_1_point3.html#af554773b2d7f4492a0727e8e42efe002',1,'mingfx::Point3']]],
+ ['dot_436',['Dot',['../classmingfx_1_1_quaternion.html#a90a9b715d06c75ba60eb1164dc6e9c6f',1,'mingfx::Quaternion::Dot()'],['../classmingfx_1_1_vector2.html#ae2208539c6b29712c22f557dcfdd55d9',1,'mingfx::Vector2::Dot(const Vector2 &amp;v) const'],['../classmingfx_1_1_vector2.html#a9e81c518908ca06c98ba099b075fe1cd',1,'mingfx::Vector2::Dot(const Vector2 &amp;v1, const Vector2 &amp;v2)'],['../classmingfx_1_1_vector3.html#a31692a459a8056fe220d115eb5addc88',1,'mingfx::Vector3::Dot(const Vector3 &amp;v) const'],['../classmingfx_1_1_vector3.html#a235fb20d4075960d2ce6198dc95ac507',1,'mingfx::Vector3::Dot(const Vector3 &amp;v1, const Vector3 &amp;v2)']]],
+ ['draw_437',['Draw',['../classmingfx_1_1_default_shader.html#a652b3d00bb6ae2a806b1ca3e3d42242b',1,'mingfx::DefaultShader::Draw()'],['../classmingfx_1_1_mesh.html#a75075d472938fd760477be42585aff5c',1,'mingfx::Mesh::Draw()'],['../classmingfx_1_1_uni_cam.html#ae45f3c80c205a539baeb4f1b8787777d',1,'mingfx::UniCam::Draw()']]],
+ ['draw3d_438',['Draw3D',['../classmingfx_1_1_text_shader.html#a2caaaf2decfac523b476951474e9a359',1,'mingfx::TextShader']]],
+ ['drawarrow_439',['DrawArrow',['../classmingfx_1_1_quick_shapes.html#aebe27814a826558ac0475fef3d4481eb',1,'mingfx::QuickShapes']]],
+ ['drawaxes_440',['DrawAxes',['../classmingfx_1_1_quick_shapes.html#a637876fdc13e84282922350b53dab5f8',1,'mingfx::QuickShapes']]],
+ ['drawbrush_441',['DrawBrush',['../classmingfx_1_1_quick_shapes.html#ab24811cfd980b3f2ec4ebccf6c0e8b30',1,'mingfx::QuickShapes']]],
+ ['drawcone_442',['DrawCone',['../classmingfx_1_1_quick_shapes.html#a1880f6dd3e794cd9f6e5d9138f93a424',1,'mingfx::QuickShapes']]],
+ ['drawcube_443',['DrawCube',['../classmingfx_1_1_quick_shapes.html#adad98f87a40650ff7c605a94b6d937af',1,'mingfx::QuickShapes']]],
+ ['drawcylinder_444',['DrawCylinder',['../classmingfx_1_1_quick_shapes.html#a69c442154f800c6bb3f6ffa8395e2844',1,'mingfx::QuickShapes']]],
+ ['drawfullscreentexture_445',['DrawFullscreenTexture',['../classmingfx_1_1_quick_shapes.html#abec2513648c1238f36c41cf3c85dd868',1,'mingfx::QuickShapes']]],
+ ['drawlines_446',['DrawLines',['../classmingfx_1_1_quick_shapes.html#af59ae8d8c5bd0447f3bb7f56112400bf',1,'mingfx::QuickShapes']]],
+ ['drawlinesegment_447',['DrawLineSegment',['../classmingfx_1_1_quick_shapes.html#a0feae19a04d9f315a39e2bdbf659bd7e',1,'mingfx::QuickShapes']]],
+ ['drawsphere_448',['DrawSphere',['../classmingfx_1_1_quick_shapes.html#aa5f4f64e3708630a6d58f6b4ca7d2744',1,'mingfx::QuickShapes']]],
+ ['drawsquare_449',['DrawSquare',['../classmingfx_1_1_quick_shapes.html#a4350ea23b8b9e0e8119310423d641ab3',1,'mingfx::QuickShapes::DrawSquare(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color)'],['../classmingfx_1_1_quick_shapes.html#a7187f72fa8e12b38dcd0ce424fc85fbc',1,'mingfx::QuickShapes::DrawSquare(const Matrix4 &amp;modelMatrix, const Matrix4 &amp;viewMatrix, const Matrix4 &amp;projectionMatrix, const Color &amp;color, const Texture2D &amp;texture)']]],
+ ['drawusingnanovg_450',['DrawUsingNanoVG',['../classmingfx_1_1_graphics_app.html#a688f12675da58210e8ec2ffcda4923d0',1,'mingfx::GraphicsApp']]],
+ ['drawusingopengl_451',['DrawUsingOpenGL',['../classmingfx_1_1_graphics_app.html#a5a858fd10651f7617491f37b49dbf8ca',1,'mingfx::GraphicsApp']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_4.html b/dev/MinGfx/docs/html/search/functions_4.html
new file mode 100644
index 0000000..1657cad
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_4.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_4.js b/dev/MinGfx/docs/html/search/functions_4.js
new file mode 100644
index 0000000..9c8ea91
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_4.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['eye_452',['eye',['../classmingfx_1_1_craft_cam.html#a82a8e20596247e2986e5929c1ef7f150',1,'mingfx::CraftCam::eye()'],['../classmingfx_1_1_uni_cam.html#a65d5735b4b3a8e38f2b30df4133cadd2',1,'mingfx::UniCam::eye()']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_5.html b/dev/MinGfx/docs/html/search/functions_5.html
new file mode 100644
index 0000000..9301d6b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_5.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_5.js b/dev/MinGfx/docs/html/search/functions_5.js
new file mode 100644
index 0000000..797ad04
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_5.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+ ['fastintersectmesh_453',['FastIntersectMesh',['../classmingfx_1_1_ray.html#ac90097090f0f8f49db13f6f232712afc',1,'mingfx::Ray']]],
+ ['fileexists_454',['FileExists',['../classmingfx_1_1_platform.html#a045007efda73123a7f4019837d83bc92',1,'mingfx::Platform']]],
+ ['filter_5fmode_455',['filter_mode',['../classmingfx_1_1_texture2_d.html#af0052203fcfd9bbb903a40d14700b13b',1,'mingfx::Texture2D']]],
+ ['findfile_456',['FindFile',['../classmingfx_1_1_platform.html#a32a392f4bac832c95fabc2d10bd03ad1',1,'mingfx::Platform::FindFile(const std::string &amp;basename, const std::vector&lt; std::string &gt; &amp;searchpath)'],['../classmingfx_1_1_platform.html#a03ade910313dd9580c9e37a7b63f87b2',1,'mingfx::Platform::FindFile(const std::string &amp;basename, const std::string &amp;searchpath)']]],
+ ['findmingfxdatafile_457',['FindMinGfxDataFile',['../classmingfx_1_1_platform.html#a2c36ca57a246efa218a49a942c8c4a3b',1,'mingfx::Platform']]],
+ ['findmingfxshaderfile_458',['FindMinGfxShaderFile',['../classmingfx_1_1_platform.html#af12cd63e1ede33529d8c282d7d916169',1,'mingfx::Platform']]],
+ ['framebuffer_5fheight_459',['framebuffer_height',['../classmingfx_1_1_graphics_app.html#af58153eb104f53216a3e67de2a472f32',1,'mingfx::GraphicsApp']]],
+ ['framebuffer_5fwidth_460',['framebuffer_width',['../classmingfx_1_1_graphics_app.html#ad596e69d030e7689ad91eaaec6975696',1,'mingfx::GraphicsApp']]],
+ ['fromaxisangle_461',['FromAxisAngle',['../classmingfx_1_1_quaternion.html#a5bacec2f9a3cbbcf24572f9c8eeb480c',1,'mingfx::Quaternion']]],
+ ['fromeulerangleszyx_462',['FromEulerAnglesZYX',['../classmingfx_1_1_quaternion.html#a9548599ea5c527f9f67d2ea6710e3d18',1,'mingfx::Quaternion']]],
+ ['fromrowmajorelements_463',['FromRowMajorElements',['../classmingfx_1_1_matrix4.html#add98bfa1cf6a10dbae0e8ae8defe728b',1,'mingfx::Matrix4']]],
+ ['frustum_464',['Frustum',['../classmingfx_1_1_matrix4.html#a8e2f7b50cd2c8853e007829df9863722',1,'mingfx::Matrix4']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_6.html b/dev/MinGfx/docs/html/search/functions_6.html
new file mode 100644
index 0000000..9c4f5fc
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_6.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_6.js b/dev/MinGfx/docs/html/search/functions_6.js
new file mode 100644
index 0000000..6f54b78
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_6.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['graphicsapp_465',['GraphicsApp',['../classmingfx_1_1_graphics_app.html#abf0b48c7d8e5325ab038fddbe1c38b5b',1,'mingfx::GraphicsApp']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_7.html b/dev/MinGfx/docs/html/search/functions_7.html
new file mode 100644
index 0000000..46b5c0f
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_7.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_7.js b/dev/MinGfx/docs/html/search/functions_7.js
new file mode 100644
index 0000000..9efaf3f
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_7.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['height_466',['height',['../classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88',1,'mingfx::Texture2D']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_8.html b/dev/MinGfx/docs/html/search/functions_8.html
new file mode 100644
index 0000000..31a1d95
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_8.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_8.js b/dev/MinGfx/docs/html/search/functions_8.js
new file mode 100644
index 0000000..ab69095
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_8.js
@@ -0,0 +1,24 @@
+var searchData=
+[
+ ['ilerp_467',['iLerp',['../classmingfx_1_1_gfx_math.html#af255bde64498e9b55be466abeea97f4d',1,'mingfx::GfxMath']]],
+ ['init_468',['Init',['../classmingfx_1_1_default_shader.html#a5cb9f0a1709452268858ec338448a4c3',1,'mingfx::DefaultShader::Init()'],['../classmingfx_1_1_text_shader.html#ad60a8b572adc30dad47e2d163dc603a3',1,'mingfx::TextShader::Init()']]],
+ ['initfrombytes_469',['InitFromBytes',['../classmingfx_1_1_texture2_d.html#aba57b01065096fe9f6483e8f68622944',1,'mingfx::Texture2D']]],
+ ['initfromfile_470',['InitFromFile',['../classmingfx_1_1_texture2_d.html#a8eded044ccdf9bd3e1e5bcfe74526bdc',1,'mingfx::Texture2D']]],
+ ['initfromfloats_471',['InitFromFloats',['../classmingfx_1_1_texture2_d.html#aee8a0aad1795680cb840ffcf544ed7b8',1,'mingfx::Texture2D']]],
+ ['initgraphicscontext_472',['InitGraphicsContext',['../classmingfx_1_1_graphics_app.html#a04beb462aa04371dc86d807838f999e1',1,'mingfx::GraphicsApp']]],
+ ['initialized_473',['initialized',['../classmingfx_1_1_shader_program.html#a2eddd93e446ad2079d1c57676655ffbe',1,'mingfx::ShaderProgram::initialized()'],['../classmingfx_1_1_texture2_d.html#a15d5c319cf7e012e703668f4d4e7be87',1,'mingfx::Texture2D::initialized()']]],
+ ['initnanogui_474',['InitNanoGUI',['../classmingfx_1_1_graphics_app.html#adfe77d841f43961b299ea6159477968a',1,'mingfx::GraphicsApp']]],
+ ['initopengl_475',['InitOpenGL',['../classmingfx_1_1_graphics_app.html#a96196b37f8b488b64072ec74b5d2b0b3',1,'mingfx::GraphicsApp']]],
+ ['intersectaabb_476',['IntersectAABB',['../classmingfx_1_1_ray.html#a57d3ee10518ed361ae02d9cbdef842b7',1,'mingfx::Ray']]],
+ ['intersectandreturnuserdata_477',['IntersectAndReturnUserData',['../classmingfx_1_1_b_v_h.html#afad54f50a29e8b3aace6cdec5c792c56',1,'mingfx::BVH']]],
+ ['intersectmesh_478',['IntersectMesh',['../classmingfx_1_1_ray.html#a79caa1df0839d13339575d3d5527ae6f',1,'mingfx::Ray']]],
+ ['intersectplane_479',['IntersectPlane',['../classmingfx_1_1_ray.html#a8707604031eb9437c449345d85d69d24',1,'mingfx::Ray']]],
+ ['intersectquad_480',['IntersectQuad',['../classmingfx_1_1_ray.html#a37689523a0b73d3d3288ce60bdcb7ae3',1,'mingfx::Ray']]],
+ ['intersectsphere_481',['IntersectSphere',['../classmingfx_1_1_ray.html#a970c7dbc19167be625967fabfb39b4ff',1,'mingfx::Ray']]],
+ ['intersecttriangle_482',['IntersectTriangle',['../classmingfx_1_1_ray.html#a1a6130616c4e4eebe9d09181b0f8b734',1,'mingfx::Ray']]],
+ ['inverse_483',['Inverse',['../classmingfx_1_1_matrix4.html#ab3f360906e15730eee621826b5f0bbc5',1,'mingfx::Matrix4']]],
+ ['iskeydown_484',['IsKeyDown',['../classmingfx_1_1_graphics_app.html#a60688614e5dfeaabf57f8825cdaa08ac',1,'mingfx::GraphicsApp']]],
+ ['isleftmousedown_485',['IsLeftMouseDown',['../classmingfx_1_1_graphics_app.html#a5b78d79192180a6ef5271d2a2b2d1cc7',1,'mingfx::GraphicsApp']]],
+ ['ismiddlemousedown_486',['IsMiddleMouseDown',['../classmingfx_1_1_graphics_app.html#a941f7598400073bfa93aa194a3773434',1,'mingfx::GraphicsApp']]],
+ ['isrightmousedown_487',['IsRightMouseDown',['../classmingfx_1_1_graphics_app.html#a4aa30e3d33731178a9162454a81be08d',1,'mingfx::GraphicsApp']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_9.html b/dev/MinGfx/docs/html/search/functions_9.html
new file mode 100644
index 0000000..9a8e429
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_9.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_9.js b/dev/MinGfx/docs/html/search/functions_9.js
new file mode 100644
index 0000000..d8cc9e6
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_9.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+ ['length_488',['Length',['../classmingfx_1_1_quaternion.html#af6527ae19f31be2b265b8b8c4b34b77a',1,'mingfx::Quaternion::Length()'],['../classmingfx_1_1_ray.html#a3c926e2da6dfd1b0a435577617eae984',1,'mingfx::Ray::Length()'],['../classmingfx_1_1_vector2.html#a71b90903d00cdc318ea42f593db6dbb9',1,'mingfx::Vector2::Length()'],['../classmingfx_1_1_vector3.html#a7633dc1625b1f2e6b381438e896b45a3',1,'mingfx::Vector3::Length()']]],
+ ['lerp_489',['Lerp',['../classmingfx_1_1_color.html#abdec9bbfdd82ed75afc45b103c8bbcf4',1,'mingfx::Color::Lerp(const Color &amp;b, float alpha) const'],['../classmingfx_1_1_color.html#a883787431fef36c06c724c3b9ed25363',1,'mingfx::Color::Lerp(const Color &amp;a, const Color &amp;b, float alpha)'],['../classmingfx_1_1_gfx_math.html#ace452fb6b86eb638897b474e9dd51647',1,'mingfx::GfxMath::Lerp()'],['../classmingfx_1_1_point2.html#a900567ad5e3c0e6de217b52167c49fd6',1,'mingfx::Point2::Lerp(const Point2 &amp;b, float alpha) const'],['../classmingfx_1_1_point2.html#a680648ae01c549c48f7a3d5d75d8791e',1,'mingfx::Point2::Lerp(const Point2 &amp;a, const Point2 &amp;b, float alpha)'],['../classmingfx_1_1_point3.html#a228a1f3754b8ee82b9bb148ce183fc5b',1,'mingfx::Point3::Lerp(const Point3 &amp;b, float alpha) const'],['../classmingfx_1_1_point3.html#a206691c31872e537eefbf897603dba74',1,'mingfx::Point3::Lerp(const Point3 &amp;a, const Point3 &amp;b, float alpha)'],['../classmingfx_1_1_vector2.html#a5813ffa3c185551eec1927e1daa4cb17',1,'mingfx::Vector2::Lerp(const Vector2 &amp;b, float alpha) const'],['../classmingfx_1_1_vector2.html#ac332b5f01b3357b85e6d279fb059d561',1,'mingfx::Vector2::Lerp(const Vector2 &amp;a, const Vector2 &amp;b, float alpha)'],['../classmingfx_1_1_vector3.html#a8dafc21c64a4964bac27519972d909b6',1,'mingfx::Vector3::Lerp(const Vector3 &amp;b, float alpha) const'],['../classmingfx_1_1_vector3.html#a489b042bedf8fa329ac05fe905ca1c6f',1,'mingfx::Vector3::Lerp(const Vector3 &amp;a, const Vector3 &amp;b, float alpha)']]],
+ ['light_490',['light',['../classmingfx_1_1_default_shader.html#aa2ed33efad35aefbb400be45250cd316',1,'mingfx::DefaultShader']]],
+ ['lightproperties_491',['LightProperties',['../classmingfx_1_1_default_shader_1_1_light_properties.html#a582ceee332260b06cbf2ec607257aba3',1,'mingfx::DefaultShader::LightProperties']]],
+ ['linkprogram_492',['LinkProgram',['../classmingfx_1_1_shader_program.html#ad14c3a9a4ee1eef39f933bc46260c794',1,'mingfx::ShaderProgram']]],
+ ['loadfromobj_493',['LoadFromOBJ',['../classmingfx_1_1_mesh.html#a8d05faf18ef8d170fc3c2a343075823f',1,'mingfx::Mesh']]],
+ ['look_494',['look',['../classmingfx_1_1_craft_cam.html#a2c7546bccfbf986eb9cd0a2784f74859',1,'mingfx::CraftCam::look()'],['../classmingfx_1_1_uni_cam.html#a8363576bf0f85c74d80ced697bd73d40',1,'mingfx::UniCam::look()']]],
+ ['look_5fscale_495',['look_scale',['../classmingfx_1_1_craft_cam.html#a96ba4a36029ca8234576cbf2791c5ccb',1,'mingfx::CraftCam']]],
+ ['lookat_496',['LookAt',['../classmingfx_1_1_matrix4.html#a4543695a6dfc996d0312b70c2eaa00de',1,'mingfx::Matrix4']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_a.html b/dev/MinGfx/docs/html/search/functions_a.html
new file mode 100644
index 0000000..5ecc152
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_a.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_a.js b/dev/MinGfx/docs/html/search/functions_a.js
new file mode 100644
index 0000000..5437ddf
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_a.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['material_497',['material',['../classmingfx_1_1_quick_shapes.html#ac8b702a25296cfea15eef1e185333272',1,'mingfx::QuickShapes']]],
+ ['materialproperties_498',['MaterialProperties',['../classmingfx_1_1_default_shader_1_1_material_properties.html#aa24361a9c6eb0a87355d0ad00e47dd96',1,'mingfx::DefaultShader::MaterialProperties']]],
+ ['matrix4_499',['Matrix4',['../classmingfx_1_1_matrix4.html#a50990f00b756d640670a0b02129afd22',1,'mingfx::Matrix4::Matrix4()'],['../classmingfx_1_1_matrix4.html#a09a366a3ef940ff355f8d5c521baa57d',1,'mingfx::Matrix4::Matrix4(const float *a)'],['../classmingfx_1_1_matrix4.html#a0abaeb690794c4a55e74c9b5fd82d138',1,'mingfx::Matrix4::Matrix4(const std::vector&lt; float &gt; &amp;a)'],['../classmingfx_1_1_matrix4.html#a4bcf311614006c551f57d2b0dcd32d87',1,'mingfx::Matrix4::Matrix4(const Matrix4 &amp;m2)']]],
+ ['max_500',['max',['../classmingfx_1_1_a_a_b_b.html#abac247fedc82467c6b058ed4fe77d2a4',1,'mingfx::AABB']]],
+ ['mesh_501',['Mesh',['../classmingfx_1_1_mesh.html#a69613870d54989f4226e50caf4ca9fb9',1,'mingfx::Mesh::Mesh()'],['../classmingfx_1_1_mesh.html#a76b4977f0a7f156aa8a0027f10dcbdc1',1,'mingfx::Mesh::Mesh(const Mesh &amp;other)']]],
+ ['min_502',['min',['../classmingfx_1_1_a_a_b_b.html#a3b46cdd39ffed26b7982d641b53158e6',1,'mingfx::AABB']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_b.html b/dev/MinGfx/docs/html/search/functions_b.html
new file mode 100644
index 0000000..e301fed
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_b.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_b.js b/dev/MinGfx/docs/html/search/functions_b.js
new file mode 100644
index 0000000..0442033
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_b.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['native_5ffont_5fsize_503',['native_font_size',['../classmingfx_1_1_text_shader.html#a707b2b36547db78d19139575003c8a0d',1,'mingfx::TextShader']]],
+ ['normalize_504',['Normalize',['../classmingfx_1_1_quaternion.html#a05def5c8eb729037b3d9522711a5c2a2',1,'mingfx::Quaternion::Normalize()'],['../classmingfx_1_1_vector2.html#a632ddd5b06c48fa0f6f39550e91082c0',1,'mingfx::Vector2::Normalize()'],['../classmingfx_1_1_vector2.html#a06d6c283aba957bddc2b9849698838b2',1,'mingfx::Vector2::Normalize(const Vector2 &amp;v)'],['../classmingfx_1_1_vector3.html#a9b8e9ecbe10477adec527842f62d0dca',1,'mingfx::Vector3::Normalize()'],['../classmingfx_1_1_vector3.html#aeff0177e2111139469b60733248fad8d',1,'mingfx::Vector3::Normalize(const Vector3 &amp;v)']]],
+ ['normalizeddevicecoordstopixels_505',['NormalizedDeviceCoordsToPixels',['../classmingfx_1_1_graphics_app.html#a6141ec6adc29572ee99ca26cf90e6248',1,'mingfx::GraphicsApp::NormalizedDeviceCoordsToPixels(const Point2 &amp;pointInNDC)'],['../classmingfx_1_1_graphics_app.html#a45596da36aa3905e7c752826a7fd9f93',1,'mingfx::GraphicsApp::NormalizedDeviceCoordsToPixels(const Vector2 &amp;pointInNDC)']]],
+ ['num_5flights_506',['num_lights',['../classmingfx_1_1_default_shader.html#ac5b779672a983df8aa67c9cbe026e0c2',1,'mingfx::DefaultShader']]],
+ ['num_5ftriangles_507',['num_triangles',['../classmingfx_1_1_mesh.html#ab3f3779506e15e3888ccbb8b9b572b8f',1,'mingfx::Mesh']]],
+ ['num_5fvertices_508',['num_vertices',['../classmingfx_1_1_mesh.html#ab8f6856429466f1b4600a6ec27b84d0d',1,'mingfx::Mesh']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_c.html b/dev/MinGfx/docs/html/search/functions_c.html
new file mode 100644
index 0000000..c4f3268
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_c.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_c.js b/dev/MinGfx/docs/html/search/functions_c.js
new file mode 100644
index 0000000..9ae5851
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_c.js
@@ -0,0 +1,39 @@
+var searchData=
+[
+ ['onbuttondown_509',['OnButtonDown',['../classmingfx_1_1_uni_cam.html#a85afba6e8792636f3c6ba2433db1c52f',1,'mingfx::UniCam']]],
+ ['onbuttonup_510',['OnButtonUp',['../classmingfx_1_1_uni_cam.html#a2a9431dc3943c8dc485994d88ce2a58a',1,'mingfx::UniCam']]],
+ ['ondrag_511',['OnDrag',['../classmingfx_1_1_uni_cam.html#a33f1b41fcf53ea78ca2b3640902c5bbe',1,'mingfx::UniCam']]],
+ ['one_512',['One',['../classmingfx_1_1_point2.html#a38149d8797bf7406fc34cab0ea5a3ac8',1,'mingfx::Point2::One()'],['../classmingfx_1_1_point3.html#a2cfcbefe652720779e0d7beff1c86ece',1,'mingfx::Point3::One()'],['../classmingfx_1_1_vector2.html#a5b51e62f03e95d6be1262f037aecf0fd',1,'mingfx::Vector2::One()'],['../classmingfx_1_1_vector3.html#af71b12760516a9cc4837ba9e1dee28db',1,'mingfx::Vector3::One()']]],
+ ['onkeydown_513',['OnKeyDown',['../classmingfx_1_1_graphics_app.html#a002560456139e537877d079978db4b01',1,'mingfx::GraphicsApp']]],
+ ['onkeyrepeat_514',['OnKeyRepeat',['../classmingfx_1_1_graphics_app.html#a1d5831953b37fae615fbd1bf527214b0',1,'mingfx::GraphicsApp']]],
+ ['onkeyup_515',['OnKeyUp',['../classmingfx_1_1_graphics_app.html#a8376ef8eb0840b229a2301f995db3f6c',1,'mingfx::GraphicsApp']]],
+ ['onleftmousedown_516',['OnLeftMouseDown',['../classmingfx_1_1_graphics_app.html#ae12d9b192a2167a71e0c103405addb17',1,'mingfx::GraphicsApp']]],
+ ['onleftmousedrag_517',['OnLeftMouseDrag',['../classmingfx_1_1_graphics_app.html#a56d350a8b030998709a51630753d509b',1,'mingfx::GraphicsApp']]],
+ ['onleftmouseup_518',['OnLeftMouseUp',['../classmingfx_1_1_graphics_app.html#a536dbadf0b8a11ef59d7e855ca43f613',1,'mingfx::GraphicsApp']]],
+ ['onmiddlemousedown_519',['OnMiddleMouseDown',['../classmingfx_1_1_graphics_app.html#a588315d5c45490b440a764af2bc5bd48',1,'mingfx::GraphicsApp']]],
+ ['onmiddlemousedrag_520',['OnMiddleMouseDrag',['../classmingfx_1_1_graphics_app.html#ac7628fece754c0ac4875791e19712dc6',1,'mingfx::GraphicsApp']]],
+ ['onmiddlemouseup_521',['OnMiddleMouseUp',['../classmingfx_1_1_graphics_app.html#a378b8a102775eeb01a6da9dd68482d08',1,'mingfx::GraphicsApp']]],
+ ['onmousemove_522',['OnMouseMove',['../classmingfx_1_1_craft_cam.html#a8366e9d8e9bb3b048d1dd14af2f76311',1,'mingfx::CraftCam::OnMouseMove()'],['../classmingfx_1_1_graphics_app.html#a23a780feda9b52eea7319a53b204ce8f',1,'mingfx::GraphicsApp::OnMouseMove(const Point2 &amp;pos, const Vector2 &amp;delta)']]],
+ ['onrightmousedown_523',['OnRightMouseDown',['../classmingfx_1_1_graphics_app.html#a903f94b82cc10f32039ff3f2ba368a9c',1,'mingfx::GraphicsApp']]],
+ ['onrightmousedrag_524',['OnRightMouseDrag',['../classmingfx_1_1_graphics_app.html#a00ad5039af2f428a08fe45751a9731c7',1,'mingfx::GraphicsApp']]],
+ ['onrightmouseup_525',['OnRightMouseUp',['../classmingfx_1_1_graphics_app.html#ad7c33791c44afc87ce789874f3002ca3',1,'mingfx::GraphicsApp']]],
+ ['onspecialkeydown_526',['OnSpecialKeyDown',['../classmingfx_1_1_graphics_app.html#abcf1935e92550bcda311cac62f312952',1,'mingfx::GraphicsApp']]],
+ ['onspecialkeyrepeat_527',['OnSpecialKeyRepeat',['../classmingfx_1_1_graphics_app.html#a8362762489e287edfa59617a6602db22',1,'mingfx::GraphicsApp']]],
+ ['onspecialkeyup_528',['OnSpecialKeyUp',['../classmingfx_1_1_graphics_app.html#a0deb6da45fc0d3980e44556a861c7a14',1,'mingfx::GraphicsApp']]],
+ ['onwindowresize_529',['OnWindowResize',['../classmingfx_1_1_graphics_app.html#adafdc4631db256fefce3c4ffdfd5086a',1,'mingfx::GraphicsApp']]],
+ ['opengl_5fid_530',['opengl_id',['../classmingfx_1_1_texture2_d.html#ad4e0faadfe016e6ee501e66fc0244504',1,'mingfx::Texture2D']]],
+ ['operator_21_3d_531',['operator!=',['../classmingfx_1_1_color.html#acf92f9f413cf11639b73dc0d7d431244',1,'mingfx::Color::operator!=()'],['../classmingfx_1_1_matrix4.html#ab186b0ae1ae669346c0718c2489cd71b',1,'mingfx::Matrix4::operator!=()'],['../classmingfx_1_1_point2.html#a5b99fcf93a0c6d2b247290f5564f8a84',1,'mingfx::Point2::operator!=()'],['../classmingfx_1_1_point3.html#acccf9d3fca27174c18ada3b33209c71e',1,'mingfx::Point3::operator!=()'],['../classmingfx_1_1_quaternion.html#ad72c021d2d1fa543c96ac4a8b360dd2e',1,'mingfx::Quaternion::operator!=()'],['../classmingfx_1_1_ray.html#ab62fa6ea1c20870f67c58401aefe3eff',1,'mingfx::Ray::operator!=()'],['../classmingfx_1_1_vector2.html#a1cf3488f1f14a9bf7f6e1278c1c63cdb',1,'mingfx::Vector2::operator!=()'],['../classmingfx_1_1_vector3.html#ab93acb916c310920b9c011159eaaa016',1,'mingfx::Vector3::operator!=()']]],
+ ['operator_28_29_532',['operator()',['../classmingfx_1_1_matrix4.html#aa324d0cec02c452fb938af28725d5df9',1,'mingfx::Matrix4::operator()(const int row, const int col) const'],['../classmingfx_1_1_matrix4.html#a470bba77b8e3c47de7adaa18046e6096',1,'mingfx::Matrix4::operator()(const int row, const int col)']]],
+ ['operator_2a_533',['operator*',['../namespacemingfx.html#a0a456bccfb238b9644cf21669cf35b8c',1,'mingfx::operator*(const Quaternion &amp;q1, const Quaternion &amp;q2)'],['../namespacemingfx.html#a55f694123e83d1649c112e806359d4b6',1,'mingfx::operator*(const float s, const Quaternion &amp;q)'],['../namespacemingfx.html#aadc0e86a31d54469e730669067b102c2',1,'mingfx::operator*(const Matrix4 &amp;m1, const Matrix4 &amp;m2)'],['../namespacemingfx.html#aa8a18cb8506dee589eaf6883a32e6fb5',1,'mingfx::operator*(const Vector3 &amp;v, const float s)'],['../namespacemingfx.html#a7e3941689c65388690916d00e0d423d4',1,'mingfx::operator*(const float s, const Vector3 &amp;v)'],['../namespacemingfx.html#a8358de6421374fb037e8c51e8f2d5878',1,'mingfx::operator*(const Vector2 &amp;v, const float s)'],['../namespacemingfx.html#a8bc25e621d21323fdd96f2c4a4141432',1,'mingfx::operator*(const float s, const Vector2 &amp;v)'],['../namespacemingfx.html#adb96b0188d1ceda03ed8d297817502c9',1,'mingfx::operator*(const Quaternion &amp;q, const float s)'],['../namespacemingfx.html#a1af1c07624961984759120b7af7f9ce4',1,'mingfx::operator*(const Matrix4 &amp;m, const Ray &amp;r)'],['../namespacemingfx.html#abb2cfd42e696494e4797d8f7e11f6d77',1,'mingfx::operator*(const Matrix4 &amp;m, const Vector3 &amp;v)'],['../namespacemingfx.html#a5b8dabff5d6c9ddcef5e15b0ef807c80',1,'mingfx::operator*(const Matrix4 &amp;m, const Point3 &amp;p)'],['../namespacemingfx.html#a061ff38340cf1aad4612790b0a600aeb',1,'mingfx::operator*(const float &amp;s, const Matrix4 &amp;m)'],['../namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57',1,'mingfx::operator*(const Matrix4 &amp;m, const float &amp;s)']]],
+ ['operator_2b_534',['operator+',['../namespacemingfx.html#aeeeb04b70f8e8becbcda7a3dc7024c1b',1,'mingfx::operator+(const Vector3 &amp;v1, const Vector3 &amp;v2)'],['../namespacemingfx.html#aadea317107a50ec6847ce01927b61c82',1,'mingfx::operator+(const Point3 &amp;p, const Vector3 &amp;v)'],['../namespacemingfx.html#a4b4428d2cf65ba5226ef4036352d311e',1,'mingfx::operator+(const Vector3 &amp;v, const Point3 &amp;p)'],['../namespacemingfx.html#acdffada748181cc17ec93784f858ff9f',1,'mingfx::operator+(const Vector2 &amp;v1, const Vector2 &amp;v2)'],['../namespacemingfx.html#ab2083f9992ba509a275db11522f16a2e',1,'mingfx::operator+(const Point2 &amp;p, const Vector2 &amp;v)'],['../namespacemingfx.html#ac71c01d7c300671cb343a24b68a875bf',1,'mingfx::operator+(const Vector2 &amp;v, const Point2 &amp;p)'],['../namespacemingfx.html#ad49375487853a642b3f372c95cff1a96',1,'mingfx::operator+(const Quaternion &amp;q1, const Quaternion &amp;q2)'],['../namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03',1,'mingfx::operator+(const AABB &amp;A, const AABB &amp;B)']]],
+ ['operator_2d_535',['operator-',['../namespacemingfx.html#a61f2d974c78e8884bb64c2759e455101',1,'mingfx::operator-(const Quaternion &amp;q1, const Quaternion &amp;q2)'],['../namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6',1,'mingfx::operator-(const Quaternion &amp;q)'],['../namespacemingfx.html#a5daeaa383c40eed6f41b2c1b7930499f',1,'mingfx::operator-(const Vector2 &amp;v)'],['../namespacemingfx.html#ae81fac825c0f6eca59cc1a1cc06d63f2',1,'mingfx::operator-(const Point2 &amp;p, const Vector2 &amp;v)'],['../namespacemingfx.html#a128585c0b87e03beda4a660d4e58789b',1,'mingfx::operator-(const Vector2 &amp;v1, const Vector2 &amp;v2)'],['../namespacemingfx.html#ad370bce0bb5b88beb974aad1d44890e8',1,'mingfx::operator-(const Point2 &amp;p1, const Point2 &amp;p2)'],['../namespacemingfx.html#afd07add6169773bae12d40201f8af7db',1,'mingfx::operator-(const Vector3 &amp;v)'],['../namespacemingfx.html#a579b90d99a1d6f794ca44017ded3a8db',1,'mingfx::operator-(const Point3 &amp;p, const Vector3 &amp;v)'],['../namespacemingfx.html#aecdf7f36c4feb04034f1d07c49d5c0e3',1,'mingfx::operator-(const Vector3 &amp;v1, const Vector3 &amp;v2)'],['../namespacemingfx.html#a77d92da8f1a866306518422cd9d2f0af',1,'mingfx::operator-(const Point3 &amp;p1, const Point3 &amp;p2)']]],
+ ['operator_2f_536',['operator/',['../namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed',1,'mingfx::operator/(const Quaternion &amp;q, const float s)'],['../namespacemingfx.html#a79ffb6c38c6c0b68ce1fdb7ae76ea6bd',1,'mingfx::operator/(const Vector2 &amp;v, const float s)'],['../namespacemingfx.html#aa19b1dea0b7aa468950e56044fda328a',1,'mingfx::operator/(const Vector3 &amp;v, const float s)']]],
+ ['operator_3c_3c_537',['operator&lt;&lt;',['../namespacemingfx.html#a1584104dea1f0a5636c868b67ddf6b10',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Matrix4 &amp;m)'],['../namespacemingfx.html#a6bc967741341f4f318a505d884192906',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Color &amp;c)'],['../namespacemingfx.html#a58ddc500b8c3e12f8af4515f258540cb',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Point2 &amp;p)'],['../namespacemingfx.html#a53ce6bc4f4abdd3797d7af47adecbaf6',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Point3 &amp;p)'],['../namespacemingfx.html#ac4b78a682ff8d1ec298e0df7f742658d',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Quaternion &amp;q)'],['../namespacemingfx.html#ad7c839e598b7be6c1b407330dfacc980',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Ray &amp;r)'],['../namespacemingfx.html#acbe43aa24ecedf663c65becf2be282c7',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Vector2 &amp;v)'],['../namespacemingfx.html#a3425c24faf923364cd3a764d50601c52',1,'mingfx::operator&lt;&lt;(std::ostream &amp;os, const Vector3 &amp;v)']]],
+ ['operator_3d_538',['operator=',['../classmingfx_1_1_vector3.html#aa5b1c05c285fad7f2709f6f351a63608',1,'mingfx::Vector3::operator=()'],['../classmingfx_1_1_vector2.html#a28c44a323e5bd1a251dee9e00e2e1769',1,'mingfx::Vector2::operator=()'],['../classmingfx_1_1_quaternion.html#ac5f82b7ed1d620c3c15f57aca028fcdd',1,'mingfx::Quaternion::operator=()'],['../classmingfx_1_1_point3.html#a8e54b18bfaa39f4b7048b85c9ca43c3d',1,'mingfx::Point3::operator=()'],['../classmingfx_1_1_point2.html#afc68153cce7dc528e95cf5ad81c63902',1,'mingfx::Point2::operator=()'],['../classmingfx_1_1_matrix4.html#a9ad8a8bc180ce213956d6d7d3fa19770',1,'mingfx::Matrix4::operator=()'],['../classmingfx_1_1_color.html#ae51a066a9bb018e4f050d9b8cc7f330e',1,'mingfx::Color::operator=()']]],
+ ['operator_3d_3d_539',['operator==',['../classmingfx_1_1_vector3.html#a85486d0a355417fe4b41fa64146c9e98',1,'mingfx::Vector3::operator==()'],['../classmingfx_1_1_vector2.html#ad7acc2cf4dcd2eca210899c846bb7dfe',1,'mingfx::Vector2::operator==()'],['../classmingfx_1_1_ray.html#a87b07c4f7c9f33189efade7e519b5d9d',1,'mingfx::Ray::operator==()'],['../classmingfx_1_1_quaternion.html#aa89165641485cf9337cd6279df40a403',1,'mingfx::Quaternion::operator==()'],['../classmingfx_1_1_point3.html#ab22d5cc4631f26274ada550c90d39699',1,'mingfx::Point3::operator==()'],['../classmingfx_1_1_matrix4.html#a9ec2ee167a450cd7b992384e4cc5bb73',1,'mingfx::Matrix4::operator==()'],['../classmingfx_1_1_color.html#a5411077527ff2a12d18ce1ae52688cf0',1,'mingfx::Color::operator==()'],['../classmingfx_1_1_point2.html#ae8729260293b993bbf3cb31c0a33edfa',1,'mingfx::Point2::operator==()']]],
+ ['operator_3e_3e_540',['operator&gt;&gt;',['../namespacemingfx.html#a256924759a6718882a2b40e17d3e523d',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Point2 &amp;p)'],['../namespacemingfx.html#ad95e9b494b9761895d57e2b698b69afd',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Point3 &amp;p)'],['../namespacemingfx.html#a59fb7a99df5c572849e31065884b2235',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Quaternion &amp;q)'],['../namespacemingfx.html#a0412270963460363fa015b9b4785cc59',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Ray &amp;r)'],['../namespacemingfx.html#ab3f12496d7a5028b71882373d6fa7203',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Vector2 &amp;v)'],['../namespacemingfx.html#a8cc2f52569661416cb2ca67c516b7c93',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Vector3 &amp;v)'],['../namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Color &amp;c)'],['../namespacemingfx.html#a05fc1c0b2b6011283c019242d6a2de74',1,'mingfx::operator&gt;&gt;(std::istream &amp;is, Matrix4 &amp;m)']]],
+ ['operator_5b_5d_541',['operator[]',['../classmingfx_1_1_quaternion.html#a40e6587cc0511572297c5507634db7e1',1,'mingfx::Quaternion::operator[]()'],['../classmingfx_1_1_vector2.html#ae1fc0ce3ca1af3d0546af32742e13000',1,'mingfx::Vector2::operator[](const int i) const'],['../classmingfx_1_1_vector2.html#a93acf7f4f150cfe53859e31d90eddd1e',1,'mingfx::Vector2::operator[](const int i)'],['../classmingfx_1_1_vector3.html#aa37b1fc4b1df9f72726d981c08cd0d1b',1,'mingfx::Vector3::operator[](const int i) const'],['../classmingfx_1_1_vector3.html#abcdda4627b24af879aba38d4fc0e6f71',1,'mingfx::Vector3::operator[](const int i)'],['../classmingfx_1_1_quaternion.html#a548d09ecd25788241d734240c0dd7ea8',1,'mingfx::Quaternion::operator[]()'],['../classmingfx_1_1_matrix4.html#af9b02807d81eac55d66238f246c53656',1,'mingfx::Matrix4::operator[](const int i)'],['../classmingfx_1_1_matrix4.html#acd64f0db45e255d61dde4f6fa10a4127',1,'mingfx::Matrix4::operator[](const int i) const'],['../classmingfx_1_1_color.html#a474ed028db8b31e359d8bfec50147bcc',1,'mingfx::Color::operator[](const int i)'],['../classmingfx_1_1_color.html#aa879c4f6e90c419a2c121e323ce31500',1,'mingfx::Color::operator[](const int i) const'],['../classmingfx_1_1_point3.html#a790468d68b6d957b22959f9078f85c3e',1,'mingfx::Point3::operator[](const int i)'],['../classmingfx_1_1_point3.html#a3a586db5b58d5f1fdaddb1e33e84d566',1,'mingfx::Point3::operator[](const int i) const'],['../classmingfx_1_1_point2.html#a50f09df619fd226e6dc3ccff452abab3',1,'mingfx::Point2::operator[](const int i)'],['../classmingfx_1_1_point2.html#af4c0cc334dfbfe8e8068156e6da16542',1,'mingfx::Point2::operator[](const int i) const']]],
+ ['origin_542',['origin',['../classmingfx_1_1_ray.html#a2fe0ca901c1a5f3ce5f74aa8e5f0d0fe',1,'mingfx::Ray']]],
+ ['origin_543',['Origin',['../classmingfx_1_1_point2.html#a24d7a5121fceba01b46f3ba0f6525630',1,'mingfx::Point2::Origin()'],['../classmingfx_1_1_point3.html#aecb7c3137356cd4470851c54a47c7930',1,'mingfx::Point3::Origin()']]],
+ ['orthonormal_544',['Orthonormal',['../classmingfx_1_1_matrix4.html#a9ad5c85784e84fa0a941361eaaae0250',1,'mingfx::Matrix4']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_d.html b/dev/MinGfx/docs/html/search/functions_d.html
new file mode 100644
index 0000000..7a1ed06
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_d.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_d.js b/dev/MinGfx/docs/html/search/functions_d.js
new file mode 100644
index 0000000..85f19fd
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_d.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['perspective_545',['Perspective',['../classmingfx_1_1_matrix4.html#a0e34aee86758a0397074590b87712c5e',1,'mingfx::Matrix4']]],
+ ['pixel_546',['Pixel',['../classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b',1,'mingfx::Texture2D']]],
+ ['pixelstonormalizeddevicecoords_547',['PixelsToNormalizedDeviceCoords',['../classmingfx_1_1_graphics_app.html#a94b19404e61411ef64c0ddde8ad6c07a',1,'mingfx::GraphicsApp::PixelsToNormalizedDeviceCoords(const Point2 &amp;pointInPixels)'],['../classmingfx_1_1_graphics_app.html#a4e8ac965474de9046448b8811bf25dd1',1,'mingfx::GraphicsApp::PixelsToNormalizedDeviceCoords(const Vector2 &amp;vectorInPixels)']]],
+ ['point2_548',['Point2',['../classmingfx_1_1_point2.html#a2e5869d810b52be4ba43c8a4f4e117a1',1,'mingfx::Point2::Point2()'],['../classmingfx_1_1_point2.html#a716fcff21456f29561ec27118a646483',1,'mingfx::Point2::Point2(float x, float y)'],['../classmingfx_1_1_point2.html#a4ba487a2038ebc78b461b66f1987053f',1,'mingfx::Point2::Point2(float *p)'],['../classmingfx_1_1_point2.html#a97464af92444984e275dca38a3f4eef0',1,'mingfx::Point2::Point2(const Point2 &amp;p)']]],
+ ['point3_549',['Point3',['../classmingfx_1_1_point3.html#ae8ab322852c24c6e03bed03cac443664',1,'mingfx::Point3::Point3()'],['../classmingfx_1_1_point3.html#a29d113f0fa37fa04a642817c680fe953',1,'mingfx::Point3::Point3(float x, float y, float z)'],['../classmingfx_1_1_point3.html#a062caf579ef643b25129cc35b3dbe756',1,'mingfx::Point3::Point3(float *p)'],['../classmingfx_1_1_point3.html#a23534a1ce3d4466c303b9205bd21cd97',1,'mingfx::Point3::Point3(const Point3 &amp;p)']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_e.html b/dev/MinGfx/docs/html/search/functions_e.html
new file mode 100644
index 0000000..22d2a6b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_e.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_e.js b/dev/MinGfx/docs/html/search/functions_e.js
new file mode 100644
index 0000000..975d4f8
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_e.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['quaternion_550',['Quaternion',['../classmingfx_1_1_quaternion.html#ad58ac80804ec63af354912a71361f165',1,'mingfx::Quaternion::Quaternion()'],['../classmingfx_1_1_quaternion.html#a5c6cbe4fc70e8e4ec23142d0a5a2ba97',1,'mingfx::Quaternion::Quaternion(float qx, float qy, float qz, float qw)'],['../classmingfx_1_1_quaternion.html#a07bb09eb7d0b368ef5e8d9da02fbdad6',1,'mingfx::Quaternion::Quaternion(float *ptr)'],['../classmingfx_1_1_quaternion.html#a0be885a1b3f2d54675c6866ec3578243',1,'mingfx::Quaternion::Quaternion(const Quaternion &amp;other)']]],
+ ['quickshapes_551',['QuickShapes',['../classmingfx_1_1_quick_shapes.html#a5764a0953013ece013bf3e2a72e4afa2',1,'mingfx::QuickShapes']]]
+];
diff --git a/dev/MinGfx/docs/html/search/functions_f.html b/dev/MinGfx/docs/html/search/functions_f.html
new file mode 100644
index 0000000..54b7dee
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_f.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/functions_f.js b/dev/MinGfx/docs/html/search/functions_f.js
new file mode 100644
index 0000000..4bb3e28
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/functions_f.js
@@ -0,0 +1,17 @@
+var searchData=
+[
+ ['ray_552',['Ray',['../classmingfx_1_1_ray.html#aee3fe586869e00ae657a74bb4bbbbfda',1,'mingfx::Ray::Ray()'],['../classmingfx_1_1_ray.html#ab38cdd0793b3acfe55fa9ebca5ddebf6',1,'mingfx::Ray::Ray(const Point3 &amp;origin, const Vector3 &amp;direction)']]],
+ ['read_5fcolor_5fdata_553',['read_color_data',['../classmingfx_1_1_mesh.html#ac5fc517fd8ea4cea8459d3f4d5d6ced3',1,'mingfx::Mesh']]],
+ ['read_5fnormal_5fdata_554',['read_normal_data',['../classmingfx_1_1_mesh.html#a439361e454ca63c35f564aed5cd0de65',1,'mingfx::Mesh']]],
+ ['read_5ftex_5fcoords_5fdata_555',['read_tex_coords_data',['../classmingfx_1_1_mesh.html#a51aaa8d6a80af46f22ea9dfecd2f0b31',1,'mingfx::Mesh']]],
+ ['read_5ftriangle_5findices_5fdata_556',['read_triangle_indices_data',['../classmingfx_1_1_mesh.html#a15d79cbc48a6ef72ef1208d734cc2f8a',1,'mingfx::Mesh']]],
+ ['read_5fvertex_5fdata_557',['read_vertex_data',['../classmingfx_1_1_mesh.html#ada9371e85aa0b61df79b26fc880b1863',1,'mingfx::Mesh']]],
+ ['readzvalueatpixel_558',['ReadZValueAtPixel',['../classmingfx_1_1_graphics_app.html#a471951dbf45ffa88027cb92707443646',1,'mingfx::GraphicsApp']]],
+ ['resizewindow_559',['ResizeWindow',['../classmingfx_1_1_graphics_app.html#a0db71b2465e12a8aef4eefbe8b9fcee5',1,'mingfx::GraphicsApp']]],
+ ['rotation_560',['Rotation',['../classmingfx_1_1_matrix4.html#acf4abaf4a45826f14b435edf80a8d0e0',1,'mingfx::Matrix4']]],
+ ['rotation_5fscale_561',['rotation_scale',['../classmingfx_1_1_craft_cam.html#a9fe22cc3b933b12674a5b8f1b5c834ac',1,'mingfx::CraftCam']]],
+ ['rotationx_562',['RotationX',['../classmingfx_1_1_matrix4.html#a48615deb30590055c0aa9f207eee7f08',1,'mingfx::Matrix4']]],
+ ['rotationy_563',['RotationY',['../classmingfx_1_1_matrix4.html#aef94f0e9d298a7ba57e0119ef09b71b6',1,'mingfx::Matrix4']]],
+ ['rotationz_564',['RotationZ',['../classmingfx_1_1_matrix4.html#a4bf1dced8875fdc5827b5b8869e9de93',1,'mingfx::Matrix4']]],
+ ['run_565',['Run',['../classmingfx_1_1_graphics_app.html#a5ee9ae3d14e76c949979a8008687d6c9',1,'mingfx::GraphicsApp']]]
+];
diff --git a/dev/MinGfx/docs/html/search/mag_sel.svg b/dev/MinGfx/docs/html/search/mag_sel.svg
new file mode 100644
index 0000000..03626f6
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/mag_sel.svg
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="svg2"
+ width="20"
+ height="19"
+ viewBox="0 0 20 19"
+ sodipodi:docname="mag_sel.svg"
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="2096"
+ id="namedview4"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="32"
+ inkscape:cx="5.9792688"
+ inkscape:cy="1.1436277"
+ inkscape:window-x="1920"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <circle
+ style="fill:#000000;fill-opacity:0;stroke:#656565;stroke-width:1.4;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ id="path4611"
+ cx="5.5"
+ cy="8.5"
+ r="3.5" />
+ <path
+ style="fill:#656565;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 11,7 13.5,10 16,7 Z"
+ id="path4609"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#656565;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.1085854,11.109059 2.7823556,2.782356"
+ id="path4630"
+ inkscape:connector-curvature="0" />
+</svg>
diff --git a/dev/MinGfx/docs/html/search/namespaces_0.html b/dev/MinGfx/docs/html/search/namespaces_0.html
new file mode 100644
index 0000000..21db2c3
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/namespaces_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="namespaces_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/namespaces_0.js b/dev/MinGfx/docs/html/search/namespaces_0.js
new file mode 100644
index 0000000..c7dae22
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/namespaces_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['mingfx_373',['mingfx',['../namespacemingfx.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/nomatches.html b/dev/MinGfx/docs/html/search/nomatches.html
new file mode 100644
index 0000000..2b9360b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/nomatches.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/pages_0.html b/dev/MinGfx/docs/html/search/pages_0.html
new file mode 100644
index 0000000..8517b48
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/pages_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/pages_0.js b/dev/MinGfx/docs/html/search/pages_0.js
new file mode 100644
index 0000000..8907ede
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/pages_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['api_20_2d_20mingfx_20programming_20reference_20organized_20by_20topic_719',['API - MinGfx Programming Reference Organized by Topic',['../api.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/pages_1.html b/dev/MinGfx/docs/html/search/pages_1.html
new file mode 100644
index 0000000..a0fb679
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/pages_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/pages_1.js b/dev/MinGfx/docs/html/search/pages_1.js
new file mode 100644
index 0000000..de07d2e
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/pages_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['installation_20guide_720',['Installation Guide',['../installation.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/pages_2.html b/dev/MinGfx/docs/html/search/pages_2.html
new file mode 100644
index 0000000..084edfd
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/pages_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/pages_2.js b/dev/MinGfx/docs/html/search/pages_2.js
new file mode 100644
index 0000000..8ea29fe
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/pages_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['mingfx_20toolkit_20documentation_721',['MinGfx Toolkit Documentation',['../index.html',1,'']]]
+];
diff --git a/dev/MinGfx/docs/html/search/related_0.html b/dev/MinGfx/docs/html/search/related_0.html
new file mode 100644
index 0000000..506aaec
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/related_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="related_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/related_0.js b/dev/MinGfx/docs/html/search/related_0.js
new file mode 100644
index 0000000..b70d264
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/related_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['operator_2b_711',['operator+',['../classmingfx_1_1_a_a_b_b.html#a60e301aa632dd49eccdc27bab7c6d231',1,'mingfx::AABB']]]
+];
diff --git a/dev/MinGfx/docs/html/search/search.css b/dev/MinGfx/docs/html/search/search.css
new file mode 100644
index 0000000..d41a75c
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/search.css
@@ -0,0 +1,257 @@
+/*---------------- Search Box */
+
+#MSearchBox {
+ white-space : nowrap;
+ background: white;
+ border-radius: 0.65em;
+ box-shadow: inset 0.5px 0.5px 3px 0px #555;
+ z-index: 102;
+}
+
+#MSearchBox .left {
+ display: inline-block;
+ vertical-align: middle;
+ height: 1.4em;
+}
+
+#MSearchSelect {
+ display: inline-block;
+ vertical-align: middle;
+ height: 1.4em;
+ padding: 0 0 0 0.3em;
+ margin: 0;
+}
+
+#MSearchField {
+ display: inline-block;
+ vertical-align: middle;
+ width: 7.5em;
+ height: 1.1em;
+ margin: 0 0.15em;
+ padding: 0;
+ line-height: 1em;
+ border:none;
+ color: #909090;
+ outline: none;
+ font-family: Arial, Verdana, sans-serif;
+ -webkit-border-radius: 0px;
+ border-radius: 0px;
+ background: none;
+}
+
+
+#MSearchBox .right {
+ display: inline-block;
+ vertical-align: middle;
+ width: 1.4em;
+ height: 1.4em;
+}
+
+#MSearchClose {
+ display: none;
+ font-size: inherit;
+ background : none;
+ border: none;
+ margin: 0;
+ padding: 0;
+ outline: none;
+
+}
+
+#MSearchCloseImg {
+ height: 1.4em;
+ padding: 0.3em;
+ margin: 0;
+}
+
+.MSearchBoxActive #MSearchField {
+ color: #000000;
+}
+
+#main-menu > li:last-child {
+ /* This <li> object is the parent of the search bar */
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 36px;
+ margin-right: 1em;
+}
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #A0A0A0;
+ background-color: #FAFAFA;
+ z-index: 10001;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+ font: 8pt Arial, Verdana, sans-serif;
+ padding-left: 2px;
+ padding-right: 12px;
+ border: 0px;
+}
+
+span.SelectionMark {
+ margin-right: 4px;
+ font-family: monospace;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem {
+ display: block;
+ outline-style: none;
+ color: #000000;
+ text-decoration: none;
+ padding-left: 6px;
+ padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+ color: #000000;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem:hover {
+ color: #FFFFFF;
+ background-color: #505050;
+ outline-style: none;
+ text-decoration: none;
+ cursor: pointer;
+ display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+ width: 60ex;
+ height: 15em;
+}
+
+#MSearchResultsWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #000;
+ background-color: #F0F0F0;
+ z-index:10000;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+ clear:both;
+ padding-bottom: 15px;
+}
+
+.SREntry {
+ font-size: 10pt;
+ padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+ font-size: 8pt;
+ padding: 1px 5px;
+}
+
+body.SRPage {
+ margin: 5px 2px;
+}
+
+.SRChildren {
+ padding-left: 3ex; padding-bottom: .5em
+}
+
+.SRPage .SRChildren {
+ display: none;
+}
+
+.SRSymbol {
+ font-weight: bold;
+ color: #585858;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRScope {
+ display: block;
+ color: #585858;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+ text-decoration: underline;
+}
+
+span.SRScope {
+ padding-left: 4px;
+ font-family: Arial, Verdana, sans-serif;
+}
+
+.SRPage .SRStatus {
+ padding: 2px 5px;
+ font-size: 8pt;
+ font-style: italic;
+ font-family: Arial, Verdana, sans-serif;
+}
+
+.SRResult {
+ display: none;
+}
+
+div.searchresults {
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+/*---------------- External search page results */
+
+.searchresult {
+ background-color: #F2F2F2;
+}
+
+.pages b {
+ color: white;
+ padding: 5px 5px 3px 5px;
+ background-image: url("../tab_a.png");
+ background-repeat: repeat-x;
+ text-shadow: 0 1px 1px #000000;
+}
+
+.pages {
+ line-height: 17px;
+ margin-left: 4px;
+ text-decoration: none;
+}
+
+.hl {
+ font-weight: bold;
+}
+
+#searchresults {
+ margin-bottom: 20px;
+}
+
+.searchpages {
+ margin-top: 10px;
+}
+
diff --git a/dev/MinGfx/docs/html/search/search.js b/dev/MinGfx/docs/html/search/search.js
new file mode 100644
index 0000000..fb226f7
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/search.js
@@ -0,0 +1,816 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ 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.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+ */
+function convertToId(search)
+{
+ var result = '';
+ for (i=0;i<search.length;i++)
+ {
+ var c = search.charAt(i);
+ var cn = c.charCodeAt(0);
+ if (c.match(/[a-z0-9\u0080-\uFFFF]/))
+ {
+ result+=c;
+ }
+ else if (cn<16)
+ {
+ result+="_0"+cn.toString(16);
+ }
+ else
+ {
+ result+="_"+cn.toString(16);
+ }
+ }
+ return result;
+}
+
+function getXPos(item)
+{
+ var x = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ x += item.offsetLeft;
+ item = item.offsetParent;
+ }
+ }
+ return x;
+}
+
+function getYPos(item)
+{
+ var y = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ y += item.offsetTop;
+ item = item.offsetParent;
+ }
+ }
+ return y;
+}
+
+/* A class handling everything associated with the search panel.
+
+ Parameters:
+ name - The name of the global variable that will be
+ storing this instance. Is needed to be able to set timeouts.
+ resultPath - path to use for external files
+*/
+function SearchBox(name, resultsPath, inFrame, label, extension)
+{
+ if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
+ if (!extension || extension == "") { extension = ".html"; }
+
+ // ---------- Instance variables
+ this.name = name;
+ this.resultsPath = resultsPath;
+ this.keyTimeout = 0;
+ this.keyTimeoutLength = 500;
+ this.closeSelectionTimeout = 300;
+ this.lastSearchValue = "";
+ this.lastResultsPage = "";
+ this.hideTimeout = 0;
+ this.searchIndex = 0;
+ this.searchActive = false;
+ this.insideFrame = inFrame;
+ this.searchLabel = label;
+ this.extension = extension;
+
+ // ----------- DOM Elements
+
+ this.DOMSearchField = function()
+ { return document.getElementById("MSearchField"); }
+
+ this.DOMSearchSelect = function()
+ { return document.getElementById("MSearchSelect"); }
+
+ this.DOMSearchSelectWindow = function()
+ { return document.getElementById("MSearchSelectWindow"); }
+
+ this.DOMPopupSearchResults = function()
+ { return document.getElementById("MSearchResults"); }
+
+ this.DOMPopupSearchResultsWindow = function()
+ { return document.getElementById("MSearchResultsWindow"); }
+
+ this.DOMSearchClose = function()
+ { return document.getElementById("MSearchClose"); }
+
+ this.DOMSearchBox = function()
+ { return document.getElementById("MSearchBox"); }
+
+ // ------------ Event Handlers
+
+ // Called when focus is added or removed from the search field.
+ this.OnSearchFieldFocus = function(isActive)
+ {
+ this.Activate(isActive);
+ }
+
+ this.OnSearchSelectShow = function()
+ {
+ var searchSelectWindow = this.DOMSearchSelectWindow();
+ var searchField = this.DOMSearchSelect();
+
+ if (this.insideFrame)
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ left += searchField.offsetWidth + 6;
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ left -= searchSelectWindow.offsetWidth;
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+ else
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+
+ // stop selection hide timer
+ if (this.hideTimeout)
+ {
+ clearTimeout(this.hideTimeout);
+ this.hideTimeout=0;
+ }
+ return false; // to avoid "image drag" default event
+ }
+
+ this.OnSearchSelectHide = function()
+ {
+ this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
+ this.closeSelectionTimeout);
+ }
+
+ // Called when the content of the search field is changed.
+ this.OnSearchFieldChange = function(evt)
+ {
+ if (this.keyTimeout) // kill running timer
+ {
+ clearTimeout(this.keyTimeout);
+ this.keyTimeout = 0;
+ }
+
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 || e.keyCode==13)
+ {
+ if (e.shiftKey==1)
+ {
+ this.OnSearchSelectShow();
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ child.focus();
+ return;
+ }
+ }
+ return;
+ }
+ else
+ {
+ window.frames.MSearchResults.postMessage("take_focus", "*");
+ }
+ }
+ else if (e.keyCode==27) // Escape out of the search field
+ {
+ this.DOMSearchField().blur();
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ this.Activate(false);
+ return;
+ }
+
+ // strip whitespaces
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+ if (searchValue != this.lastSearchValue) // search value has changed
+ {
+ if (searchValue != "") // non-empty search
+ {
+ // set timer for search update
+ this.keyTimeout = setTimeout(this.name + '.Search()',
+ this.keyTimeoutLength);
+ }
+ else // empty search field
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ }
+ }
+ }
+
+ this.SelectItemCount = function(id)
+ {
+ var count=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ this.SelectItemSet = function(id)
+ {
+ var i,j=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ var node = child.firstChild;
+ if (j==id)
+ {
+ node.innerHTML='&#8226;';
+ }
+ else
+ {
+ node.innerHTML='&#160;';
+ }
+ j++;
+ }
+ }
+ }
+
+ // Called when an search filter selection is made.
+ // set item with index id as the active item
+ this.OnSelectItem = function(id)
+ {
+ this.searchIndex = id;
+ this.SelectItemSet(id);
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+ if (searchValue!="" && this.searchActive) // something was found -> do a search
+ {
+ this.Search();
+ }
+ }
+
+ this.OnSearchSelectKey = function(evt)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
+ {
+ this.searchIndex++;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==38 && this.searchIndex>0) // Up
+ {
+ this.searchIndex--;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==13 || e.keyCode==27)
+ {
+ this.OnSelectItem(this.searchIndex);
+ this.CloseSelectionWindow();
+ this.DOMSearchField().focus();
+ }
+ return false;
+ }
+
+ // --------- Actions
+
+ // Closes the results window.
+ this.CloseResultsWindow = function()
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.Activate(false);
+ }
+
+ this.CloseSelectionWindow = function()
+ {
+ this.DOMSearchSelectWindow().style.display = 'none';
+ }
+
+ // Performs a search.
+ this.Search = function()
+ {
+ this.keyTimeout = 0;
+
+ // strip leading whitespace
+ var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+ var code = searchValue.toLowerCase().charCodeAt(0);
+ var idxChar = searchValue.substr(0, 1).toLowerCase();
+ if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
+ {
+ idxChar = searchValue.substr(0, 2);
+ }
+
+ var resultsPage;
+ var resultsPageWithSearch;
+ var hasResultsPage;
+
+ var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
+ if (idx!=-1)
+ {
+ var hexCode=idx.toString(16);
+ resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension;
+ resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+ hasResultsPage = true;
+ }
+ else // nothing available for this search term
+ {
+ resultsPage = this.resultsPath + '/nomatches' + this.extension;
+ resultsPageWithSearch = resultsPage;
+ hasResultsPage = false;
+ }
+
+ window.frames.MSearchResults.location = resultsPageWithSearch;
+ var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+ if (domPopupSearchResultsWindow.style.display!='block')
+ {
+ var domSearchBox = this.DOMSearchBox();
+ this.DOMSearchClose().style.display = 'inline-block';
+ if (this.insideFrame)
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ domPopupSearchResultsWindow.style.position = 'relative';
+ domPopupSearchResultsWindow.style.display = 'block';
+ var width = document.body.clientWidth - 8; // the -8 is for IE :-(
+ domPopupSearchResultsWindow.style.width = width + 'px';
+ domPopupSearchResults.style.width = width + 'px';
+ }
+ else
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
+ var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
+ domPopupSearchResultsWindow.style.display = 'block';
+ left -= domPopupSearchResults.offsetWidth;
+ domPopupSearchResultsWindow.style.top = top + 'px';
+ domPopupSearchResultsWindow.style.left = left + 'px';
+ }
+ }
+
+ this.lastSearchValue = searchValue;
+ this.lastResultsPage = resultsPage;
+ }
+
+ // -------- Activation Functions
+
+ // Activates or deactivates the search panel, resetting things to
+ // their default values if necessary.
+ this.Activate = function(isActive)
+ {
+ if (isActive || // open it
+ this.DOMPopupSearchResultsWindow().style.display == 'block'
+ )
+ {
+ this.DOMSearchBox().className = 'MSearchBoxActive';
+
+ var searchField = this.DOMSearchField();
+
+ if (searchField.value == this.searchLabel) // clear "Search" term upon entry
+ {
+ searchField.value = '';
+ this.searchActive = true;
+ }
+ }
+ else if (!isActive) // directly remove the panel
+ {
+ this.DOMSearchBox().className = 'MSearchBoxInactive';
+ this.DOMSearchField().value = this.searchLabel;
+ this.searchActive = false;
+ this.lastSearchValue = ''
+ this.lastResultsPage = '';
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+ // The number of matches from the last run of <Search()>.
+ this.lastMatchCount = 0;
+ this.lastKey = 0;
+ this.repeatOn = false;
+
+ // Toggles the visibility of the passed element ID.
+ this.FindChildElement = function(id)
+ {
+ var parentElement = document.getElementById(id);
+ var element = parentElement.firstChild;
+
+ while (element && element!=parentElement)
+ {
+ if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren')
+ {
+ return element;
+ }
+
+ if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes())
+ {
+ element = element.firstChild;
+ }
+ else if (element.nextSibling)
+ {
+ element = element.nextSibling;
+ }
+ else
+ {
+ do
+ {
+ element = element.parentNode;
+ }
+ while (element && element!=parentElement && !element.nextSibling);
+
+ if (element && element!=parentElement)
+ {
+ element = element.nextSibling;
+ }
+ }
+ }
+ }
+
+ this.Toggle = function(id)
+ {
+ var element = this.FindChildElement(id);
+ if (element)
+ {
+ if (element.style.display == 'block')
+ {
+ element.style.display = 'none';
+ }
+ else
+ {
+ element.style.display = 'block';
+ }
+ }
+ }
+
+ // Searches for the passed string. If there is no parameter,
+ // it takes it from the URL query.
+ //
+ // Always returns true, since other documents may try to call it
+ // and that may or may not be possible.
+ this.Search = function(search)
+ {
+ if (!search) // get search word from URL
+ {
+ search = window.location.search;
+ search = search.substring(1); // Remove the leading '?'
+ search = unescape(search);
+ }
+
+ search = search.replace(/^ +/, ""); // strip leading spaces
+ search = search.replace(/ +$/, ""); // strip trailing spaces
+ search = search.toLowerCase();
+ search = convertToId(search);
+
+ var resultRows = document.getElementsByTagName("div");
+ var matches = 0;
+
+ var i = 0;
+ while (i < resultRows.length)
+ {
+ var row = resultRows.item(i);
+ if (row.className == "SRResult")
+ {
+ var rowMatchName = row.id.toLowerCase();
+ rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+ if (search.length<=rowMatchName.length &&
+ rowMatchName.substr(0, search.length)==search)
+ {
+ row.style.display = 'block';
+ matches++;
+ }
+ else
+ {
+ row.style.display = 'none';
+ }
+ }
+ i++;
+ }
+ document.getElementById("Searching").style.display='none';
+ if (matches == 0) // no results
+ {
+ document.getElementById("NoMatches").style.display='block';
+ }
+ else // at least one result
+ {
+ document.getElementById("NoMatches").style.display='none';
+ }
+ this.lastMatchCount = matches;
+ return true;
+ }
+
+ // return the first item with index index or higher that is visible
+ this.NavNext = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index++;
+ }
+ return focusItem;
+ }
+
+ this.NavPrev = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index--;
+ }
+ return focusItem;
+ }
+
+ this.ProcessKeys = function(e)
+ {
+ if (e.type == "keydown")
+ {
+ this.repeatOn = false;
+ this.lastKey = e.keyCode;
+ }
+ else if (e.type == "keypress")
+ {
+ if (!this.repeatOn)
+ {
+ if (this.lastKey) this.repeatOn = true;
+ return false; // ignore first keypress after keydown
+ }
+ }
+ else if (e.type == "keyup")
+ {
+ this.lastKey = 0;
+ this.repeatOn = false;
+ }
+ return this.lastKey!=0;
+ }
+
+ this.Nav = function(evt,itemIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ var newIndex = itemIndex-1;
+ var focusItem = this.NavPrev(newIndex);
+ if (focusItem)
+ {
+ var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+ if (child && child.style.display == 'block') // children visible
+ {
+ var n=0;
+ var tmpElem;
+ while (1) // search for last child
+ {
+ tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+ if (tmpElem)
+ {
+ focusItem = tmpElem;
+ }
+ else // found it!
+ {
+ break;
+ }
+ n++;
+ }
+ }
+ }
+ if (focusItem)
+ {
+ focusItem.focus();
+ }
+ else // return focus to search field
+ {
+ parent.document.getElementById("MSearchField").focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = itemIndex+1;
+ var focusItem;
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem && elem.style.display == 'block') // children visible
+ {
+ focusItem = document.getElementById('Item'+itemIndex+'_c0');
+ }
+ if (!focusItem) focusItem = this.NavNext(newIndex);
+ if (focusItem) focusItem.focus();
+ }
+ else if (this.lastKey==39) // Right
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'block';
+ }
+ else if (this.lastKey==37) // Left
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'none';
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+
+ this.NavChild = function(evt,itemIndex,childIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ if (childIndex>0)
+ {
+ var newIndex = childIndex-1;
+ document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+ }
+ else // already at first child, jump to parent
+ {
+ document.getElementById('Item'+itemIndex).focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = childIndex+1;
+ var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+ if (!elem) // last child, jump to parent next parent
+ {
+ elem = this.NavNext(itemIndex+1);
+ }
+ if (elem)
+ {
+ elem.focus();
+ }
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+}
+
+function setKeyActions(elem,action)
+{
+ elem.setAttribute('onkeydown',action);
+ elem.setAttribute('onkeypress',action);
+ elem.setAttribute('onkeyup',action);
+}
+
+function setClassAttr(elem,attr)
+{
+ elem.setAttribute('class',attr);
+ elem.setAttribute('className',attr);
+}
+
+function createResults()
+{
+ var results = document.getElementById("SRResults");
+ for (var e=0; e<searchData.length; e++)
+ {
+ var id = searchData[e][0];
+ var srResult = document.createElement('div');
+ srResult.setAttribute('id','SR_'+id);
+ setClassAttr(srResult,'SRResult');
+ var srEntry = document.createElement('div');
+ setClassAttr(srEntry,'SREntry');
+ var srLink = document.createElement('a');
+ srLink.setAttribute('id','Item'+e);
+ setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
+ setClassAttr(srLink,'SRSymbol');
+ srLink.innerHTML = searchData[e][1][0];
+ srEntry.appendChild(srLink);
+ if (searchData[e][1].length==2) // single result
+ {
+ srLink.setAttribute('href',searchData[e][1][1][0]);
+ if (searchData[e][1][1][1])
+ {
+ srLink.setAttribute('target','_parent');
+ }
+ var srScope = document.createElement('span');
+ setClassAttr(srScope,'SRScope');
+ srScope.innerHTML = searchData[e][1][1][2];
+ srEntry.appendChild(srScope);
+ }
+ else // multiple results
+ {
+ srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
+ var srChildren = document.createElement('div');
+ setClassAttr(srChildren,'SRChildren');
+ for (var c=0; c<searchData[e][1].length-1; c++)
+ {
+ var srChild = document.createElement('a');
+ srChild.setAttribute('id','Item'+e+'_c'+c);
+ setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
+ setClassAttr(srChild,'SRScope');
+ srChild.setAttribute('href',searchData[e][1][c+1][0]);
+ if (searchData[e][1][c+1][1])
+ {
+ srChild.setAttribute('target','_parent');
+ }
+ srChild.innerHTML = searchData[e][1][c+1][2];
+ srChildren.appendChild(srChild);
+ }
+ srEntry.appendChild(srChildren);
+ }
+ srResult.appendChild(srEntry);
+ results.appendChild(srResult);
+ }
+}
+
+function init_search()
+{
+ var results = document.getElementById("MSearchSelectWindow");
+ for (var key in indexSectionLabels)
+ {
+ var link = document.createElement('a');
+ link.setAttribute('class','SelectItem');
+ link.setAttribute('onclick','searchBox.OnSelectItem('+key+')');
+ link.href='javascript:void(0)';
+ link.innerHTML='<span class="SelectionMark">&#160;</span>'+indexSectionLabels[key];
+ results.appendChild(link);
+ }
+ searchBox.OnSelectItem(0);
+}
+/* @license-end */
diff --git a/dev/MinGfx/docs/html/search/search_l.png b/dev/MinGfx/docs/html/search/search_l.png
new file mode 100644
index 0000000..fd5f7da
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/search_l.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/search/search_m.png b/dev/MinGfx/docs/html/search/search_m.png
new file mode 100644
index 0000000..b429a16
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/search_m.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/search/search_r.png b/dev/MinGfx/docs/html/search/search_r.png
new file mode 100644
index 0000000..1af5d21
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/search_r.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/search/searchdata.js b/dev/MinGfx/docs/html/search/searchdata.js
new file mode 100644
index 0000000..f582820
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/searchdata.js
@@ -0,0 +1,48 @@
+var indexSectionsWithContent =
+{
+ 0: "abcdefghilmnopqrstuvwxyz~",
+ 1: "abcdglmpqrstuv",
+ 2: "m",
+ 3: "abcdgimopqrstuv",
+ 4: "abcdefghilmnopqrstuvwxyz~",
+ 5: "acdefhimnpstvwxy",
+ 6: "s",
+ 7: "hlv",
+ 8: "hlsv",
+ 9: "o",
+ 10: "ms",
+ 11: "aim"
+};
+
+var indexSectionNames =
+{
+ 0: "all",
+ 1: "classes",
+ 2: "namespaces",
+ 3: "files",
+ 4: "functions",
+ 5: "variables",
+ 6: "typedefs",
+ 7: "enums",
+ 8: "enumvalues",
+ 9: "related",
+ 10: "defines",
+ 11: "pages"
+};
+
+var indexSectionLabels =
+{
+ 0: "All",
+ 1: "Classes",
+ 2: "Namespaces",
+ 3: "Files",
+ 4: "Functions",
+ 5: "Variables",
+ 6: "Typedefs",
+ 7: "Enumerations",
+ 8: "Enumerator",
+ 9: "Friends",
+ 10: "Macros",
+ 11: "Pages"
+};
+
diff --git a/dev/MinGfx/docs/html/search/typedefs_0.html b/dev/MinGfx/docs/html/search/typedefs_0.html
new file mode 100644
index 0000000..a4684c4
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/typedefs_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/typedefs_0.js b/dev/MinGfx/docs/html/search/typedefs_0.js
new file mode 100644
index 0000000..b14dc1d
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/typedefs_0.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['stbrp_5fcontext_691',['stbrp_context',['../stb__rect__pack_8h.html#a0455046a8d5457bbc4f3f3ec995c338f',1,'stb_rect_pack.h']]],
+ ['stbrp_5fcoord_692',['stbrp_coord',['../stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9',1,'stb_rect_pack.h']]],
+ ['stbrp_5fnode_693',['stbrp_node',['../stb__rect__pack_8h.html#ae8f871c209d2e6218baf9c0e2a209ea1',1,'stb_rect_pack.h']]],
+ ['stbrp_5frect_694',['stbrp_rect',['../stb__rect__pack_8h.html#a7c4a99b31ea2207a0b2bbcbdab8f3840',1,'stb_rect_pack.h']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_0.html b/dev/MinGfx/docs/html/search/variables_0.html
new file mode 100644
index 0000000..1e477c0
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_0.js b/dev/MinGfx/docs/html/search/variables_0.js
new file mode 100644
index 0000000..8c9043a
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_0.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['active_5fhead_658',['active_head',['../structstbrp__context.html#a13277239636803aff28f00b0a0376120',1,'stbrp_context']]],
+ ['align_659',['align',['../structstbrp__context.html#ae36053e2001a725aec2b5756dc990481',1,'stbrp_context']]],
+ ['ambient_5fintensity_660',['ambient_intensity',['../classmingfx_1_1_default_shader_1_1_light_properties.html#a226c173b193459af291687dd45280fbb',1,'mingfx::DefaultShader::LightProperties']]],
+ ['ambient_5freflectance_661',['ambient_reflectance',['../classmingfx_1_1_default_shader_1_1_material_properties.html#ad4db9a1b0636db84f57f022c51ce7657',1,'mingfx::DefaultShader::MaterialProperties']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_1.html b/dev/MinGfx/docs/html/search/variables_1.html
new file mode 100644
index 0000000..ea73d9a
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_1.js b/dev/MinGfx/docs/html/search/variables_1.js
new file mode 100644
index 0000000..0294691
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['color_662',['color',['../classmingfx_1_1_text_shader_1_1_text_format.html#af0483874ac3fcea58b6ff99ef6644ff7',1,'mingfx::TextShader::TextFormat']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_2.html b/dev/MinGfx/docs/html/search/variables_2.html
new file mode 100644
index 0000000..0580462
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_2.js b/dev/MinGfx/docs/html/search/variables_2.js
new file mode 100644
index 0000000..f7ba507
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_2.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['diffuse_5fintensity_663',['diffuse_intensity',['../classmingfx_1_1_default_shader_1_1_light_properties.html#a9a010057c15e3db5661b07a03d5176d7',1,'mingfx::DefaultShader::LightProperties']]],
+ ['diffuse_5freflectance_664',['diffuse_reflectance',['../classmingfx_1_1_default_shader_1_1_material_properties.html#aa7b75f95a45d7a1030c297192b14014f',1,'mingfx::DefaultShader::MaterialProperties']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_3.html b/dev/MinGfx/docs/html/search/variables_3.html
new file mode 100644
index 0000000..0d69e76
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_3.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_3.js b/dev/MinGfx/docs/html/search/variables_3.js
new file mode 100644
index 0000000..62868c5
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_3.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['extra_665',['extra',['../structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624',1,'stbrp_context']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_4.html b/dev/MinGfx/docs/html/search/variables_4.html
new file mode 100644
index 0000000..a4b6506
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_4.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_4.js b/dev/MinGfx/docs/html/search/variables_4.js
new file mode 100644
index 0000000..6f9192b
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_4.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['free_5fhead_666',['free_head',['../structstbrp__context.html#a1336ae32373663847866cc65904c2839',1,'stbrp_context']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_5.html b/dev/MinGfx/docs/html/search/variables_5.html
new file mode 100644
index 0000000..7e345d1
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_5.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_5.js b/dev/MinGfx/docs/html/search/variables_5.js
new file mode 100644
index 0000000..82e20a2
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_5.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['h_667',['h',['../structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398',1,'stbrp_rect']]],
+ ['h_5falign_668',['h_align',['../classmingfx_1_1_text_shader_1_1_text_format.html#acde55d28b0446e788e6c68b85df83066',1,'mingfx::TextShader::TextFormat']]],
+ ['half_5fpi_669',['HALF_PI',['../classmingfx_1_1_gfx_math.html#ab5ba8ba54257d86dcf95bd2bbeb534c0',1,'mingfx::GfxMath']]],
+ ['height_670',['height',['../structstbrp__context.html#af3715a6f3faecfb4fac8f6ccbb71f9c7',1,'stbrp_context']]],
+ ['heuristic_671',['heuristic',['../structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a',1,'stbrp_context']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_6.html b/dev/MinGfx/docs/html/search/variables_6.html
new file mode 100644
index 0000000..7d48e75
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_6.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_6.js b/dev/MinGfx/docs/html/search/variables_6.js
new file mode 100644
index 0000000..aa6ee2c
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_6.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['id_672',['id',['../structstbrp__rect.html#a92da8626bc99df041c0c3bfd01c25f7a',1,'stbrp_rect']]],
+ ['init_5fmode_673',['init_mode',['../structstbrp__context.html#a007509feee322404083034e4c2d3dc5d',1,'stbrp_context']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_7.html b/dev/MinGfx/docs/html/search/variables_7.html
new file mode 100644
index 0000000..5c26340
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_7.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_7.js b/dev/MinGfx/docs/html/search/variables_7.js
new file mode 100644
index 0000000..9237abb
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_7.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['max_5flights_674',['MAX_LIGHTS',['../classmingfx_1_1_default_shader.html#a21c1fd93273eaf643e7ac9b05ba0fb24',1,'mingfx::DefaultShader']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_8.html b/dev/MinGfx/docs/html/search/variables_8.html
new file mode 100644
index 0000000..dc9ec54
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_8.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_8.js b/dev/MinGfx/docs/html/search/variables_8.js
new file mode 100644
index 0000000..753e50e
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_8.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['next_675',['next',['../structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4',1,'stbrp_node']]],
+ ['num_5fnodes_676',['num_nodes',['../structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58',1,'stbrp_context']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_9.html b/dev/MinGfx/docs/html/search/variables_9.html
new file mode 100644
index 0000000..7b01475
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_9.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_9.js b/dev/MinGfx/docs/html/search/variables_9.js
new file mode 100644
index 0000000..f6145ff
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_9.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['pi_677',['PI',['../classmingfx_1_1_gfx_math.html#aaa14e60a5f7c158db443f8b6d87958b4',1,'mingfx::GfxMath']]],
+ ['position_678',['position',['../classmingfx_1_1_default_shader_1_1_light_properties.html#a160b58a0e70294008b9dac8eb6291d3e',1,'mingfx::DefaultShader::LightProperties']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_a.html b/dev/MinGfx/docs/html/search/variables_a.html
new file mode 100644
index 0000000..52a724d
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_a.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_a.js b/dev/MinGfx/docs/html/search/variables_a.js
new file mode 100644
index 0000000..0aea1c4
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_a.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['shinniness_679',['shinniness',['../classmingfx_1_1_default_shader_1_1_material_properties.html#ad77e4c78a2bf60776c673b91bc4c8a13',1,'mingfx::DefaultShader::MaterialProperties']]],
+ ['size_680',['size',['../classmingfx_1_1_text_shader_1_1_text_format.html#aeecda817624276f0cfb812ddcdbbc2f0',1,'mingfx::TextShader::TextFormat']]],
+ ['specular_5fintensity_681',['specular_intensity',['../classmingfx_1_1_default_shader_1_1_light_properties.html#abef7666629dbb9da661b163e0584c9a4',1,'mingfx::DefaultShader::LightProperties']]],
+ ['specular_5freflectance_682',['specular_reflectance',['../classmingfx_1_1_default_shader_1_1_material_properties.html#acfd78796e08f527a24cce3c1e206148c',1,'mingfx::DefaultShader::MaterialProperties']]],
+ ['surface_5ftexture_683',['surface_texture',['../classmingfx_1_1_default_shader_1_1_material_properties.html#ae26eed46a279c73e947880858763514e',1,'mingfx::DefaultShader::MaterialProperties']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_b.html b/dev/MinGfx/docs/html/search/variables_b.html
new file mode 100644
index 0000000..f376b27
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_b.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_b.js b/dev/MinGfx/docs/html/search/variables_b.js
new file mode 100644
index 0000000..ff2a95f
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_b.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['two_5fpi_684',['TWO_PI',['../classmingfx_1_1_gfx_math.html#a0e5c7562116babf11c61f4c7f20f8b69',1,'mingfx::GfxMath']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_c.html b/dev/MinGfx/docs/html/search/variables_c.html
new file mode 100644
index 0000000..6019eba
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_c.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_c.js b/dev/MinGfx/docs/html/search/variables_c.js
new file mode 100644
index 0000000..d3e4719
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_c.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['v_5falign_685',['v_align',['../classmingfx_1_1_text_shader_1_1_text_format.html#a8455382a6829022020eb307ae9168bd7',1,'mingfx::TextShader::TextFormat']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_d.html b/dev/MinGfx/docs/html/search/variables_d.html
new file mode 100644
index 0000000..f61ae75
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_d.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_d.js b/dev/MinGfx/docs/html/search/variables_d.js
new file mode 100644
index 0000000..ddd4c60
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_d.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['w_686',['w',['../structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5',1,'stbrp_rect']]],
+ ['was_5fpacked_687',['was_packed',['../structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49',1,'stbrp_rect']]],
+ ['width_688',['width',['../structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2',1,'stbrp_context']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_e.html b/dev/MinGfx/docs/html/search/variables_e.html
new file mode 100644
index 0000000..7bfd372
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_e.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_e.js b/dev/MinGfx/docs/html/search/variables_e.js
new file mode 100644
index 0000000..ebb638d
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_e.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['x_689',['x',['../structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18',1,'stbrp_rect::x()'],['../structstbrp__node.html#a45ab31a88025db27d08040d715b129ea',1,'stbrp_node::x()']]]
+];
diff --git a/dev/MinGfx/docs/html/search/variables_f.html b/dev/MinGfx/docs/html/search/variables_f.html
new file mode 100644
index 0000000..d97920d
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_f.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/search/variables_f.js b/dev/MinGfx/docs/html/search/variables_f.js
new file mode 100644
index 0000000..6a14e35
--- /dev/null
+++ b/dev/MinGfx/docs/html/search/variables_f.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['y_690',['y',['../structstbrp__rect.html#ae3034c1fbf86043b568f5a4dddf946fa',1,'stbrp_rect::y()'],['../structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e',1,'stbrp_node::y()']]]
+];
diff --git a/dev/MinGfx/docs/html/shader__program_8h.html b/dev/MinGfx/docs/html/shader__program_8h.html
new file mode 100644
index 0000000..f3b879f
--- /dev/null
+++ b/dev/MinGfx/docs/html/shader__program_8h.html
@@ -0,0 +1,119 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/shader_program.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">shader_program.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="color_8h_source.html">color.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="matrix4_8h_source.html">matrix4.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="opengl__headers_8h_source.html">opengl_headers.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point2_8h_source.html">point2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="texture2d_8h_source.html">texture2d.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector2_8h_source.html">vector2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector3_8h_source.html">vector3.h</a>&quot;</code><br />
+<code>#include &lt;string&gt;</code><br />
+<code>#include &lt;map&gt;</code><br />
+</div>
+<p><a href="shader__program_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A wrapper around GLSL shader programs. <a href="classmingfx_1_1_shader_program.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/shader__program_8h_source.html b/dev/MinGfx/docs/html/shader__program_8h_source.html
new file mode 100644
index 0000000..ff40d8e
--- /dev/null
+++ b/dev/MinGfx/docs/html/shader__program_8h_source.html
@@ -0,0 +1,274 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/shader_program.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">shader_program.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="shader__program_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_SHADERPROGRAM_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_SHADERPROGRAM_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="color_8h.html">color.h</a>&quot;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="matrix4_8h.html">matrix4.h</a>&quot;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="opengl__headers_8h.html">opengl_headers.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point2_8h.html">point2.h</a>&quot;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="texture2d_8h.html">texture2d.h</a>&quot;</span></div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector2_8h.html">vector2.h</a>&quot;</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector3_8h.html">vector3.h</a>&quot;</span></div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &lt;map&gt;</span></div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; </div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; </div>
+<div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html"> 66</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_shader_program.html">ShaderProgram</a> {</div>
+<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700"> 69</a></span>&#160; <a class="code" href="classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700">ShaderProgram</a>();</div>
+<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; </div>
+<div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a96da0dede354f2511084eeb25428edb4"> 71</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_shader_program.html#a96da0dede354f2511084eeb25428edb4">~ShaderProgram</a>();</div>
+<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; </div>
+<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; </div>
+<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="comment">// ---- These should be called during startup (e.g., in InitOpenGL()) ----</span></div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; </div>
+<div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a63ac061271fad9338e922389d4a179e5"> 80</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_shader_program.html#a63ac061271fad9338e922389d4a179e5">AddVertexShaderFromFile</a>(<span class="keyword">const</span> std::string &amp;file);</div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; </div>
+<div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#ab5fed4904a59c6e83ebb43aebf4c043d"> 84</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_shader_program.html#ab5fed4904a59c6e83ebb43aebf4c043d">AddVertexShaderFromSource</a>(<span class="keyword">const</span> std::string &amp;code);</div>
+<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; </div>
+<div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#acd94fc12beb85fe57aa80d3b825018b0"> 90</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_shader_program.html#acd94fc12beb85fe57aa80d3b825018b0">AddFragmentShaderFromFile</a>(<span class="keyword">const</span> std::string &amp;file);</div>
+<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; </div>
+<div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a7a3063ec42798c076e1ab0c0e6411e9c"> 94</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_shader_program.html#a7a3063ec42798c076e1ab0c0e6411e9c">AddFragmentShaderFromSource</a>(<span class="keyword">const</span> std::string &amp;code);</div>
+<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; </div>
+<div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#ad14c3a9a4ee1eef39f933bc46260c794"> 99</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_shader_program.html#ad14c3a9a4ee1eef39f933bc46260c794">LinkProgram</a>();</div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; </div>
+<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; </div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
+<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="comment">// ---- These should be called during rendering (e.g., in DrawUsingOpenGL()) ----</span></div>
+<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; </div>
+<div class="line"><a name="l00110"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#af1c968f1c79f70e183c9d1239d3d205e"> 110</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#af1c968f1c79f70e183c9d1239d3d205e">UseProgram</a>();</div>
+<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; </div>
+<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="comment">// Set Uniform Variables in the Shader</span></div>
+<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; </div>
+<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="comment">// MinGfx types</span></div>
+<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; </div>
+<div class="line"><a name="l00118"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a"> 118</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a">SetUniform</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;p);</div>
+<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; </div>
+<div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#aef58537d81bdb9d88a5f1c56a2b98b25"> 122</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#aef58537d81bdb9d88a5f1c56a2b98b25">SetUniform</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v);</div>
+<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; </div>
+<div class="line"><a name="l00126"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#ac59b3d0542ce45631876615eabf66487"> 126</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#ac59b3d0542ce45631876615eabf66487">SetUniform</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a> &amp;p);</div>
+<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; </div>
+<div class="line"><a name="l00130"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a0b3e6285354e007bf79a9ac1587f86f5"> 130</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a0b3e6285354e007bf79a9ac1587f86f5">SetUniform</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v);</div>
+<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; </div>
+<div class="line"><a name="l00134"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a766988eac957e9d810fdf2cbd2eafae0"> 134</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a766988eac957e9d810fdf2cbd2eafae0">SetUniform</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;m);</div>
+<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; </div>
+<div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a9ec2b53ba4bea7e48ef459530b8c6d60"> 138</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a9ec2b53ba4bea7e48ef459530b8c6d60">SetUniform</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_color.html">Color</a> &amp;c);</div>
+<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; </div>
+<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; </div>
+<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="comment">// built-in types</span></div>
+<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; </div>
+<div class="line"><a name="l00145"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#ab547dadc25582bec157b39de29d1419e"> 145</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#ab547dadc25582bec157b39de29d1419e">SetUniform</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">int</span> i);</div>
+<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; </div>
+<div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a707d2cb51a54151959c6570d6bfc7840"> 149</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a707d2cb51a54151959c6570d6bfc7840">SetUniform</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ui);</div>
+<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; </div>
+<div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a680fa87cb30343bb56abc48a090e823c"> 153</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a680fa87cb30343bb56abc48a090e823c">SetUniform</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">float</span> f);</div>
+<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; </div>
+<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; </div>
+<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="comment">// built-in types (arrays)</span></div>
+<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; </div>
+<div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a51cd1c1d194b2f5c07e81d4f579f2f2b"> 160</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a51cd1c1d194b2f5c07e81d4f579f2f2b">SetUniformArray1</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">int</span> *i, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; </div>
+<div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#abba87d2b0baca89232dbd1d6331875de"> 164</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#abba87d2b0baca89232dbd1d6331875de">SetUniformArray1</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *ui, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; </div>
+<div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a5c7891252d6b6c40982b56543820cd19"> 168</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a5c7891252d6b6c40982b56543820cd19">SetUniformArray1</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">float</span> *f, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; </div>
+<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; </div>
+<div class="line"><a name="l00173"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a9bab504c74a1c4258258b91afe9a9623"> 173</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a9bab504c74a1c4258258b91afe9a9623">SetUniformArray2</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">int</span> *i, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; </div>
+<div class="line"><a name="l00177"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a6fdca4b0ccaa8a0b2c8c68fd7645727c"> 177</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a6fdca4b0ccaa8a0b2c8c68fd7645727c">SetUniformArray2</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *ui, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; </div>
+<div class="line"><a name="l00181"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a93914cad6d8e751218c88010c51cf657"> 181</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a93914cad6d8e751218c88010c51cf657">SetUniformArray2</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">float</span> *f, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; </div>
+<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; </div>
+<div class="line"><a name="l00186"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#ac582a2aa74a83095e0b8e359ce432511"> 186</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#ac582a2aa74a83095e0b8e359ce432511">SetUniformArray3</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">int</span> *i, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; </div>
+<div class="line"><a name="l00190"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a8c31de93b17f050baecb5323a69bdbfa"> 190</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a8c31de93b17f050baecb5323a69bdbfa">SetUniformArray3</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *ui, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; </div>
+<div class="line"><a name="l00194"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#afc84377716296a57299ebbc01884b65d"> 194</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#afc84377716296a57299ebbc01884b65d">SetUniformArray3</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">float</span> *f, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; </div>
+<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; </div>
+<div class="line"><a name="l00199"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#ab06ef4682f801fca080a8f67dc6345ba"> 199</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#ab06ef4682f801fca080a8f67dc6345ba">SetUniformArray4</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">int</span> *i, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; </div>
+<div class="line"><a name="l00203"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a2854ad947f74432edc0b730462b7f695"> 203</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a2854ad947f74432edc0b730462b7f695">SetUniformArray4</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *ui, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; </div>
+<div class="line"><a name="l00207"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a9710cf4c72a7321b9a1ff1b86ae42da1"> 207</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a9710cf4c72a7321b9a1ff1b86ae42da1">SetUniformArray4</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">float</span> *f, <span class="keywordtype">int</span> count);</div>
+<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; </div>
+<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; </div>
+<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="comment">// Set Textures (Sampler Variables in the Shader)</span></div>
+<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; </div>
+<div class="line"><a name="l00215"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a4e5a2659f66f29433b15748f36c61ea2"> 215</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a4e5a2659f66f29433b15748f36c61ea2">BindTexture</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;tex);</div>
+<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; </div>
+<div class="line"><a name="l00219"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#af81d97c2843278eb40cdcdf8e5d54a96"> 219</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#af81d97c2843278eb40cdcdf8e5d54a96">BindTexture</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_texture2_d.html">Texture2D</a> &amp;tex, <span class="keywordtype">int</span> texUnit);</div>
+<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; </div>
+<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; </div>
+<div class="line"><a name="l00223"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da"> 223</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da">StopProgram</a>();</div>
+<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; </div>
+<div class="line"><a name="l00226"></a><span class="lineno"><a class="line" href="classmingfx_1_1_shader_program.html#a2eddd93e446ad2079d1c57676655ffbe"> 226</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_shader_program.html#a2eddd93e446ad2079d1c57676655ffbe">initialized</a>();</div>
+<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; </div>
+<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; GLuint vertexShader_;</div>
+<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; GLuint fragmentShader_;</div>
+<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; GLuint program_;</div>
+<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; std::map&lt;std::string, int&gt; texBindings_;</div>
+<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160;};</div>
+<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; </div>
+<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; </div>
+<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; </div>
+<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html"><div class="ttname"><a href="classmingfx_1_1_color.html">mingfx::Color</a></div><div class="ttdoc">Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with Op...</div><div class="ttdef"><b>Definition:</b> <a href="color_8h_source.html#l00041">color.h:41</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html"><div class="ttname"><a href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></div><div class="ttdoc">A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...</div><div class="ttdef"><b>Definition:</b> <a href="matrix4_8h_source.html#l00050">matrix4.h:50</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html"><div class="ttname"><a href="classmingfx_1_1_point2.html">mingfx::Point2</a></div><div class="ttdoc">A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...</div><div class="ttdef"><b>Definition:</b> <a href="point2_8h_source.html#l00028">point2.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html"><div class="ttname"><a href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></div><div class="ttdoc">A wrapper around GLSL shader programs.</div><div class="ttdef"><b>Definition:</b> <a href="shader__program_8h_source.html#l00066">shader_program.h:66</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a0b3e6285354e007bf79a9ac1587f86f5"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a0b3e6285354e007bf79a9ac1587f86f5">mingfx::ShaderProgram::SetUniform</a></div><div class="ttdeci">void SetUniform(const std::string &amp;name, const Vector3 &amp;v)</div><div class="ttdoc">Passes the x,y,z,0 values of vector v to the shader program and stores the result in the shader varia...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a0c3d86656c464223dc615cbec0943700"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a0c3d86656c464223dc615cbec0943700">mingfx::ShaderProgram::ShaderProgram</a></div><div class="ttdeci">ShaderProgram()</div><div class="ttdoc">Creates an empty ShaderProgram object.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a2854ad947f74432edc0b730462b7f695"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a2854ad947f74432edc0b730462b7f695">mingfx::ShaderProgram::SetUniformArray4</a></div><div class="ttdeci">void SetUniformArray4(const std::string &amp;name, unsigned int *ui, int count)</div><div class="ttdoc">Passes an array of count 4D unsigned int arrays to the shader program and stores the result in the sh...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a2e4d6db720bf22038270cf8c51cdf7da"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a2e4d6db720bf22038270cf8c51cdf7da">mingfx::ShaderProgram::StopProgram</a></div><div class="ttdeci">void StopProgram()</div><div class="ttdoc">Call this after rendering geometry to deactivate the shader.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a2eddd93e446ad2079d1c57676655ffbe"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a2eddd93e446ad2079d1c57676655ffbe">mingfx::ShaderProgram::initialized</a></div><div class="ttdeci">bool initialized()</div><div class="ttdoc">Returns true if the shader program has been successfully compiled and linked.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a461ba9368ad89fe1e9749b14b099027a"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a461ba9368ad89fe1e9749b14b099027a">mingfx::ShaderProgram::SetUniform</a></div><div class="ttdeci">void SetUniform(const std::string &amp;name, const Point2 &amp;p)</div><div class="ttdoc">Passes the x,y values of point p to the shader program and stores the result in the shader variable n...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a4e5a2659f66f29433b15748f36c61ea2"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a4e5a2659f66f29433b15748f36c61ea2">mingfx::ShaderProgram::BindTexture</a></div><div class="ttdeci">void BindTexture(const std::string &amp;name, const Texture2D &amp;tex)</div><div class="ttdoc">Binds a Texture2D to a sampler2D in the shader program. This version automatically selects an availab...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a51cd1c1d194b2f5c07e81d4f579f2f2b"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a51cd1c1d194b2f5c07e81d4f579f2f2b">mingfx::ShaderProgram::SetUniformArray1</a></div><div class="ttdeci">void SetUniformArray1(const std::string &amp;name, int *i, int count)</div><div class="ttdoc">Passes an array of count ints to the shader program and stores the result in the shader variable name...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a5c7891252d6b6c40982b56543820cd19"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a5c7891252d6b6c40982b56543820cd19">mingfx::ShaderProgram::SetUniformArray1</a></div><div class="ttdeci">void SetUniformArray1(const std::string &amp;name, float *f, int count)</div><div class="ttdoc">Passes an array of count floats to the shader program and stores the result in the shader variable na...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a63ac061271fad9338e922389d4a179e5"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a63ac061271fad9338e922389d4a179e5">mingfx::ShaderProgram::AddVertexShaderFromFile</a></div><div class="ttdeci">bool AddVertexShaderFromFile(const std::string &amp;file)</div><div class="ttdoc">Call during initialization but after the OpenGL context has been created (e.g., inside InitOpenGL())....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a680fa87cb30343bb56abc48a090e823c"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a680fa87cb30343bb56abc48a090e823c">mingfx::ShaderProgram::SetUniform</a></div><div class="ttdeci">void SetUniform(const std::string &amp;name, float f)</div><div class="ttdoc">Passes the float to the shader program and stores the result in the shader variable named name,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a6fdca4b0ccaa8a0b2c8c68fd7645727c"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a6fdca4b0ccaa8a0b2c8c68fd7645727c">mingfx::ShaderProgram::SetUniformArray2</a></div><div class="ttdeci">void SetUniformArray2(const std::string &amp;name, unsigned int *ui, int count)</div><div class="ttdoc">Passes an array of count 2D unsigned int arrays to the shader program and stores the result in the sh...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a707d2cb51a54151959c6570d6bfc7840"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a707d2cb51a54151959c6570d6bfc7840">mingfx::ShaderProgram::SetUniform</a></div><div class="ttdeci">void SetUniform(const std::string &amp;name, unsigned int ui)</div><div class="ttdoc">Passes the unsigned int to the shader program and stores the result in the shader variable named name...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a766988eac957e9d810fdf2cbd2eafae0"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a766988eac957e9d810fdf2cbd2eafae0">mingfx::ShaderProgram::SetUniform</a></div><div class="ttdeci">void SetUniform(const std::string &amp;name, const Matrix4 &amp;m)</div><div class="ttdoc">Passes the column-major 16 float values of matrix m to the shader program and stores the result in th...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a7a3063ec42798c076e1ab0c0e6411e9c"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a7a3063ec42798c076e1ab0c0e6411e9c">mingfx::ShaderProgram::AddFragmentShaderFromSource</a></div><div class="ttdeci">bool AddFragmentShaderFromSource(const std::string &amp;code)</div><div class="ttdoc">This loads and compiles a shader from a string. An error will be printed to stderr if there are any c...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a8c31de93b17f050baecb5323a69bdbfa"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a8c31de93b17f050baecb5323a69bdbfa">mingfx::ShaderProgram::SetUniformArray3</a></div><div class="ttdeci">void SetUniformArray3(const std::string &amp;name, unsigned int *ui, int count)</div><div class="ttdoc">Passes an array of count 3D unsigned int arrays to the shader program and stores the result in the sh...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a93914cad6d8e751218c88010c51cf657"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a93914cad6d8e751218c88010c51cf657">mingfx::ShaderProgram::SetUniformArray2</a></div><div class="ttdeci">void SetUniformArray2(const std::string &amp;name, float *f, int count)</div><div class="ttdoc">Passes an array of count 2D float arrays to the shader program and stores the result in the shader va...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a96da0dede354f2511084eeb25428edb4"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a96da0dede354f2511084eeb25428edb4">mingfx::ShaderProgram::~ShaderProgram</a></div><div class="ttdeci">virtual ~ShaderProgram()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a9710cf4c72a7321b9a1ff1b86ae42da1"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a9710cf4c72a7321b9a1ff1b86ae42da1">mingfx::ShaderProgram::SetUniformArray4</a></div><div class="ttdeci">void SetUniformArray4(const std::string &amp;name, float *f, int count)</div><div class="ttdoc">Passes an array of count 4D float arrays to the shader program and stores the result in the shader va...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a9bab504c74a1c4258258b91afe9a9623"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a9bab504c74a1c4258258b91afe9a9623">mingfx::ShaderProgram::SetUniformArray2</a></div><div class="ttdeci">void SetUniformArray2(const std::string &amp;name, int *i, int count)</div><div class="ttdoc">Passes an array of count 2D int arrays to the shader program and stores the result in the shader vari...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_a9ec2b53ba4bea7e48ef459530b8c6d60"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#a9ec2b53ba4bea7e48ef459530b8c6d60">mingfx::ShaderProgram::SetUniform</a></div><div class="ttdeci">void SetUniform(const std::string &amp;name, const Color &amp;c)</div><div class="ttdoc">Passes the r,g,b,a values of color c to the shader program and stores the result in the shader variab...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_ab06ef4682f801fca080a8f67dc6345ba"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#ab06ef4682f801fca080a8f67dc6345ba">mingfx::ShaderProgram::SetUniformArray4</a></div><div class="ttdeci">void SetUniformArray4(const std::string &amp;name, int *i, int count)</div><div class="ttdoc">Passes an array of count 4D int arrays to the shader program and stores the result in the shader vari...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_ab547dadc25582bec157b39de29d1419e"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#ab547dadc25582bec157b39de29d1419e">mingfx::ShaderProgram::SetUniform</a></div><div class="ttdeci">void SetUniform(const std::string &amp;name, int i)</div><div class="ttdoc">Passes the int to the shader program and stores the result in the shader variable named name,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_ab5fed4904a59c6e83ebb43aebf4c043d"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#ab5fed4904a59c6e83ebb43aebf4c043d">mingfx::ShaderProgram::AddVertexShaderFromSource</a></div><div class="ttdeci">bool AddVertexShaderFromSource(const std::string &amp;code)</div><div class="ttdoc">This loads and compiles a shader from a string. An error will be printed to stderr if there are any c...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_abba87d2b0baca89232dbd1d6331875de"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#abba87d2b0baca89232dbd1d6331875de">mingfx::ShaderProgram::SetUniformArray1</a></div><div class="ttdeci">void SetUniformArray1(const std::string &amp;name, unsigned int *ui, int count)</div><div class="ttdoc">Passes an array of count unsigned ints to the shader program and stores the result in the shader vari...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_ac582a2aa74a83095e0b8e359ce432511"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#ac582a2aa74a83095e0b8e359ce432511">mingfx::ShaderProgram::SetUniformArray3</a></div><div class="ttdeci">void SetUniformArray3(const std::string &amp;name, int *i, int count)</div><div class="ttdoc">Passes an array of count 3D int arrays to the shader program and stores the result in the shader vari...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_ac59b3d0542ce45631876615eabf66487"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#ac59b3d0542ce45631876615eabf66487">mingfx::ShaderProgram::SetUniform</a></div><div class="ttdeci">void SetUniform(const std::string &amp;name, const Point3 &amp;p)</div><div class="ttdoc">Passes the x,y,z,1 values of point p to the shader program and stores the result in the shader variab...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_acd94fc12beb85fe57aa80d3b825018b0"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#acd94fc12beb85fe57aa80d3b825018b0">mingfx::ShaderProgram::AddFragmentShaderFromFile</a></div><div class="ttdeci">bool AddFragmentShaderFromFile(const std::string &amp;file)</div><div class="ttdoc">Call during initialization but after the OpenGL context has been created (e.g., inside InitOpenGL())....</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_ad14c3a9a4ee1eef39f933bc46260c794"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#ad14c3a9a4ee1eef39f933bc46260c794">mingfx::ShaderProgram::LinkProgram</a></div><div class="ttdeci">bool LinkProgram()</div><div class="ttdoc">Call this after adding vertex and fragment shaders in order to link them together to create the full ...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_aef58537d81bdb9d88a5f1c56a2b98b25"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#aef58537d81bdb9d88a5f1c56a2b98b25">mingfx::ShaderProgram::SetUniform</a></div><div class="ttdeci">void SetUniform(const std::string &amp;name, const Vector2 &amp;v)</div><div class="ttdoc">Passes the x,y values of vector v to the shader program and stores the result in the shader variable ...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_af1c968f1c79f70e183c9d1239d3d205e"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#af1c968f1c79f70e183c9d1239d3d205e">mingfx::ShaderProgram::UseProgram</a></div><div class="ttdeci">void UseProgram()</div><div class="ttdoc">Call this first to make the shader program active, then call SetUniform() to pass data from your C++ ...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_af81d97c2843278eb40cdcdf8e5d54a96"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#af81d97c2843278eb40cdcdf8e5d54a96">mingfx::ShaderProgram::BindTexture</a></div><div class="ttdeci">void BindTexture(const std::string &amp;name, const Texture2D &amp;tex, int texUnit)</div><div class="ttdoc">Binds a Texture2D to a sampler2D in the shader program. This version allows you to specify the textur...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html_afc84377716296a57299ebbc01884b65d"><div class="ttname"><a href="classmingfx_1_1_shader_program.html#afc84377716296a57299ebbc01884b65d">mingfx::ShaderProgram::SetUniformArray3</a></div><div class="ttdeci">void SetUniformArray3(const std::string &amp;name, float *f, int count)</div><div class="ttdoc">Passes an array of count 3D float arrays to the shader program and stores the result in the shader va...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></div><div class="ttdoc">A wrapper around a 2D texture that supports loading images from files or setting texture color data d...</div><div class="ttdef"><b>Definition:</b> <a href="texture2d_8h_source.html#l00042">texture2d.h:42</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html"><div class="ttname"><a href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></div><div class="ttdoc">A 2D Vector with floating point coordinates, used for storing 2D translations, mouse movements,...</div><div class="ttdef"><b>Definition:</b> <a href="vector2_8h_source.html#l00028">vector2.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="acolor_8h_html"><div class="ttname"><a href="color_8h.html">color.h</a></div></div>
+<div class="ttc" id="amatrix4_8h_html"><div class="ttname"><a href="matrix4_8h.html">matrix4.h</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="aopengl__headers_8h_html"><div class="ttname"><a href="opengl__headers_8h.html">opengl_headers.h</a></div></div>
+<div class="ttc" id="apoint2_8h_html"><div class="ttname"><a href="point2_8h.html">point2.h</a></div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+<div class="ttc" id="atexture2d_8h_html"><div class="ttname"><a href="texture2d_8h.html">texture2d.h</a></div></div>
+<div class="ttc" id="avector2_8h_html"><div class="ttname"><a href="vector2_8h.html">vector2.h</a></div></div>
+<div class="ttc" id="avector3_8h_html"><div class="ttname"><a href="vector3_8h.html">vector3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/splitbar.png b/dev/MinGfx/docs/html/splitbar.png
new file mode 100644
index 0000000..fbb5e55
--- /dev/null
+++ b/dev/MinGfx/docs/html/splitbar.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/stb__rect__pack_8h.html b/dev/MinGfx/docs/html/stb__rect__pack_8h.html
new file mode 100644
index 0000000..654ccfc
--- /dev/null
+++ b/dev/MinGfx/docs/html/stb__rect__pack_8h.html
@@ -0,0 +1,403 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/stb_rect_pack.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">stb_rect_pack.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="stb__rect__pack_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__rect.html">stbrp_rect</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__node.html">stbrp_node</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__context.html">stbrp_context</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:af2f15dfcc6ad60b1df4f5902e2cc25ce"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stb__rect__pack_8h.html#af2f15dfcc6ad60b1df4f5902e2cc25ce">STB_RECT_PACK_VERSION</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:af2f15dfcc6ad60b1df4f5902e2cc25ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b73f2d2521fb81afc056a823e3ca753"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a>&#160;&#160;&#160;extern</td></tr>
+<tr class="separator:a0b73f2d2521fb81afc056a823e3ca753"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a0455046a8d5457bbc4f3f3ec995c338f"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structstbrp__context.html">stbrp_context</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stb__rect__pack_8h.html#a0455046a8d5457bbc4f3f3ec995c338f">stbrp_context</a></td></tr>
+<tr class="separator:a0455046a8d5457bbc4f3f3ec995c338f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8f871c209d2e6218baf9c0e2a209ea1"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structstbrp__node.html">stbrp_node</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stb__rect__pack_8h.html#ae8f871c209d2e6218baf9c0e2a209ea1">stbrp_node</a></td></tr>
+<tr class="separator:ae8f871c209d2e6218baf9c0e2a209ea1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c4a99b31ea2207a0b2bbcbdab8f3840"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structstbrp__rect.html">stbrp_rect</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stb__rect__pack_8h.html#a7c4a99b31ea2207a0b2bbcbdab8f3840">stbrp_rect</a></td></tr>
+<tr class="separator:a7c4a99b31ea2207a0b2bbcbdab8f3840"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac2c2491b95dea6a298b7423dc762dfd9"><td class="memItemLeft" align="right" valign="top">typedef unsigned short&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a></td></tr>
+<tr class="separator:ac2c2491b95dea6a298b7423dc762dfd9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:a06fc87d81c62e9abb8790b6e5713c55b"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom">{ <a class="el" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525">STBRP_HEURISTIC_Skyline_default</a> =0
+, <a class="el" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a">STBRP_HEURISTIC_Skyline_BL_sortHeight</a> = STBRP_HEURISTIC_Skyline_default
+, <a class="el" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c">STBRP_HEURISTIC_Skyline_BF_sortHeight</a>
+ }</td></tr>
+<tr class="separator:a06fc87d81c62e9abb8790b6e5713c55b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af038ae1b98573f24736c9a3eed0478ba"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stb__rect__pack_8h.html#af038ae1b98573f24736c9a3eed0478ba">stbrp_pack_rects</a> (<a class="el" href="structstbrp__context.html">stbrp_context</a> *context, <a class="el" href="structstbrp__rect.html">stbrp_rect</a> *rects, int num_rects)</td></tr>
+<tr class="separator:af038ae1b98573f24736c9a3eed0478ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b32f5ad458f614f5d419ef26cef5b3c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stb__rect__pack_8h.html#a8b32f5ad458f614f5d419ef26cef5b3c">stbrp_init_target</a> (<a class="el" href="structstbrp__context.html">stbrp_context</a> *context, int width, int height, <a class="el" href="structstbrp__node.html">stbrp_node</a> *nodes, int num_nodes)</td></tr>
+<tr class="separator:a8b32f5ad458f614f5d419ef26cef5b3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1babd70b223e571305fd9753a83a4fda"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stb__rect__pack_8h.html#a1babd70b223e571305fd9753a83a4fda">stbrp_setup_allow_out_of_mem</a> (<a class="el" href="structstbrp__context.html">stbrp_context</a> *context, int allow_out_of_mem)</td></tr>
+<tr class="separator:a1babd70b223e571305fd9753a83a4fda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a8223866c146933da3e152066bf61a1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stb__rect__pack_8h.html#a5a8223866c146933da3e152066bf61a1">stbrp_setup_heuristic</a> (<a class="el" href="structstbrp__context.html">stbrp_context</a> *context, int heuristic)</td></tr>
+<tr class="separator:a5a8223866c146933da3e152066bf61a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="af2f15dfcc6ad60b1df4f5902e2cc25ce"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af2f15dfcc6ad60b1df4f5902e2cc25ce">&#9670;&nbsp;</a></span>STB_RECT_PACK_VERSION</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define STB_RECT_PACK_VERSION&#160;&#160;&#160;1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00059">59</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a0b73f2d2521fb81afc056a823e3ca753"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0b73f2d2521fb81afc056a823e3ca753">&#9670;&nbsp;</a></span>STBRP_DEF</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define STBRP_DEF&#160;&#160;&#160;extern</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00064">64</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a0455046a8d5457bbc4f3f3ec995c338f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0455046a8d5457bbc4f3f3ec995c338f">&#9670;&nbsp;</a></span>stbrp_context</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef struct <a class="el" href="structstbrp__context.html">stbrp_context</a> <a class="el" href="structstbrp__context.html">stbrp_context</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00001">1</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="ac2c2491b95dea6a298b7423dc762dfd9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac2c2491b95dea6a298b7423dc762dfd9">&#9670;&nbsp;</a></span>stbrp_coord</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef unsigned short <a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00078">78</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="ae8f871c209d2e6218baf9c0e2a209ea1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae8f871c209d2e6218baf9c0e2a209ea1">&#9670;&nbsp;</a></span>stbrp_node</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef struct <a class="el" href="structstbrp__node.html">stbrp_node</a> <a class="el" href="structstbrp__node.html">stbrp_node</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00001">1</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a7c4a99b31ea2207a0b2bbcbdab8f3840"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7c4a99b31ea2207a0b2bbcbdab8f3840">&#9670;&nbsp;</a></span>stbrp_rect</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef struct <a class="el" href="structstbrp__rect.html">stbrp_rect</a> <a class="el" href="structstbrp__rect.html">stbrp_rect</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00001">1</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="a06fc87d81c62e9abb8790b6e5713c55b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a06fc87d81c62e9abb8790b6e5713c55b">&#9670;&nbsp;</a></span>anonymous enum</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525"></a>STBRP_HEURISTIC_Skyline_default&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a"></a>STBRP_HEURISTIC_Skyline_BL_sortHeight&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c"></a>STBRP_HEURISTIC_Skyline_BF_sortHeight&#160;</td><td class="fielddoc"></td></tr>
+</table>
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00153">153</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a8b32f5ad458f614f5d419ef26cef5b3c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8b32f5ad458f614f5d419ef26cef5b3c">&#9670;&nbsp;</a></span>stbrp_init_target()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> void stbrp_init_target </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structstbrp__context.html">stbrp_context</a> *&#160;</td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>height</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="structstbrp__node.html">stbrp_node</a> *&#160;</td>
+ <td class="paramname"><em>nodes</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>num_nodes</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="af038ae1b98573f24736c9a3eed0478ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af038ae1b98573f24736c9a3eed0478ba">&#9670;&nbsp;</a></span>stbrp_pack_rects()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> int stbrp_pack_rects </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structstbrp__context.html">stbrp_context</a> *&#160;</td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="structstbrp__rect.html">stbrp_rect</a> *&#160;</td>
+ <td class="paramname"><em>rects</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>num_rects</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a1babd70b223e571305fd9753a83a4fda"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1babd70b223e571305fd9753a83a4fda">&#9670;&nbsp;</a></span>stbrp_setup_allow_out_of_mem()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> void stbrp_setup_allow_out_of_mem </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structstbrp__context.html">stbrp_context</a> *&#160;</td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>allow_out_of_mem</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5a8223866c146933da3e152066bf61a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5a8223866c146933da3e152066bf61a1">&#9670;&nbsp;</a></span>stbrp_setup_heuristic()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> void stbrp_setup_heuristic </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structstbrp__context.html">stbrp_context</a> *&#160;</td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>heuristic</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/stb__rect__pack_8h_source.html b/dev/MinGfx/docs/html/stb__rect__pack_8h_source.html
new file mode 100644
index 0000000..2d2f39e
--- /dev/null
+++ b/dev/MinGfx/docs/html/stb__rect__pack_8h_source.html
@@ -0,0 +1,742 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/stb_rect_pack.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">stb_rect_pack.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="stb__rect__pack_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"><a class="line" href="stb__rect__pack_8h.html#a0455046a8d5457bbc4f3f3ec995c338f"> 1</a></span>&#160;<span class="comment">// stb_rect_pack.h - v0.11 - public domain - rectangle packing</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">// Sean Barrett 2014</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">// Useful for e.g. packing rectangular textures into an atlas.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// Does not do rotation.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment">// Not necessarily the awesomest packing method, but better than</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">// the totally naive one in stb_truetype (which is primarily what</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// this is meant to replace).</span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// Has only had a few tests run, may have issues.</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// More docs to come.</span></div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// No memory allocations; uses qsort() and assert() from stdlib.</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// Can override those by defining STBRP_SORT and STBRP_ASSERT.</span></div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// This library currently uses the Skyline Bottom-Left algorithm.</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">// Please note: better rectangle packers are welcome! Please</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">// implement them to the same API, but with a different init</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="comment">// function.</span></div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment">// Credits</span></div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment">// Library</span></div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment">// Sean Barrett</span></div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment">// Minor features</span></div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="comment">// Martins Mozeiko</span></div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="comment">// github:IntellectualKitty</span></div>
+<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="comment">// </span></div>
+<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="comment">// Bugfixes / warning fixes</span></div>
+<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="comment">// Jeremy Jaussaud</span></div>
+<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="comment">// Version history:</span></div>
+<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="comment">// 0.11 (2017-03-03) return packing success/fail result</span></div>
+<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="comment">// 0.10 (2016-10-25) remove cast-away-const to avoid warnings</span></div>
+<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="comment">// 0.09 (2016-08-27) fix compiler warnings</span></div>
+<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="comment">// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0)</span></div>
+<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment">// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0)</span></div>
+<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment">// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort</span></div>
+<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment">// 0.05: added STBRP_ASSERT to allow replacing assert</span></div>
+<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment">// 0.04: fixed minor bug in STBRP_LARGE_RECTS support</span></div>
+<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="comment">// 0.01: initial release</span></div>
+<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="comment">// LICENSE</span></div>
+<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment">// See end of file for license information.</span></div>
+<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; </div>
+<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="comment">// INCLUDE SECTION</span></div>
+<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; </div>
+<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="preprocessor">#ifndef STB_INCLUDE_STB_RECT_PACK_H</span></div>
+<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="preprocessor">#define STB_INCLUDE_STB_RECT_PACK_H</span></div>
+<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; </div>
+<div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="stb__rect__pack_8h.html#af2f15dfcc6ad60b1df4f5902e2cc25ce"> 59</a></span>&#160;<span class="preprocessor">#define STB_RECT_PACK_VERSION 1</span></div>
+<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; </div>
+<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="preprocessor">#ifdef STBRP_STATIC</span></div>
+<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="preprocessor">#define STBRP_DEF static</span></div>
+<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753"> 64</a></span>&#160;<span class="preprocessor">#define STBRP_DEF extern</span></div>
+<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
+<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div>
+<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div>
+<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; </div>
+<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structstbrp__context.html">stbrp_context</a> <a class="code" href="structstbrp__context.html">stbrp_context</a>;</div>
+<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structstbrp__node.html">stbrp_node</a> <a class="code" href="structstbrp__node.html">stbrp_node</a>;</div>
+<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structstbrp__rect.html">stbrp_rect</a> <a class="code" href="structstbrp__rect.html">stbrp_rect</a>;</div>
+<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; </div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;<span class="preprocessor">#ifdef STBRP_LARGE_RECTS</span></div>
+<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">int</span> <a class="code" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>;</div>
+<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00078"></a><span class="lineno"><a class="line" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9"> 78</a></span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>;</div>
+<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; </div>
+<div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="stb__rect__pack_8h.html#af038ae1b98573f24736c9a3eed0478ba"> 81</a></span>&#160;<a class="code" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> <span class="keywordtype">int</span> <a class="code" href="stb__rect__pack_8h.html#af038ae1b98573f24736c9a3eed0478ba">stbrp_pack_rects</a> (<a class="code" href="structstbrp__context.html">stbrp_context</a> *context, <a class="code" href="structstbrp__rect.html">stbrp_rect</a> *rects, <span class="keywordtype">int</span> num_rects);</div>
+<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;<span class="comment">// Assign packed locations to rectangles. The rectangles are of type</span></div>
+<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;<span class="comment">// &#39;stbrp_rect&#39; defined below, stored in the array &#39;rects&#39;, and there</span></div>
+<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;<span class="comment">// are &#39;num_rects&#39; many of them.</span></div>
+<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="comment">// Rectangles which are successfully packed have the &#39;was_packed&#39; flag</span></div>
+<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="comment">// set to a non-zero value and &#39;x&#39; and &#39;y&#39; store the minimum location</span></div>
+<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="comment">// on each axis (i.e. bottom-left in cartesian coordinates, top-left</span></div>
+<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;<span class="comment">// if you imagine y increasing downwards). Rectangles which do not fit</span></div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="comment">// have the &#39;was_packed&#39; flag set to 0.</span></div>
+<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;<span class="comment">// You should not try to access the &#39;rects&#39; array from another thread</span></div>
+<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="comment">// while this function is running, as the function temporarily reorders</span></div>
+<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;<span class="comment">// the array while it executes.</span></div>
+<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<span class="comment">// To pack into another rectangle, you need to call stbrp_init_target</span></div>
+<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;<span class="comment">// again. To continue packing into the same rectangle, you can call</span></div>
+<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="comment">// this function again. Calling this multiple times with multiple rect</span></div>
+<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;<span class="comment">// arrays will probably produce worse packing results than calling it</span></div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<span class="comment">// a single time with the full rectangle array, but the option is</span></div>
+<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;<span class="comment">// available.</span></div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160;<span class="comment">// The function returns 1 if all of the rectangles were successfully</span></div>
+<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;<span class="comment">// packed and 0 otherwise.</span></div>
+<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; </div>
+<div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="structstbrp__rect.html"> 106</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structstbrp__rect.html">stbrp_rect</a></div>
+<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;{</div>
+<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="comment">// reserved for your use:</span></div>
+<div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="structstbrp__rect.html#a92da8626bc99df041c0c3bfd01c25f7a"> 109</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structstbrp__rect.html#a92da8626bc99df041c0c3bfd01c25f7a">id</a>;</div>
+<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; </div>
+<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="comment">// input:</span></div>
+<div class="line"><a name="l00112"></a><span class="lineno"><a class="line" href="structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398"> 112</a></span>&#160; <a class="code" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a> <a class="code" href="structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5">w</a>, <a class="code" href="structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398">h</a>;</div>
+<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; </div>
+<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="comment">// output:</span></div>
+<div class="line"><a name="l00115"></a><span class="lineno"><a class="line" href="structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18"> 115</a></span>&#160; <a class="code" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a> <a class="code" href="structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18">x</a>, <a class="code" href="structstbrp__rect.html#ae3034c1fbf86043b568f5a4dddf946fa">y</a>;</div>
+<div class="line"><a name="l00116"></a><span class="lineno"><a class="line" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49"> 116</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">was_packed</a>; <span class="comment">// non-zero if valid packing</span></div>
+<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; </div>
+<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;}; <span class="comment">// 16 bytes, nominally</span></div>
+<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; </div>
+<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; </div>
+<div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="stb__rect__pack_8h.html#a8b32f5ad458f614f5d419ef26cef5b3c"> 121</a></span>&#160;<a class="code" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> <span class="keywordtype">void</span> <a class="code" href="stb__rect__pack_8h.html#a8b32f5ad458f614f5d419ef26cef5b3c">stbrp_init_target</a> (<a class="code" href="structstbrp__context.html">stbrp_context</a> *context, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height, <a class="code" href="structstbrp__node.html">stbrp_node</a> *nodes, <span class="keywordtype">int</span> num_nodes);</div>
+<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;<span class="comment">// Initialize a rectangle packer to:</span></div>
+<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;<span class="comment">// pack a rectangle that is &#39;width&#39; by &#39;height&#39; in dimensions</span></div>
+<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;<span class="comment">// using temporary storage provided by the array &#39;nodes&#39;, which is &#39;num_nodes&#39; long</span></div>
+<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;<span class="comment">// You must call this function every time you start packing into a new target.</span></div>
+<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;<span class="comment">// There is no &quot;shutdown&quot; function. The &#39;nodes&#39; memory must stay valid for</span></div>
+<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;<span class="comment">// the following stbrp_pack_rects() call (or calls), but can be freed after</span></div>
+<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;<span class="comment">// the call (or calls) finish.</span></div>
+<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;<span class="comment">// Note: to guarantee best results, either:</span></div>
+<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;<span class="comment">// 1. make sure &#39;num_nodes&#39; &gt;= &#39;width&#39;</span></div>
+<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;<span class="comment">// or 2. call stbrp_allow_out_of_mem() defined below with &#39;allow_out_of_mem = 1&#39;</span></div>
+<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;<span class="comment">// If you don&#39;t do either of the above things, widths will be quantized to multiples</span></div>
+<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;<span class="comment">// of small integers to guarantee the algorithm doesn&#39;t run out of temporary storage.</span></div>
+<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;<span class="comment">// If you do #2, then the non-quantized algorithm will be used, but the algorithm</span></div>
+<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;<span class="comment">// may run out of temporary storage and be unable to pack some rectangles.</span></div>
+<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; </div>
+<div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="stb__rect__pack_8h.html#a1babd70b223e571305fd9753a83a4fda"> 142</a></span>&#160;<a class="code" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> <span class="keywordtype">void</span> <a class="code" href="stb__rect__pack_8h.html#a1babd70b223e571305fd9753a83a4fda">stbrp_setup_allow_out_of_mem</a> (<a class="code" href="structstbrp__context.html">stbrp_context</a> *context, <span class="keywordtype">int</span> allow_out_of_mem);</div>
+<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;<span class="comment">// Optionally call this function after init but before doing any packing to</span></div>
+<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;<span class="comment">// change the handling of the out-of-temp-memory scenario, described above.</span></div>
+<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;<span class="comment">// If you call init again, this will be reset to the default (false).</span></div>
+<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; </div>
+<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; </div>
+<div class="line"><a name="l00148"></a><span class="lineno"><a class="line" href="stb__rect__pack_8h.html#a5a8223866c146933da3e152066bf61a1"> 148</a></span>&#160;<a class="code" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> <span class="keywordtype">void</span> <a class="code" href="stb__rect__pack_8h.html#a5a8223866c146933da3e152066bf61a1">stbrp_setup_heuristic</a> (<a class="code" href="structstbrp__context.html">stbrp_context</a> *context, <span class="keywordtype">int</span> heuristic);</div>
+<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160;<span class="comment">// Optionally select which packing heuristic the library should use. Different</span></div>
+<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;<span class="comment">// heuristics will produce better/worse results for different data sets.</span></div>
+<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;<span class="comment">// If you call init again, this will be reset to the default.</span></div>
+<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; </div>
+<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;<span class="keyword">enum</span></div>
+<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160;{</div>
+<div class="line"><a name="l00155"></a><span class="lineno"><a class="line" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525"> 155</a></span>&#160; <a class="code" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525">STBRP_HEURISTIC_Skyline_default</a>=0,</div>
+<div class="line"><a name="l00156"></a><span class="lineno"><a class="line" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a"> 156</a></span>&#160; <a class="code" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a">STBRP_HEURISTIC_Skyline_BL_sortHeight</a> = <a class="code" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525">STBRP_HEURISTIC_Skyline_default</a>,</div>
+<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <a class="code" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c">STBRP_HEURISTIC_Skyline_BF_sortHeight</a></div>
+<div class="line"><a name="l00158"></a><span class="lineno"><a class="line" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c"> 158</a></span>&#160;};</div>
+<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; </div>
+<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; </div>
+<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;<span class="comment">// the details of the following structures don&#39;t matter to you, but they must</span></div>
+<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;<span class="comment">// be visible so you can handle the memory allocations for them</span></div>
+<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; </div>
+<div class="line"><a name="l00166"></a><span class="lineno"><a class="line" href="structstbrp__node.html"> 166</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structstbrp__node.html">stbrp_node</a></div>
+<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;{</div>
+<div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea"> 168</a></span>&#160; <a class="code" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a> <a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a>,<a class="code" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">y</a>;</div>
+<div class="line"><a name="l00169"></a><span class="lineno"><a class="line" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4"> 169</a></span>&#160; <a class="code" href="structstbrp__node.html">stbrp_node</a> *<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;};</div>
+<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; </div>
+<div class="line"><a name="l00172"></a><span class="lineno"><a class="line" href="structstbrp__context.html"> 172</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structstbrp__context.html">stbrp_context</a></div>
+<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;{</div>
+<div class="line"><a name="l00174"></a><span class="lineno"><a class="line" href="structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2"> 174</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2">width</a>;</div>
+<div class="line"><a name="l00175"></a><span class="lineno"><a class="line" href="structstbrp__context.html#af3715a6f3faecfb4fac8f6ccbb71f9c7"> 175</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structstbrp__context.html#af3715a6f3faecfb4fac8f6ccbb71f9c7">height</a>;</div>
+<div class="line"><a name="l00176"></a><span class="lineno"><a class="line" href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481"> 176</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481">align</a>;</div>
+<div class="line"><a name="l00177"></a><span class="lineno"><a class="line" href="structstbrp__context.html#a007509feee322404083034e4c2d3dc5d"> 177</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structstbrp__context.html#a007509feee322404083034e4c2d3dc5d">init_mode</a>;</div>
+<div class="line"><a name="l00178"></a><span class="lineno"><a class="line" href="structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a"> 178</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a">heuristic</a>;</div>
+<div class="line"><a name="l00179"></a><span class="lineno"><a class="line" href="structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58"> 179</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58">num_nodes</a>;</div>
+<div class="line"><a name="l00180"></a><span class="lineno"><a class="line" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120"> 180</a></span>&#160; <a class="code" href="structstbrp__node.html">stbrp_node</a> *<a class="code" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">active_head</a>;</div>
+<div class="line"><a name="l00181"></a><span class="lineno"><a class="line" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839"> 181</a></span>&#160; <a class="code" href="structstbrp__node.html">stbrp_node</a> *<a class="code" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">free_head</a>;</div>
+<div class="line"><a name="l00182"></a><span class="lineno"><a class="line" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624"> 182</a></span>&#160; <a class="code" href="structstbrp__node.html">stbrp_node</a> <a class="code" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a>[2]; <span class="comment">// we allocate two extra nodes so optimal user-node-count is &#39;width&#39; not &#39;width+2&#39;</span></div>
+<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;};</div>
+<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; </div>
+<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div>
+<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;}</div>
+<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; </div>
+<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; </div>
+<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160;<span class="comment">// IMPLEMENTATION SECTION</span></div>
+<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; </div>
+<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;<span class="preprocessor">#ifdef STB_RECT_PACK_IMPLEMENTATION</span></div>
+<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160;<span class="preprocessor">#ifndef STBRP_SORT</span></div>
+<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160;<span class="preprocessor">#include &lt;stdlib.h&gt;</span></div>
+<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160;<span class="preprocessor">#define STBRP_SORT qsort</span></div>
+<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; </div>
+<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;<span class="preprocessor">#ifndef STBRP_ASSERT</span></div>
+<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;<span class="preprocessor">#include &lt;assert.h&gt;</span></div>
+<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;<span class="preprocessor">#define STBRP_ASSERT assert</span></div>
+<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; </div>
+<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;<span class="preprocessor">#ifdef _MSC_VER</span></div>
+<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;<span class="preprocessor">#define STBRP__NOTUSED(v) (void)(v)</span></div>
+<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160;<span class="preprocessor">#define STBRP__NOTUSED(v) (void)sizeof(v)</span></div>
+<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; </div>
+<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160;<span class="keyword">enum</span></div>
+<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;{</div>
+<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; STBRP__INIT_skyline = 1</div>
+<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160;};</div>
+<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; </div>
+<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160;<a class="code" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> <span class="keywordtype">void</span> <a class="code" href="stb__rect__pack_8h.html#a5a8223866c146933da3e152066bf61a1">stbrp_setup_heuristic</a>(<a class="code" href="structstbrp__context.html">stbrp_context</a> *context, <span class="keywordtype">int</span> heuristic)</div>
+<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160;{</div>
+<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <span class="keywordflow">switch</span> (context-&gt;<a class="code" href="structstbrp__context.html#a007509feee322404083034e4c2d3dc5d">init_mode</a>) {</div>
+<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keywordflow">case</span> STBRP__INIT_skyline:</div>
+<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; STBRP_ASSERT(heuristic == <a class="code" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a">STBRP_HEURISTIC_Skyline_BL_sortHeight</a> || heuristic == <a class="code" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c">STBRP_HEURISTIC_Skyline_BF_sortHeight</a>);</div>
+<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a">heuristic</a> = heuristic;</div>
+<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; STBRP_ASSERT(0);</div>
+<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; }</div>
+<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;}</div>
+<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; </div>
+<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160;<a class="code" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> <span class="keywordtype">void</span> <a class="code" href="stb__rect__pack_8h.html#a1babd70b223e571305fd9753a83a4fda">stbrp_setup_allow_out_of_mem</a>(<a class="code" href="structstbrp__context.html">stbrp_context</a> *context, <span class="keywordtype">int</span> allow_out_of_mem)</div>
+<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160;{</div>
+<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keywordflow">if</span> (allow_out_of_mem)</div>
+<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="comment">// if it&#39;s ok to run out of memory, then don&#39;t bother aligning them;</span></div>
+<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="comment">// this gives better packing, but may fail due to OOM (even though</span></div>
+<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="comment">// the rectangles easily fit). @TODO a smarter approach would be to only</span></div>
+<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="comment">// quantize once we&#39;ve hit OOM, then we could get rid of this parameter.</span></div>
+<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481">align</a> = 1;</div>
+<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keywordflow">else</span> {</div>
+<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="comment">// if it&#39;s not ok to run out of memory, then quantize the widths</span></div>
+<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="comment">// so that num_nodes is always enough nodes.</span></div>
+<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="comment">//</span></div>
+<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="comment">// I.e. num_nodes * align &gt;= width</span></div>
+<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="comment">// align &gt;= width / num_nodes</span></div>
+<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="comment">// align = ceil(width/num_nodes)</span></div>
+<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; </div>
+<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481">align</a> = (context-&gt;<a class="code" href="structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2">width</a> + context-&gt;<a class="code" href="structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58">num_nodes</a>-1) / context-&gt;<a class="code" href="structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58">num_nodes</a>;</div>
+<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; }</div>
+<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;}</div>
+<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; </div>
+<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160;<a class="code" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> <span class="keywordtype">void</span> <a class="code" href="stb__rect__pack_8h.html#a8b32f5ad458f614f5d419ef26cef5b3c">stbrp_init_target</a>(<a class="code" href="structstbrp__context.html">stbrp_context</a> *context, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height, <a class="code" href="structstbrp__node.html">stbrp_node</a> *nodes, <span class="keywordtype">int</span> num_nodes)</div>
+<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160;{</div>
+<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="keywordtype">int</span> i;</div>
+<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160;<span class="preprocessor">#ifndef STBRP_LARGE_RECTS</span></div>
+<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; STBRP_ASSERT(width &lt;= 0xffff &amp;&amp; height &lt;= 0xffff);</div>
+<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; </div>
+<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <span class="keywordflow">for</span> (i=0; i &lt; num_nodes-1; ++i)</div>
+<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; nodes[i].next = &amp;nodes[i+1];</div>
+<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; nodes[i].<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a> = NULL;</div>
+<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a007509feee322404083034e4c2d3dc5d">init_mode</a> = STBRP__INIT_skyline;</div>
+<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a">heuristic</a> = <a class="code" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525">STBRP_HEURISTIC_Skyline_default</a>;</div>
+<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">free_head</a> = &amp;nodes[0];</div>
+<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">active_head</a> = &amp;context-&gt;<a class="code" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a>[0];</div>
+<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2">width</a> = width;</div>
+<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#af3715a6f3faecfb4fac8f6ccbb71f9c7">height</a> = height;</div>
+<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58">num_nodes</a> = num_nodes;</div>
+<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <a class="code" href="stb__rect__pack_8h.html#a1babd70b223e571305fd9753a83a4fda">stbrp_setup_allow_out_of_mem</a>(context, 0);</div>
+<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; </div>
+<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="comment">// node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly)</span></div>
+<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a>[0].<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> = 0;</div>
+<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a>[0].<a class="code" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">y</a> = 0;</div>
+<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a>[0].<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a> = &amp;context-&gt;<a class="code" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a>[1];</div>
+<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a>[1].<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> = (<a class="code" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>) width;</div>
+<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160;<span class="preprocessor">#ifdef STBRP_LARGE_RECTS</span></div>
+<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a>[1].<a class="code" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">y</a> = (1&lt;&lt;30);</div>
+<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a>[1].<a class="code" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">y</a> = 65535;</div>
+<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a>[1].<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a> = NULL;</div>
+<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160;}</div>
+<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; </div>
+<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;<span class="comment">// find minimum y position if it starts at x1</span></div>
+<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160;<span class="keyword">static</span> <span class="keywordtype">int</span> stbrp__skyline_find_min_y(<a class="code" href="structstbrp__context.html">stbrp_context</a> *c, <a class="code" href="structstbrp__node.html">stbrp_node</a> *first, <span class="keywordtype">int</span> x0, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> *pwaste)</div>
+<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160;{</div>
+<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <a class="code" href="structstbrp__node.html">stbrp_node</a> *node = first;</div>
+<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="keywordtype">int</span> x1 = x0 + width;</div>
+<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="keywordtype">int</span> min_y, visited_width, waste_area;</div>
+<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; </div>
+<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; STBRP__NOTUSED(c);</div>
+<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; </div>
+<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; STBRP_ASSERT(first-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt;= x0);</div>
+<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; </div>
+<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160;<span class="preprocessor"> #if 0</span></div>
+<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="comment">// skip in case we&#39;re past the node</span></div>
+<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="keywordflow">while</span> (node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt;= x0)</div>
+<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; ++node;</div>
+<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160;<span class="preprocessor"> #else</span></div>
+<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; STBRP_ASSERT(node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &gt; x0); <span class="comment">// we ended up handling this in the caller for efficiency</span></div>
+<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160;<span class="preprocessor"> #endif</span></div>
+<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; </div>
+<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; STBRP_ASSERT(node-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt;= x0);</div>
+<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; </div>
+<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; min_y = 0;</div>
+<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; waste_area = 0;</div>
+<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; visited_width = 0;</div>
+<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keywordflow">while</span> (node-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt; x1) {</div>
+<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="keywordflow">if</span> (node-&gt;<a class="code" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">y</a> &gt; min_y) {</div>
+<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <span class="comment">// raise min_y higher.</span></div>
+<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="comment">// we&#39;ve accounted for all waste up to min_y,</span></div>
+<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="comment">// but we&#39;ll now add more waste for everything we&#39;ve visted</span></div>
+<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; waste_area += visited_width * (node-&gt;<a class="code" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">y</a> - min_y);</div>
+<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; min_y = node-&gt;<a class="code" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">y</a>;</div>
+<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="comment">// the first time through, visited_width might be reduced</span></div>
+<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordflow">if</span> (node-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt; x0)</div>
+<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; visited_width += node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> - x0;</div>
+<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; visited_width += node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> - node-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a>;</div>
+<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; } <span class="keywordflow">else</span> {</div>
+<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="comment">// add waste area</span></div>
+<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <span class="keywordtype">int</span> under_width = node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> - node-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a>;</div>
+<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keywordflow">if</span> (under_width + visited_width &gt; width)</div>
+<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; under_width = width - visited_width;</div>
+<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; waste_area += under_width * (min_y - node-&gt;<a class="code" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">y</a>);</div>
+<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; visited_width += under_width;</div>
+<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; }</div>
+<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; node = node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; }</div>
+<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; </div>
+<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; *pwaste = waste_area;</div>
+<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="keywordflow">return</span> min_y;</div>
+<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160;}</div>
+<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; </div>
+<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct</span></div>
+<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160;{</div>
+<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="keywordtype">int</span> x,y;</div>
+<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <a class="code" href="structstbrp__node.html">stbrp_node</a> **prev_link;</div>
+<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160;} stbrp__findresult;</div>
+<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; </div>
+<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160;<span class="keyword">static</span> stbrp__findresult stbrp__skyline_find_best_pos(<a class="code" href="structstbrp__context.html">stbrp_context</a> *c, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height)</div>
+<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160;{</div>
+<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <span class="keywordtype">int</span> best_waste = (1&lt;&lt;30), best_x, best_y = (1 &lt;&lt; 30);</div>
+<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; stbrp__findresult fr;</div>
+<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <a class="code" href="structstbrp__node.html">stbrp_node</a> **prev, *node, *tail, **best = NULL;</div>
+<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; </div>
+<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="comment">// align to multiple of c-&gt;align</span></div>
+<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; width = (width + c-&gt;<a class="code" href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481">align</a> - 1);</div>
+<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; width -= width % c-&gt;<a class="code" href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481">align</a>;</div>
+<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; STBRP_ASSERT(width % c-&gt;<a class="code" href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481">align</a> == 0);</div>
+<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; </div>
+<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; node = c-&gt;<a class="code" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">active_head</a>;</div>
+<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; prev = &amp;c-&gt;<a class="code" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">active_head</a>;</div>
+<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">while</span> (node-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> + width &lt;= c-&gt;width) {</div>
+<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="keywordtype">int</span> y,waste;</div>
+<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; y = stbrp__skyline_find_min_y(c, node, node-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a>, width, &amp;waste);</div>
+<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keywordflow">if</span> (c-&gt;<a class="code" href="structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a">heuristic</a> == <a class="code" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a">STBRP_HEURISTIC_Skyline_BL_sortHeight</a>) { <span class="comment">// actually just want to test BL</span></div>
+<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="comment">// bottom left</span></div>
+<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="keywordflow">if</span> (y &lt; best_y) {</div>
+<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; best_y = y;</div>
+<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; best = prev;</div>
+<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; }</div>
+<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; } <span class="keywordflow">else</span> {</div>
+<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="comment">// best-fit</span></div>
+<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keywordflow">if</span> (y + height &lt;= c-&gt;height) {</div>
+<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="comment">// can only use it if it first vertically</span></div>
+<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keywordflow">if</span> (y &lt; best_y || (y == best_y &amp;&amp; waste &lt; best_waste)) {</div>
+<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; best_y = y;</div>
+<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; best_waste = waste;</div>
+<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; best = prev;</div>
+<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; }</div>
+<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; }</div>
+<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; }</div>
+<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; prev = &amp;node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; node = node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; }</div>
+<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; </div>
+<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; best_x = (best == NULL) ? 0 : (*best)-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a>;</div>
+<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; </div>
+<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; <span class="comment">// if doing best-fit (BF), we also have to try aligning right edge to each node position</span></div>
+<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="comment">//</span></div>
+<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="comment">// e.g, if fitting</span></div>
+<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="comment">//</span></div>
+<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="comment">// ____________________</span></div>
+<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="comment">// |____________________|</span></div>
+<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; <span class="comment">//</span></div>
+<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="comment">// into</span></div>
+<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="comment">//</span></div>
+<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="comment">// | |</span></div>
+<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="comment">// | ____________|</span></div>
+<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; <span class="comment">// |____________|</span></div>
+<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="comment">//</span></div>
+<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="comment">// then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned</span></div>
+<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <span class="comment">//</span></div>
+<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="comment">// This makes BF take about 2x the time</span></div>
+<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; </div>
+<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; if (c-&gt;<a class="code" href="structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a">heuristic</a> == <a class="code" href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c">STBRP_HEURISTIC_Skyline_BF_sortHeight</a>) {</div>
+<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; tail = c-&gt;<a class="code" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">active_head</a>;</div>
+<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; node = c-&gt;<a class="code" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">active_head</a>;</div>
+<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; prev = &amp;c-&gt;<a class="code" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">active_head</a>;</div>
+<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="comment">// find first node that&#39;s admissible</span></div>
+<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="keywordflow">while</span> (tail-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt; width)</div>
+<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; tail = tail-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keywordflow">while</span> (tail) {</div>
+<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="keywordtype">int</span> xpos = tail-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> - width;</div>
+<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="keywordtype">int</span> y,waste;</div>
+<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; STBRP_ASSERT(xpos &gt;= 0);</div>
+<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="comment">// find the left position that matches this</span></div>
+<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keywordflow">while</span> (node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt;= xpos) {</div>
+<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; prev = &amp;node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; node = node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; }</div>
+<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; STBRP_ASSERT(node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &gt; xpos &amp;&amp; node-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt;= xpos);</div>
+<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; y = stbrp__skyline_find_min_y(c, node, xpos, width, &amp;waste);</div>
+<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="keywordflow">if</span> (y + height &lt; c-&gt;height) {</div>
+<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="keywordflow">if</span> (y &lt;= best_y) {</div>
+<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keywordflow">if</span> (y &lt; best_y || waste &lt; best_waste || (waste==best_waste &amp;&amp; xpos &lt; best_x)) {</div>
+<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; best_x = xpos;</div>
+<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; STBRP_ASSERT(y &lt;= best_y);</div>
+<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; best_y = y;</div>
+<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; best_waste = waste;</div>
+<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; best = prev;</div>
+<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; }</div>
+<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; }</div>
+<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; }</div>
+<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; tail = tail-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; } </div>
+<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; }</div>
+<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; </div>
+<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; fr.prev_link = best;</div>
+<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; fr.<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> = best_x;</div>
+<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; fr.y = best_y;</div>
+<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <span class="keywordflow">return</span> fr;</div>
+<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160;}</div>
+<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; </div>
+<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;<span class="keyword">static</span> stbrp__findresult stbrp__skyline_pack_rectangle(<a class="code" href="structstbrp__context.html">stbrp_context</a> *context, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height)</div>
+<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160;{</div>
+<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="comment">// find best position according to heuristic</span></div>
+<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height);</div>
+<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <a class="code" href="structstbrp__node.html">stbrp_node</a> *node, *cur;</div>
+<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; </div>
+<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="comment">// bail if:</span></div>
+<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="comment">// 1. it failed</span></div>
+<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="comment">// 2. the best node doesn&#39;t fit (we don&#39;t always check this)</span></div>
+<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="comment">// 3. we&#39;re out of memory</span></div>
+<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <span class="keywordflow">if</span> (res.prev_link == NULL || res.y + height &gt; context-&gt;<a class="code" href="structstbrp__context.html#af3715a6f3faecfb4fac8f6ccbb71f9c7">height</a> || context-&gt;<a class="code" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">free_head</a> == NULL) {</div>
+<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; res.prev_link = NULL;</div>
+<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; }</div>
+<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; </div>
+<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="comment">// on success, create new node</span></div>
+<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; node = context-&gt;<a class="code" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">free_head</a>;</div>
+<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; node-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> = (<a class="code" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>) res.x;</div>
+<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; node-&gt;<a class="code" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">y</a> = (<a class="code" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>) (res.y + height);</div>
+<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; </div>
+<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">free_head</a> = node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; </div>
+<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <span class="comment">// insert the new node into the right starting point, and</span></div>
+<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <span class="comment">// let &#39;cur&#39; point to the remaining nodes needing to be</span></div>
+<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="comment">// stiched back in</span></div>
+<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; </div>
+<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; cur = *res.prev_link;</div>
+<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="keywordflow">if</span> (cur-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt; res.x) {</div>
+<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="comment">// preserve the existing one, so start testing with the next one</span></div>
+<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <a class="code" href="structstbrp__node.html">stbrp_node</a> *next = cur-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; cur-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a> = node;</div>
+<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; cur = next;</div>
+<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; } <span class="keywordflow">else</span> {</div>
+<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; *res.prev_link = node;</div>
+<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; }</div>
+<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; </div>
+<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="comment">// from here, traverse cur and free the nodes, until we get to one</span></div>
+<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="comment">// that shouldn&#39;t be freed</span></div>
+<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <span class="keywordflow">while</span> (cur-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a> &amp;&amp; cur-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt;= res.x + width) {</div>
+<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <a class="code" href="structstbrp__node.html">stbrp_node</a> *next = cur-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <span class="comment">// move the current node to the free list</span></div>
+<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; cur-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a> = context-&gt;<a class="code" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">free_head</a>;</div>
+<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; context-&gt;<a class="code" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">free_head</a> = cur;</div>
+<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; cur = next;</div>
+<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; }</div>
+<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; </div>
+<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="comment">// stitch the list back in</span></div>
+<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; node-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a> = cur;</div>
+<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; </div>
+<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="keywordflow">if</span> (cur-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt; res.x + width)</div>
+<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; cur-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> = (<a class="code" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>) (res.x + width);</div>
+<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; </div>
+<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160;<span class="preprocessor">#ifdef _DEBUG</span></div>
+<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; cur = context-&gt;<a class="code" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">active_head</a>;</div>
+<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="keywordflow">while</span> (cur-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt; context-&gt;<a class="code" href="structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2">width</a>) {</div>
+<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; STBRP_ASSERT(cur-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a> &lt; cur-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>-&gt;<a class="code" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a>);</div>
+<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; cur = cur-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; }</div>
+<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; STBRP_ASSERT(cur-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a> == NULL);</div>
+<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; </div>
+<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; {</div>
+<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; <a class="code" href="structstbrp__node.html">stbrp_node</a> *L1 = NULL, *L2 = NULL;</div>
+<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; <span class="keywordtype">int</span> count=0;</div>
+<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; cur = context-&gt;<a class="code" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">active_head</a>;</div>
+<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <span class="keywordflow">while</span> (cur) {</div>
+<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; L1 = cur;</div>
+<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; cur = cur-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; ++count;</div>
+<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; }</div>
+<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; cur = context-&gt;<a class="code" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">free_head</a>;</div>
+<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="keywordflow">while</span> (cur) {</div>
+<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; L2 = cur;</div>
+<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; cur = cur-&gt;<a class="code" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a>;</div>
+<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; ++count;</div>
+<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; }</div>
+<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; STBRP_ASSERT(count == context-&gt;<a class="code" href="structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58">num_nodes</a>+2);</div>
+<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; }</div>
+<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; </div>
+<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160;}</div>
+<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; </div>
+<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160;<span class="keyword">static</span> <span class="keywordtype">int</span> rect_height_compare(<span class="keyword">const</span> <span class="keywordtype">void</span> *a, <span class="keyword">const</span> <span class="keywordtype">void</span> *b)</div>
+<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160;{</div>
+<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keyword">const</span> <a class="code" href="structstbrp__rect.html">stbrp_rect</a> *p = (<span class="keyword">const</span> <a class="code" href="structstbrp__rect.html">stbrp_rect</a> *) a;</div>
+<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="keyword">const</span> <a class="code" href="structstbrp__rect.html">stbrp_rect</a> *q = (<span class="keyword">const</span> <a class="code" href="structstbrp__rect.html">stbrp_rect</a> *) b;</div>
+<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="keywordflow">if</span> (p-&gt;<a class="code" href="structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398">h</a> &gt; q-&gt;<a class="code" href="structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398">h</a>)</div>
+<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="keywordflow">return</span> -1;</div>
+<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="keywordflow">if</span> (p-&gt;<a class="code" href="structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398">h</a> &lt; q-&gt;<a class="code" href="structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398">h</a>)</div>
+<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="keywordflow">return</span> 1;</div>
+<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <span class="keywordflow">return</span> (p-&gt;<a class="code" href="structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5">w</a> &gt; q-&gt;<a class="code" href="structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5">w</a>) ? -1 : (p-&gt;<a class="code" href="structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5">w</a> &lt; q-&gt;<a class="code" href="structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5">w</a>);</div>
+<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160;}</div>
+<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; </div>
+<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160;<span class="keyword">static</span> <span class="keywordtype">int</span> rect_original_order(<span class="keyword">const</span> <span class="keywordtype">void</span> *a, <span class="keyword">const</span> <span class="keywordtype">void</span> *b)</div>
+<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160;{</div>
+<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; <span class="keyword">const</span> <a class="code" href="structstbrp__rect.html">stbrp_rect</a> *p = (<span class="keyword">const</span> <a class="code" href="structstbrp__rect.html">stbrp_rect</a> *) a;</div>
+<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <span class="keyword">const</span> <a class="code" href="structstbrp__rect.html">stbrp_rect</a> *q = (<span class="keyword">const</span> <a class="code" href="structstbrp__rect.html">stbrp_rect</a> *) b;</div>
+<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="keywordflow">return</span> (p-&gt;<a class="code" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">was_packed</a> &lt; q-&gt;<a class="code" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">was_packed</a>) ? -1 : (p-&gt;<a class="code" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">was_packed</a> &gt; q-&gt;<a class="code" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">was_packed</a>);</div>
+<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160;}</div>
+<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; </div>
+<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160;<span class="preprocessor">#ifdef STBRP_LARGE_RECTS</span></div>
+<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160;<span class="preprocessor">#define STBRP__MAXVAL 0xffffffff</span></div>
+<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160;<span class="preprocessor">#define STBRP__MAXVAL 0xffff</span></div>
+<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; </div>
+<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160;<a class="code" href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a> <span class="keywordtype">int</span> <a class="code" href="stb__rect__pack_8h.html#af038ae1b98573f24736c9a3eed0478ba">stbrp_pack_rects</a>(<a class="code" href="structstbrp__context.html">stbrp_context</a> *context, <a class="code" href="structstbrp__rect.html">stbrp_rect</a> *rects, <span class="keywordtype">int</span> num_rects)</div>
+<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160;{</div>
+<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <span class="keywordtype">int</span> i, all_rects_packed = 1;</div>
+<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; </div>
+<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="comment">// we use the &#39;was_packed&#39; field internally to allow sorting/unsorting</span></div>
+<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="keywordflow">for</span> (i=0; i &lt; num_rects; ++i) {</div>
+<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; rects[i].<a class="code" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">was_packed</a> = i;</div>
+<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160;<span class="preprocessor"> #ifndef STBRP_LARGE_RECTS</span></div>
+<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; STBRP_ASSERT(rects[i].w &lt;= 0xffff &amp;&amp; rects[i].h &lt;= 0xffff);</div>
+<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160;<span class="preprocessor"> #endif</span></div>
+<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; }</div>
+<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; </div>
+<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="comment">// sort according to heuristic</span></div>
+<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; STBRP_SORT(rects, num_rects, <span class="keyword">sizeof</span>(rects[0]), rect_height_compare);</div>
+<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; </div>
+<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="keywordflow">for</span> (i=0; i &lt; num_rects; ++i) {</div>
+<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="keywordflow">if</span> (rects[i].w == 0 || rects[i].h == 0) {</div>
+<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; rects[i].<a class="code" href="structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18">x</a> = rects[i].<a class="code" href="structstbrp__rect.html#ae3034c1fbf86043b568f5a4dddf946fa">y</a> = 0; <span class="comment">// empty rect needs no space</span></div>
+<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; } <span class="keywordflow">else</span> {</div>
+<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);</div>
+<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="keywordflow">if</span> (fr.prev_link) {</div>
+<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; rects[i].<a class="code" href="structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18">x</a> = (<a class="code" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>) fr.x;</div>
+<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; rects[i].y = (<a class="code" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>) fr.y;</div>
+<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; } <span class="keywordflow">else</span> {</div>
+<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; rects[i].<a class="code" href="structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18">x</a> = rects[i].<a class="code" href="structstbrp__rect.html#ae3034c1fbf86043b568f5a4dddf946fa">y</a> = STBRP__MAXVAL;</div>
+<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; }</div>
+<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; }</div>
+<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; }</div>
+<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; </div>
+<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="comment">// unsort</span></div>
+<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; STBRP_SORT(rects, num_rects, <span class="keyword">sizeof</span>(rects[0]), rect_original_order);</div>
+<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; </div>
+<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <span class="comment">// set was_packed flags and all_rects_packed status</span></div>
+<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <span class="keywordflow">for</span> (i=0; i &lt; num_rects; ++i) {</div>
+<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; rects[i].<a class="code" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">was_packed</a> = !(rects[i].<a class="code" href="structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18">x</a> == STBRP__MAXVAL &amp;&amp; rects[i].<a class="code" href="structstbrp__rect.html#ae3034c1fbf86043b568f5a4dddf946fa">y</a> == STBRP__MAXVAL);</div>
+<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <span class="keywordflow">if</span> (!rects[i].was_packed)</div>
+<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; all_rects_packed = 0;</div>
+<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; }</div>
+<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; </div>
+<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; <span class="comment">// return the all_rects_packed status</span></div>
+<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <span class="keywordflow">return</span> all_rects_packed;</div>
+<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160;}</div>
+<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; </div>
+<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160;<span class="comment">------------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160;<span class="comment">This software is available under 2 licenses -- choose whichever you prefer.</span></div>
+<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160;<span class="comment">------------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160;<span class="comment">ALTERNATIVE A - MIT License</span></div>
+<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160;<span class="comment">Copyright (c) 2017 Sean Barrett</span></div>
+<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160;<span class="comment">Permission is hereby granted, free of charge, to any person obtaining a copy of </span></div>
+<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160;<span class="comment">this software and associated documentation files (the &quot;Software&quot;), to deal in </span></div>
+<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160;<span class="comment">the Software without restriction, including without limitation the rights to </span></div>
+<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160;<span class="comment">use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies </span></div>
+<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160;<span class="comment">of the Software, and to permit persons to whom the Software is furnished to do </span></div>
+<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160;<span class="comment">so, subject to the following conditions:</span></div>
+<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160;<span class="comment">The above copyright notice and this permission notice shall be included in all </span></div>
+<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160;<span class="comment">copies or substantial portions of the Software.</span></div>
+<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160;<span class="comment">THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR </span></div>
+<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160;<span class="comment">IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, </span></div>
+<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160;<span class="comment">FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE </span></div>
+<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160;<span class="comment">AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER </span></div>
+<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160;<span class="comment">LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, </span></div>
+<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160;<span class="comment">OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE </span></div>
+<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160;<span class="comment">SOFTWARE.</span></div>
+<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160;<span class="comment">------------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160;<span class="comment">ALTERNATIVE B - Public Domain (www.unlicense.org)</span></div>
+<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160;<span class="comment">This is free and unencumbered software released into the public domain.</span></div>
+<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160;<span class="comment">Anyone is free to copy, modify, publish, use, compile, sell, or distribute this </span></div>
+<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160;<span class="comment">software, either in source code form or as a compiled binary, for any purpose, </span></div>
+<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160;<span class="comment">commercial or non-commercial, and by any means.</span></div>
+<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160;<span class="comment">In jurisdictions that recognize copyright laws, the author or authors of this </span></div>
+<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;<span class="comment">software dedicate any and all copyright interest in the software to the public </span></div>
+<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160;<span class="comment">domain. We make this dedication for the benefit of the public at large and to </span></div>
+<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;<span class="comment">the detriment of our heirs and successors. We intend this dedication to be an </span></div>
+<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160;<span class="comment">overt act of relinquishment in perpetuity of all present and future rights to </span></div>
+<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;<span class="comment">this software under copyright law.</span></div>
+<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160;<span class="comment">THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR </span></div>
+<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160;<span class="comment">IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, </span></div>
+<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160;<span class="comment">FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE </span></div>
+<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160;<span class="comment">AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN </span></div>
+<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160;<span class="comment">ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION </span></div>
+<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160;<span class="comment">WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</span></div>
+<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;<span class="comment">------------------------------------------------------------------------------</span></div>
+<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160;<span class="comment">*/</span></div>
+<div class="ttc" id="astb__rect__pack_8h_html_a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c"><div class="ttname"><a href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba11d62749c4405a231a6fd1dd9d46615c">STBRP_HEURISTIC_Skyline_BF_sortHeight</a></div><div class="ttdeci">@ STBRP_HEURISTIC_Skyline_BF_sortHeight</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00158">stb_rect_pack.h:157</a></div></div>
+<div class="ttc" id="astb__rect__pack_8h_html_a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a"><div class="ttname"><a href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba13530b067fb1f9707dc0f9d51f8b074a">STBRP_HEURISTIC_Skyline_BL_sortHeight</a></div><div class="ttdeci">@ STBRP_HEURISTIC_Skyline_BL_sortHeight</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00156">stb_rect_pack.h:156</a></div></div>
+<div class="ttc" id="astb__rect__pack_8h_html_a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525"><div class="ttname"><a href="stb__rect__pack_8h.html#a06fc87d81c62e9abb8790b6e5713c55ba5e4dd0b1cbee654bbfeebc5311f03525">STBRP_HEURISTIC_Skyline_default</a></div><div class="ttdeci">@ STBRP_HEURISTIC_Skyline_default</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00155">stb_rect_pack.h:155</a></div></div>
+<div class="ttc" id="astb__rect__pack_8h_html_a0b73f2d2521fb81afc056a823e3ca753"><div class="ttname"><a href="stb__rect__pack_8h.html#a0b73f2d2521fb81afc056a823e3ca753">STBRP_DEF</a></div><div class="ttdeci">#define STBRP_DEF</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00064">stb_rect_pack.h:64</a></div></div>
+<div class="ttc" id="astb__rect__pack_8h_html_a1babd70b223e571305fd9753a83a4fda"><div class="ttname"><a href="stb__rect__pack_8h.html#a1babd70b223e571305fd9753a83a4fda">stbrp_setup_allow_out_of_mem</a></div><div class="ttdeci">STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem)</div></div>
+<div class="ttc" id="astb__rect__pack_8h_html_a5a8223866c146933da3e152066bf61a1"><div class="ttname"><a href="stb__rect__pack_8h.html#a5a8223866c146933da3e152066bf61a1">stbrp_setup_heuristic</a></div><div class="ttdeci">STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic)</div></div>
+<div class="ttc" id="astb__rect__pack_8h_html_a8b32f5ad458f614f5d419ef26cef5b3c"><div class="ttname"><a href="stb__rect__pack_8h.html#a8b32f5ad458f614f5d419ef26cef5b3c">stbrp_init_target</a></div><div class="ttdeci">STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes)</div></div>
+<div class="ttc" id="astb__rect__pack_8h_html_ac2c2491b95dea6a298b7423dc762dfd9"><div class="ttname"><a href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a></div><div class="ttdeci">unsigned short stbrp_coord</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00078">stb_rect_pack.h:78</a></div></div>
+<div class="ttc" id="astb__rect__pack_8h_html_af038ae1b98573f24736c9a3eed0478ba"><div class="ttname"><a href="stb__rect__pack_8h.html#af038ae1b98573f24736c9a3eed0478ba">stbrp_pack_rects</a></div><div class="ttdeci">STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects)</div></div>
+<div class="ttc" id="astructstbrp__context_html"><div class="ttname"><a href="structstbrp__context.html">stbrp_context</a></div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00172">stb_rect_pack.h:173</a></div></div>
+<div class="ttc" id="astructstbrp__context_html_a007509feee322404083034e4c2d3dc5d"><div class="ttname"><a href="structstbrp__context.html#a007509feee322404083034e4c2d3dc5d">stbrp_context::init_mode</a></div><div class="ttdeci">int init_mode</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00177">stb_rect_pack.h:177</a></div></div>
+<div class="ttc" id="astructstbrp__context_html_a0b80e1fbdac125427526f3500d4e7624"><div class="ttname"><a href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">stbrp_context::extra</a></div><div class="ttdeci">stbrp_node extra[2]</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00182">stb_rect_pack.h:182</a></div></div>
+<div class="ttc" id="astructstbrp__context_html_a13277239636803aff28f00b0a0376120"><div class="ttname"><a href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">stbrp_context::active_head</a></div><div class="ttdeci">stbrp_node * active_head</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00180">stb_rect_pack.h:180</a></div></div>
+<div class="ttc" id="astructstbrp__context_html_a1336ae32373663847866cc65904c2839"><div class="ttname"><a href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">stbrp_context::free_head</a></div><div class="ttdeci">stbrp_node * free_head</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00181">stb_rect_pack.h:181</a></div></div>
+<div class="ttc" id="astructstbrp__context_html_a4b61a7f94e50a54c075e2a8f99f6503a"><div class="ttname"><a href="structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a">stbrp_context::heuristic</a></div><div class="ttdeci">int heuristic</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00178">stb_rect_pack.h:178</a></div></div>
+<div class="ttc" id="astructstbrp__context_html_a70cfcb2044ce8397cc440d28b30c09b2"><div class="ttname"><a href="structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2">stbrp_context::width</a></div><div class="ttdeci">int width</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00174">stb_rect_pack.h:174</a></div></div>
+<div class="ttc" id="astructstbrp__context_html_ae36053e2001a725aec2b5756dc990481"><div class="ttname"><a href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481">stbrp_context::align</a></div><div class="ttdeci">int align</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00176">stb_rect_pack.h:176</a></div></div>
+<div class="ttc" id="astructstbrp__context_html_af3715a6f3faecfb4fac8f6ccbb71f9c7"><div class="ttname"><a href="structstbrp__context.html#af3715a6f3faecfb4fac8f6ccbb71f9c7">stbrp_context::height</a></div><div class="ttdeci">int height</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00175">stb_rect_pack.h:175</a></div></div>
+<div class="ttc" id="astructstbrp__context_html_afa8105d4ef6d3e0ae5aaf8e1ed4b2c58"><div class="ttname"><a href="structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58">stbrp_context::num_nodes</a></div><div class="ttdeci">int num_nodes</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00179">stb_rect_pack.h:179</a></div></div>
+<div class="ttc" id="astructstbrp__node_html"><div class="ttname"><a href="structstbrp__node.html">stbrp_node</a></div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00166">stb_rect_pack.h:167</a></div></div>
+<div class="ttc" id="astructstbrp__node_html_a45ab31a88025db27d08040d715b129ea"><div class="ttname"><a href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">stbrp_node::x</a></div><div class="ttdeci">stbrp_coord x</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00168">stb_rect_pack.h:168</a></div></div>
+<div class="ttc" id="astructstbrp__node_html_a933cb2dd6cddc4fcaf10e3b40634bed4"><div class="ttname"><a href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">stbrp_node::next</a></div><div class="ttdeci">stbrp_node * next</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00169">stb_rect_pack.h:169</a></div></div>
+<div class="ttc" id="astructstbrp__node_html_ad0415cb102a4f37aa45073653307e67e"><div class="ttname"><a href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">stbrp_node::y</a></div><div class="ttdeci">stbrp_coord y</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00168">stb_rect_pack.h:168</a></div></div>
+<div class="ttc" id="astructstbrp__rect_html"><div class="ttname"><a href="structstbrp__rect.html">stbrp_rect</a></div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00106">stb_rect_pack.h:107</a></div></div>
+<div class="ttc" id="astructstbrp__rect_html_a248d43f1eb979c1e7b92ba6df431dec5"><div class="ttname"><a href="structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5">stbrp_rect::w</a></div><div class="ttdeci">stbrp_coord w</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00112">stb_rect_pack.h:112</a></div></div>
+<div class="ttc" id="astructstbrp__rect_html_a4cc623a3e29f0bc0d3375f6645c84d18"><div class="ttname"><a href="structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18">stbrp_rect::x</a></div><div class="ttdeci">stbrp_coord x</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00115">stb_rect_pack.h:115</a></div></div>
+<div class="ttc" id="astructstbrp__rect_html_a74ba347755ce17f2f8a2ea66c612af49"><div class="ttname"><a href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">stbrp_rect::was_packed</a></div><div class="ttdeci">int was_packed</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00116">stb_rect_pack.h:116</a></div></div>
+<div class="ttc" id="astructstbrp__rect_html_a92da8626bc99df041c0c3bfd01c25f7a"><div class="ttname"><a href="structstbrp__rect.html#a92da8626bc99df041c0c3bfd01c25f7a">stbrp_rect::id</a></div><div class="ttdeci">int id</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00109">stb_rect_pack.h:109</a></div></div>
+<div class="ttc" id="astructstbrp__rect_html_ae3034c1fbf86043b568f5a4dddf946fa"><div class="ttname"><a href="structstbrp__rect.html#ae3034c1fbf86043b568f5a4dddf946fa">stbrp_rect::y</a></div><div class="ttdeci">stbrp_coord y</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00115">stb_rect_pack.h:115</a></div></div>
+<div class="ttc" id="astructstbrp__rect_html_af68de2dadc7972b7c089d5e0c0558398"><div class="ttname"><a href="structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398">stbrp_rect::h</a></div><div class="ttdeci">stbrp_coord h</div><div class="ttdef"><b>Definition:</b> <a href="stb__rect__pack_8h_source.html#l00112">stb_rect_pack.h:112</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/structstbrp__context-members.html b/dev/MinGfx/docs/html/structstbrp__context-members.html
new file mode 100644
index 0000000..affff9c
--- /dev/null
+++ b/dev/MinGfx/docs/html/structstbrp__context-members.html
@@ -0,0 +1,99 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">stbrp_context Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="structstbrp__context.html">stbrp_context</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">active_head</a></td><td class="entry"><a class="el" href="structstbrp__context.html">stbrp_context</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481">align</a></td><td class="entry"><a class="el" href="structstbrp__context.html">stbrp_context</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a></td><td class="entry"><a class="el" href="structstbrp__context.html">stbrp_context</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">free_head</a></td><td class="entry"><a class="el" href="structstbrp__context.html">stbrp_context</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="structstbrp__context.html#af3715a6f3faecfb4fac8f6ccbb71f9c7">height</a></td><td class="entry"><a class="el" href="structstbrp__context.html">stbrp_context</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a">heuristic</a></td><td class="entry"><a class="el" href="structstbrp__context.html">stbrp_context</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="structstbrp__context.html#a007509feee322404083034e4c2d3dc5d">init_mode</a></td><td class="entry"><a class="el" href="structstbrp__context.html">stbrp_context</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58">num_nodes</a></td><td class="entry"><a class="el" href="structstbrp__context.html">stbrp_context</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2">width</a></td><td class="entry"><a class="el" href="structstbrp__context.html">stbrp_context</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/structstbrp__context.html b/dev/MinGfx/docs/html/structstbrp__context.html
new file mode 100644
index 0000000..0336ebc
--- /dev/null
+++ b/dev/MinGfx/docs/html/structstbrp__context.html
@@ -0,0 +1,265 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: stbrp_context Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="structstbrp__context-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">stbrp_context Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock">
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00172">172</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a70cfcb2044ce8397cc440d28b30c09b2"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__context.html#a70cfcb2044ce8397cc440d28b30c09b2">width</a></td></tr>
+<tr class="separator:a70cfcb2044ce8397cc440d28b30c09b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3715a6f3faecfb4fac8f6ccbb71f9c7"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__context.html#af3715a6f3faecfb4fac8f6ccbb71f9c7">height</a></td></tr>
+<tr class="separator:af3715a6f3faecfb4fac8f6ccbb71f9c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae36053e2001a725aec2b5756dc990481"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__context.html#ae36053e2001a725aec2b5756dc990481">align</a></td></tr>
+<tr class="separator:ae36053e2001a725aec2b5756dc990481"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a007509feee322404083034e4c2d3dc5d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__context.html#a007509feee322404083034e4c2d3dc5d">init_mode</a></td></tr>
+<tr class="separator:a007509feee322404083034e4c2d3dc5d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b61a7f94e50a54c075e2a8f99f6503a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__context.html#a4b61a7f94e50a54c075e2a8f99f6503a">heuristic</a></td></tr>
+<tr class="separator:a4b61a7f94e50a54c075e2a8f99f6503a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa8105d4ef6d3e0ae5aaf8e1ed4b2c58"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__context.html#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58">num_nodes</a></td></tr>
+<tr class="separator:afa8105d4ef6d3e0ae5aaf8e1ed4b2c58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a13277239636803aff28f00b0a0376120"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structstbrp__node.html">stbrp_node</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__context.html#a13277239636803aff28f00b0a0376120">active_head</a></td></tr>
+<tr class="separator:a13277239636803aff28f00b0a0376120"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1336ae32373663847866cc65904c2839"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structstbrp__node.html">stbrp_node</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__context.html#a1336ae32373663847866cc65904c2839">free_head</a></td></tr>
+<tr class="separator:a1336ae32373663847866cc65904c2839"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b80e1fbdac125427526f3500d4e7624"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structstbrp__node.html">stbrp_node</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__context.html#a0b80e1fbdac125427526f3500d4e7624">extra</a> [2]</td></tr>
+<tr class="separator:a0b80e1fbdac125427526f3500d4e7624"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a id="a13277239636803aff28f00b0a0376120"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a13277239636803aff28f00b0a0376120">&#9670;&nbsp;</a></span>active_head</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structstbrp__node.html">stbrp_node</a>* stbrp_context::active_head</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00180">180</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="ae36053e2001a725aec2b5756dc990481"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae36053e2001a725aec2b5756dc990481">&#9670;&nbsp;</a></span>align</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int stbrp_context::align</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00176">176</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a0b80e1fbdac125427526f3500d4e7624"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0b80e1fbdac125427526f3500d4e7624">&#9670;&nbsp;</a></span>extra</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structstbrp__node.html">stbrp_node</a> stbrp_context::extra[2]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00182">182</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a1336ae32373663847866cc65904c2839"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1336ae32373663847866cc65904c2839">&#9670;&nbsp;</a></span>free_head</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structstbrp__node.html">stbrp_node</a>* stbrp_context::free_head</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00181">181</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="af3715a6f3faecfb4fac8f6ccbb71f9c7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af3715a6f3faecfb4fac8f6ccbb71f9c7">&#9670;&nbsp;</a></span>height</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int stbrp_context::height</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00175">175</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a4b61a7f94e50a54c075e2a8f99f6503a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4b61a7f94e50a54c075e2a8f99f6503a">&#9670;&nbsp;</a></span>heuristic</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int stbrp_context::heuristic</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00178">178</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a007509feee322404083034e4c2d3dc5d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a007509feee322404083034e4c2d3dc5d">&#9670;&nbsp;</a></span>init_mode</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int stbrp_context::init_mode</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00177">177</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="afa8105d4ef6d3e0ae5aaf8e1ed4b2c58"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afa8105d4ef6d3e0ae5aaf8e1ed4b2c58">&#9670;&nbsp;</a></span>num_nodes</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int stbrp_context::num_nodes</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00179">179</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a70cfcb2044ce8397cc440d28b30c09b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a70cfcb2044ce8397cc440d28b30c09b2">&#9670;&nbsp;</a></span>width</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int stbrp_context::width</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00174">174</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/<a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/structstbrp__node-members.html b/dev/MinGfx/docs/html/structstbrp__node-members.html
new file mode 100644
index 0000000..f5f798d
--- /dev/null
+++ b/dev/MinGfx/docs/html/structstbrp__node-members.html
@@ -0,0 +1,93 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">stbrp_node Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="structstbrp__node.html">stbrp_node</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a></td><td class="entry"><a class="el" href="structstbrp__node.html">stbrp_node</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a></td><td class="entry"><a class="el" href="structstbrp__node.html">stbrp_node</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">y</a></td><td class="entry"><a class="el" href="structstbrp__node.html">stbrp_node</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/structstbrp__node.html b/dev/MinGfx/docs/html/structstbrp__node.html
new file mode 100644
index 0000000..cc4ebe6
--- /dev/null
+++ b/dev/MinGfx/docs/html/structstbrp__node.html
@@ -0,0 +1,157 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: stbrp_node Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="structstbrp__node-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">stbrp_node Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock">
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00166">166</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a45ab31a88025db27d08040d715b129ea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__node.html#a45ab31a88025db27d08040d715b129ea">x</a></td></tr>
+<tr class="separator:a45ab31a88025db27d08040d715b129ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0415cb102a4f37aa45073653307e67e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__node.html#ad0415cb102a4f37aa45073653307e67e">y</a></td></tr>
+<tr class="separator:ad0415cb102a4f37aa45073653307e67e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a933cb2dd6cddc4fcaf10e3b40634bed4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structstbrp__node.html">stbrp_node</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__node.html#a933cb2dd6cddc4fcaf10e3b40634bed4">next</a></td></tr>
+<tr class="separator:a933cb2dd6cddc4fcaf10e3b40634bed4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a id="a933cb2dd6cddc4fcaf10e3b40634bed4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a933cb2dd6cddc4fcaf10e3b40634bed4">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structstbrp__node.html">stbrp_node</a>* stbrp_node::next</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00169">169</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a45ab31a88025db27d08040d715b129ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a45ab31a88025db27d08040d715b129ea">&#9670;&nbsp;</a></span>x</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a> stbrp_node::x</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00168">168</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="ad0415cb102a4f37aa45073653307e67e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0415cb102a4f37aa45073653307e67e">&#9670;&nbsp;</a></span>y</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a> stbrp_node::y</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00168">168</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/<a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/structstbrp__rect-members.html b/dev/MinGfx/docs/html/structstbrp__rect-members.html
new file mode 100644
index 0000000..e73efd1
--- /dev/null
+++ b/dev/MinGfx/docs/html/structstbrp__rect-members.html
@@ -0,0 +1,96 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">stbrp_rect Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="structstbrp__rect.html">stbrp_rect</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398">h</a></td><td class="entry"><a class="el" href="structstbrp__rect.html">stbrp_rect</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="structstbrp__rect.html#a92da8626bc99df041c0c3bfd01c25f7a">id</a></td><td class="entry"><a class="el" href="structstbrp__rect.html">stbrp_rect</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5">w</a></td><td class="entry"><a class="el" href="structstbrp__rect.html">stbrp_rect</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">was_packed</a></td><td class="entry"><a class="el" href="structstbrp__rect.html">stbrp_rect</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18">x</a></td><td class="entry"><a class="el" href="structstbrp__rect.html">stbrp_rect</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="structstbrp__rect.html#ae3034c1fbf86043b568f5a4dddf946fa">y</a></td><td class="entry"><a class="el" href="structstbrp__rect.html">stbrp_rect</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/structstbrp__rect.html b/dev/MinGfx/docs/html/structstbrp__rect.html
new file mode 100644
index 0000000..782b5df
--- /dev/null
+++ b/dev/MinGfx/docs/html/structstbrp__rect.html
@@ -0,0 +1,211 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: stbrp_rect Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="structstbrp__rect-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">stbrp_rect Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock">
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00106">106</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+</div>
+<p><code>#include &lt;<a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a92da8626bc99df041c0c3bfd01c25f7a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__rect.html#a92da8626bc99df041c0c3bfd01c25f7a">id</a></td></tr>
+<tr class="separator:a92da8626bc99df041c0c3bfd01c25f7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a248d43f1eb979c1e7b92ba6df431dec5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__rect.html#a248d43f1eb979c1e7b92ba6df431dec5">w</a></td></tr>
+<tr class="separator:a248d43f1eb979c1e7b92ba6df431dec5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af68de2dadc7972b7c089d5e0c0558398"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__rect.html#af68de2dadc7972b7c089d5e0c0558398">h</a></td></tr>
+<tr class="separator:af68de2dadc7972b7c089d5e0c0558398"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4cc623a3e29f0bc0d3375f6645c84d18"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__rect.html#a4cc623a3e29f0bc0d3375f6645c84d18">x</a></td></tr>
+<tr class="separator:a4cc623a3e29f0bc0d3375f6645c84d18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae3034c1fbf86043b568f5a4dddf946fa"><td class="memItemLeft" align="right" valign="top"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__rect.html#ae3034c1fbf86043b568f5a4dddf946fa">y</a></td></tr>
+<tr class="separator:ae3034c1fbf86043b568f5a4dddf946fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a74ba347755ce17f2f8a2ea66c612af49"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstbrp__rect.html#a74ba347755ce17f2f8a2ea66c612af49">was_packed</a></td></tr>
+<tr class="separator:a74ba347755ce17f2f8a2ea66c612af49"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a id="af68de2dadc7972b7c089d5e0c0558398"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af68de2dadc7972b7c089d5e0c0558398">&#9670;&nbsp;</a></span>h</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a> stbrp_rect::h</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00112">112</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a92da8626bc99df041c0c3bfd01c25f7a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a92da8626bc99df041c0c3bfd01c25f7a">&#9670;&nbsp;</a></span>id</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int stbrp_rect::id</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00109">109</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a248d43f1eb979c1e7b92ba6df431dec5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a248d43f1eb979c1e7b92ba6df431dec5">&#9670;&nbsp;</a></span>w</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a> stbrp_rect::w</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00112">112</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a74ba347755ce17f2f8a2ea66c612af49"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a74ba347755ce17f2f8a2ea66c612af49">&#9670;&nbsp;</a></span>was_packed</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int stbrp_rect::was_packed</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00116">116</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="a4cc623a3e29f0bc0d3375f6645c84d18"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4cc623a3e29f0bc0d3375f6645c84d18">&#9670;&nbsp;</a></span>x</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a> stbrp_rect::x</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00115">115</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<a id="ae3034c1fbf86043b568f5a4dddf946fa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae3034c1fbf86043b568f5a4dddf946fa">&#9670;&nbsp;</a></span>y</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="stb__rect__pack_8h.html#ac2c2491b95dea6a298b7423dc762dfd9">stbrp_coord</a> stbrp_rect::y</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p class="definition">Definition at line <a class="el" href="stb__rect__pack_8h_source.html#l00115">115</a> of file <a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/<a class="el" href="stb__rect__pack_8h_source.html">stb_rect_pack.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/sync_off.png b/dev/MinGfx/docs/html/sync_off.png
new file mode 100644
index 0000000..f8b5a50
--- /dev/null
+++ b/dev/MinGfx/docs/html/sync_off.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/sync_on.png b/dev/MinGfx/docs/html/sync_on.png
new file mode 100644
index 0000000..172451a
--- /dev/null
+++ b/dev/MinGfx/docs/html/sync_on.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/tab_a.png b/dev/MinGfx/docs/html/tab_a.png
new file mode 100644
index 0000000..98b9de2
--- /dev/null
+++ b/dev/MinGfx/docs/html/tab_a.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/tab_b.png b/dev/MinGfx/docs/html/tab_b.png
new file mode 100644
index 0000000..eca9b7b
--- /dev/null
+++ b/dev/MinGfx/docs/html/tab_b.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/tab_h.png b/dev/MinGfx/docs/html/tab_h.png
new file mode 100644
index 0000000..b46c7fe
--- /dev/null
+++ b/dev/MinGfx/docs/html/tab_h.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/tab_s.png b/dev/MinGfx/docs/html/tab_s.png
new file mode 100644
index 0000000..65a5c21
--- /dev/null
+++ b/dev/MinGfx/docs/html/tab_s.png
Binary files differ
diff --git a/dev/MinGfx/docs/html/tabs.css b/dev/MinGfx/docs/html/tabs.css
new file mode 100644
index 0000000..85a0cd5
--- /dev/null
+++ b/dev/MinGfx/docs/html/tabs.css
@@ -0,0 +1 @@
+.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file
diff --git a/dev/MinGfx/docs/html/text__shader_8h.html b/dev/MinGfx/docs/html/text__shader_8h.html
new file mode 100644
index 0000000..c8b6d7f
--- /dev/null
+++ b/dev/MinGfx/docs/html/text__shader_8h.html
@@ -0,0 +1,117 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/text_shader.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">text_shader.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;string&gt;</code><br />
+<code>#include &lt;map&gt;</code><br />
+<code>#include &quot;<a class="el" href="matrix4_8h_source.html">matrix4.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mesh_8h_source.html">mesh.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="shader__program_8h_source.html">shader_program.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="texture2d_8h_source.html">texture2d.h</a>&quot;</code><br />
+<code>#include &lt;stb_truetype.h&gt;</code><br />
+</div>
+<p><a href="text__shader_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader.html">mingfx::TextShader</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_text_shader_1_1_text_format.html">mingfx::TextShader::TextFormat</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/text__shader_8h_source.html b/dev/MinGfx/docs/html/text__shader_8h_source.html
new file mode 100644
index 0000000..7c88741
--- /dev/null
+++ b/dev/MinGfx/docs/html/text__shader_8h_source.html
@@ -0,0 +1,229 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/text_shader.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">text_shader.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="text__shader_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_TEXT_SHADER_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_TEXT_SHADER_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &lt;map&gt;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="matrix4_8h.html">matrix4.h</a>&quot;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="mesh_8h.html">mesh.h</a>&quot;</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="shader__program_8h.html">shader_program.h</a>&quot;</span></div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="texture2d_8h.html">texture2d.h</a>&quot;</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; </div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment">// disable warnings for this 3rd party code</span></div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#pragma warning ( push, 0 )</span></div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &lt;stb_truetype.h&gt;</span></div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#pragma warning ( pop )</span></div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; </div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; </div>
+<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; </div>
+<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; </div>
+<div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader.html"> 36</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_text_shader.html">TextShader</a> {</div>
+<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader.html#a0ec5a6ba22abb3f86c611107925fca67"> 38</a></span>&#160; <a class="code" href="classmingfx_1_1_text_shader.html#a0ec5a6ba22abb3f86c611107925fca67">TextShader</a>();</div>
+<div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader.html#a457f7a42eceb957cdb103664dd864feb"> 39</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_text_shader.html#a457f7a42eceb957cdb103664dd864feb">~TextShader</a>();</div>
+<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; </div>
+<div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader.html#ad60a8b572adc30dad47e2d163dc603a3"> 45</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_text_shader.html#ad60a8b572adc30dad47e2d163dc603a3">Init</a>(<span class="keyword">const</span> std::string &amp;font_file, <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_text_shader.html#a707b2b36547db78d19139575003c8a0d">native_font_size</a>);</div>
+<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; </div>
+<div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c"> 47</a></span>&#160; <span class="keyword">enum class</span> <a class="code" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c">HorizAlign</a> {</div>
+<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <a class="code" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca8e6d89d62375493a3cc1fb5dba289f92">HORIZ_ALIGN_LEFT</a>,</div>
+<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <a class="code" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca5089ab07b80a999b45667e5711cae1f4">HORIZ_ALIGN_CENTER</a>,</div>
+<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <a class="code" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca6999f9ad8384a34813e7535baf44f78b">HORIZ_ALIGN_RIGHT</a></div>
+<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; };</div>
+<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; </div>
+<div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a"> 53</a></span>&#160; <span class="keyword">enum class</span> <a class="code" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a">VertAlign</a> {</div>
+<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <a class="code" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa970e4fcd7c426e6cd49709119fba6e04">VERT_ALIGN_TOP</a>,</div>
+<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <a class="code" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aac49ae9c9553284e44f90228b9ce647af">VERT_ALIGN_CENTER</a>,</div>
+<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <a class="code" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa0400d0d77ea6770b313eedaf36fe71bb">VERT_ALIGN_BASELINE</a>,</div>
+<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <a class="code" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa080e12cacc0f01b361c8b93c73dd2e28">VERT_ALIGN_BOTTOM</a></div>
+<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; };</div>
+<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; </div>
+<div class="line"><a name="l00060"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader_1_1_text_format.html"> 60</a></span>&#160; <span class="keyword">class </span><a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html">TextFormat</a> {</div>
+<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="comment">// constructor sets defaults</span></div>
+<div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader_1_1_text_format.html#a2b7d7e2e540c881952b97b8948b49fcb"> 63</a></span>&#160; <a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html#a2b7d7e2e540c881952b97b8948b49fcb">TextFormat</a>() :</div>
+<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html#aeecda817624276f0cfb812ddcdbbc2f0">size</a>(0.1f),</div>
+<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html#af0483874ac3fcea58b6ff99ef6644ff7">color</a>(1,1,1,1),</div>
+<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html#acde55d28b0446e788e6c68b85df83066">h_align</a>(<a class="code" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c">HorizAlign</a>::HORIZ_ALIGN_CENTER),</div>
+<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html#a8455382a6829022020eb307ae9168bd7">v_align</a>(<a class="code" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a">VertAlign</a>::VERT_ALIGN_BASELINE) {}</div>
+<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; </div>
+<div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader_1_1_text_format.html#aeecda817624276f0cfb812ddcdbbc2f0"> 69</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html#aeecda817624276f0cfb812ddcdbbc2f0">size</a>;</div>
+<div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader_1_1_text_format.html#af0483874ac3fcea58b6ff99ef6644ff7"> 70</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html">Color</a> <a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html#af0483874ac3fcea58b6ff99ef6644ff7">color</a>;</div>
+<div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader_1_1_text_format.html#acde55d28b0446e788e6c68b85df83066"> 71</a></span>&#160; <a class="code" href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c">HorizAlign</a> <a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html#acde55d28b0446e788e6c68b85df83066">h_align</a>;</div>
+<div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader_1_1_text_format.html#a8455382a6829022020eb307ae9168bd7"> 72</a></span>&#160; <a class="code" href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a">VertAlign</a> <a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html#a8455382a6829022020eb307ae9168bd7">v_align</a>;</div>
+<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; };</div>
+<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; </div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; </div>
+<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="comment">//void Draw2D(const Point2 &amp;pos,</span></div>
+<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="comment">// const std::string &amp;text, TextFormat format, bool cache=false);</span></div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
+<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; </div>
+<div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader.html#a2caaaf2decfac523b476951474e9a359"> 80</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_text_shader.html#a2caaaf2decfac523b476951474e9a359">Draw3D</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;model, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;view, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projection,</div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keyword">const</span> std::string &amp;text, <a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html">TextFormat</a> format, <span class="keywordtype">bool</span> cache=<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; </div>
+<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; </div>
+<div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader.html#ac4e9a150311fe6d74e9f6214ebeb6b28"> 84</a></span>&#160; <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="classmingfx_1_1_text_shader.html#ac4e9a150311fe6d74e9f6214ebeb6b28">TextExtents</a>(<span class="keyword">const</span> std::string &amp;text, <a class="code" href="classmingfx_1_1_text_shader_1_1_text_format.html">TextFormat</a> format, <span class="keywordtype">bool</span> cache=<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; </div>
+<div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="classmingfx_1_1_text_shader.html#a707b2b36547db78d19139575003c8a0d"> 86</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_text_shader.html#a707b2b36547db78d19139575003c8a0d">native_font_size</a>();</div>
+<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; </div>
+<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <a class="code" href="classmingfx_1_1_texture2_d.html">Texture2D</a> atlas_;</div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keywordtype">float</span> native_font_size_;</div>
+<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; </div>
+<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; stbtt_packedchar chardata_[128];</div>
+<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; </div>
+<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keyword">struct </span>MeshData {</div>
+<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <a class="code" href="classmingfx_1_1_mesh.html">Mesh</a> mesh;</div>
+<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <a class="code" href="classmingfx_1_1_point2.html">Point2</a> min;</div>
+<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <a class="code" href="classmingfx_1_1_point2.html">Point2</a> max;</div>
+<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; };</div>
+<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; </div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keywordtype">void</span> SetTextMesh(<span class="keyword">const</span> std::string &amp;text, MeshData *md);</div>
+<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; </div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; std::map&lt;std::string, MeshData&gt; cache_;</div>
+<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; MeshData tmp_md_;</div>
+<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; </div>
+<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <a class="code" href="classmingfx_1_1_shader_program.html">ShaderProgram</a> shader_;</div>
+<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;};</div>
+<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; </div>
+<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; </div>
+<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html"><div class="ttname"><a href="classmingfx_1_1_color.html">mingfx::Color</a></div><div class="ttdoc">Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with Op...</div><div class="ttdef"><b>Definition:</b> <a href="color_8h_source.html#l00041">color.h:41</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html"><div class="ttname"><a href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></div><div class="ttdoc">A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...</div><div class="ttdef"><b>Definition:</b> <a href="matrix4_8h_source.html#l00050">matrix4.h:50</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_mesh_html"><div class="ttname"><a href="classmingfx_1_1_mesh.html">mingfx::Mesh</a></div><div class="ttdoc">A triangle mesh data structure that can be rendered with a ShaderProgram like DefaultShader.</div><div class="ttdef"><b>Definition:</b> <a href="mesh_8h_source.html#l00127">mesh.h:127</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html"><div class="ttname"><a href="classmingfx_1_1_point2.html">mingfx::Point2</a></div><div class="ttdoc">A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...</div><div class="ttdef"><b>Definition:</b> <a href="point2_8h_source.html#l00028">point2.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_shader_program_html"><div class="ttname"><a href="classmingfx_1_1_shader_program.html">mingfx::ShaderProgram</a></div><div class="ttdoc">A wrapper around GLSL shader programs.</div><div class="ttdef"><b>Definition:</b> <a href="shader__program_8h_source.html#l00066">shader_program.h:66</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_1_1_text_format_html"><div class="ttname"><a href="classmingfx_1_1_text_shader_1_1_text_format.html">mingfx::TextShader::TextFormat</a></div><div class="ttdef"><b>Definition:</b> <a href="text__shader_8h_source.html#l00060">text_shader.h:60</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_1_1_text_format_html_a2b7d7e2e540c881952b97b8948b49fcb"><div class="ttname"><a href="classmingfx_1_1_text_shader_1_1_text_format.html#a2b7d7e2e540c881952b97b8948b49fcb">mingfx::TextShader::TextFormat::TextFormat</a></div><div class="ttdeci">TextFormat()</div><div class="ttdef"><b>Definition:</b> <a href="text__shader_8h_source.html#l00063">text_shader.h:63</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_1_1_text_format_html_a8455382a6829022020eb307ae9168bd7"><div class="ttname"><a href="classmingfx_1_1_text_shader_1_1_text_format.html#a8455382a6829022020eb307ae9168bd7">mingfx::TextShader::TextFormat::v_align</a></div><div class="ttdeci">VertAlign v_align</div><div class="ttdef"><b>Definition:</b> <a href="text__shader_8h_source.html#l00072">text_shader.h:72</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_1_1_text_format_html_acde55d28b0446e788e6c68b85df83066"><div class="ttname"><a href="classmingfx_1_1_text_shader_1_1_text_format.html#acde55d28b0446e788e6c68b85df83066">mingfx::TextShader::TextFormat::h_align</a></div><div class="ttdeci">HorizAlign h_align</div><div class="ttdef"><b>Definition:</b> <a href="text__shader_8h_source.html#l00071">text_shader.h:71</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_1_1_text_format_html_aeecda817624276f0cfb812ddcdbbc2f0"><div class="ttname"><a href="classmingfx_1_1_text_shader_1_1_text_format.html#aeecda817624276f0cfb812ddcdbbc2f0">mingfx::TextShader::TextFormat::size</a></div><div class="ttdeci">float size</div><div class="ttdef"><b>Definition:</b> <a href="text__shader_8h_source.html#l00069">text_shader.h:69</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_1_1_text_format_html_af0483874ac3fcea58b6ff99ef6644ff7"><div class="ttname"><a href="classmingfx_1_1_text_shader_1_1_text_format.html#af0483874ac3fcea58b6ff99ef6644ff7">mingfx::TextShader::TextFormat::color</a></div><div class="ttdeci">Color color</div><div class="ttdef"><b>Definition:</b> <a href="text__shader_8h_source.html#l00070">text_shader.h:70</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html"><div class="ttname"><a href="classmingfx_1_1_text_shader.html">mingfx::TextShader</a></div><div class="ttdef"><b>Definition:</b> <a href="text__shader_8h_source.html#l00036">text_shader.h:36</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_a0ec5a6ba22abb3f86c611107925fca67"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#a0ec5a6ba22abb3f86c611107925fca67">mingfx::TextShader::TextShader</a></div><div class="ttdeci">TextShader()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_a2caaaf2decfac523b476951474e9a359"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#a2caaaf2decfac523b476951474e9a359">mingfx::TextShader::Draw3D</a></div><div class="ttdeci">void Draw3D(const Matrix4 &amp;model, const Matrix4 &amp;view, const Matrix4 &amp;projection, const std::string &amp;text, TextFormat format, bool cache=false)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_a457f7a42eceb957cdb103664dd864feb"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#a457f7a42eceb957cdb103664dd864feb">mingfx::TextShader::~TextShader</a></div><div class="ttdeci">virtual ~TextShader()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_a707b2b36547db78d19139575003c8a0d"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#a707b2b36547db78d19139575003c8a0d">mingfx::TextShader::native_font_size</a></div><div class="ttdeci">float native_font_size()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_a7624918a2d157cf2880fc8858c00db2a"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2a">mingfx::TextShader::VertAlign</a></div><div class="ttdeci">VertAlign</div><div class="ttdef"><b>Definition:</b> <a href="text__shader_8h_source.html#l00053">text_shader.h:53</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_a7624918a2d157cf2880fc8858c00db2aa0400d0d77ea6770b313eedaf36fe71bb"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa0400d0d77ea6770b313eedaf36fe71bb">mingfx::TextShader::VertAlign::VERT_ALIGN_BASELINE</a></div><div class="ttdeci">@ VERT_ALIGN_BASELINE</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_a7624918a2d157cf2880fc8858c00db2aa080e12cacc0f01b361c8b93c73dd2e28"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa080e12cacc0f01b361c8b93c73dd2e28">mingfx::TextShader::VertAlign::VERT_ALIGN_BOTTOM</a></div><div class="ttdeci">@ VERT_ALIGN_BOTTOM</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_a7624918a2d157cf2880fc8858c00db2aa970e4fcd7c426e6cd49709119fba6e04"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aa970e4fcd7c426e6cd49709119fba6e04">mingfx::TextShader::VertAlign::VERT_ALIGN_TOP</a></div><div class="ttdeci">@ VERT_ALIGN_TOP</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_a7624918a2d157cf2880fc8858c00db2aac49ae9c9553284e44f90228b9ce647af"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#a7624918a2d157cf2880fc8858c00db2aac49ae9c9553284e44f90228b9ce647af">mingfx::TextShader::VertAlign::VERT_ALIGN_CENTER</a></div><div class="ttdeci">@ VERT_ALIGN_CENTER</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_ac4e9a150311fe6d74e9f6214ebeb6b28"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#ac4e9a150311fe6d74e9f6214ebeb6b28">mingfx::TextShader::TextExtents</a></div><div class="ttdeci">Vector2 TextExtents(const std::string &amp;text, TextFormat format, bool cache=false)</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_ad60a8b572adc30dad47e2d163dc603a3"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#ad60a8b572adc30dad47e2d163dc603a3">mingfx::TextShader::Init</a></div><div class="ttdeci">bool Init(const std::string &amp;font_file, int native_font_size)</div><div class="ttdoc">Call this from within the InitOpenGL() function since it will initialize not just the Font's internal...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_af464d970e6475a2176f21c3f4b24c63c"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63c">mingfx::TextShader::HorizAlign</a></div><div class="ttdeci">HorizAlign</div><div class="ttdef"><b>Definition:</b> <a href="text__shader_8h_source.html#l00047">text_shader.h:47</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_af464d970e6475a2176f21c3f4b24c63ca5089ab07b80a999b45667e5711cae1f4"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca5089ab07b80a999b45667e5711cae1f4">mingfx::TextShader::HorizAlign::HORIZ_ALIGN_CENTER</a></div><div class="ttdeci">@ HORIZ_ALIGN_CENTER</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_af464d970e6475a2176f21c3f4b24c63ca6999f9ad8384a34813e7535baf44f78b"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca6999f9ad8384a34813e7535baf44f78b">mingfx::TextShader::HorizAlign::HORIZ_ALIGN_RIGHT</a></div><div class="ttdeci">@ HORIZ_ALIGN_RIGHT</div></div>
+<div class="ttc" id="aclassmingfx_1_1_text_shader_html_af464d970e6475a2176f21c3f4b24c63ca8e6d89d62375493a3cc1fb5dba289f92"><div class="ttname"><a href="classmingfx_1_1_text_shader.html#af464d970e6475a2176f21c3f4b24c63ca8e6d89d62375493a3cc1fb5dba289f92">mingfx::TextShader::HorizAlign::HORIZ_ALIGN_LEFT</a></div><div class="ttdeci">@ HORIZ_ALIGN_LEFT</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></div><div class="ttdoc">A wrapper around a 2D texture that supports loading images from files or setting texture color data d...</div><div class="ttdef"><b>Definition:</b> <a href="texture2d_8h_source.html#l00042">texture2d.h:42</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html"><div class="ttname"><a href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></div><div class="ttdoc">A 2D Vector with floating point coordinates, used for storing 2D translations, mouse movements,...</div><div class="ttdef"><b>Definition:</b> <a href="vector2_8h_source.html#l00028">vector2.h:28</a></div></div>
+<div class="ttc" id="amatrix4_8h_html"><div class="ttname"><a href="matrix4_8h.html">matrix4.h</a></div></div>
+<div class="ttc" id="amesh_8h_html"><div class="ttname"><a href="mesh_8h.html">mesh.h</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="ashader__program_8h_html"><div class="ttname"><a href="shader__program_8h.html">shader_program.h</a></div></div>
+<div class="ttc" id="atexture2d_8h_html"><div class="ttname"><a href="texture2d_8h.html">texture2d.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/texture2d_8h.html b/dev/MinGfx/docs/html/texture2d_8h.html
new file mode 100644
index 0000000..5324545
--- /dev/null
+++ b/dev/MinGfx/docs/html/texture2d_8h.html
@@ -0,0 +1,112 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/texture2d.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">texture2d.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="opengl__headers_8h_source.html">opengl_headers.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="color_8h_source.html">color.h</a>&quot;</code><br />
+<code>#include &lt;string&gt;</code><br />
+</div>
+<p><a href="texture2d_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A wrapper around a 2D texture that supports loading images from files or setting texture color data directly. <a href="classmingfx_1_1_texture2_d.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/texture2d_8h_source.html b/dev/MinGfx/docs/html/texture2d_8h_source.html
new file mode 100644
index 0000000..2a1f2ea
--- /dev/null
+++ b/dev/MinGfx/docs/html/texture2d_8h_source.html
@@ -0,0 +1,195 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/texture2d.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">texture2d.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="texture2d_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_TEXTURE2D_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_TEXTURE2D_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; </div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="opengl__headers_8h.html">opengl_headers.h</a>&quot;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="color_8h.html">color.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
+<div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html"> 42</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_texture2_d.html">Texture2D</a> {</div>
+<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; </div>
+<div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d"> 47</a></span>&#160; <a class="code" href="classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d">Texture2D</a>(GLenum wrapMode=GL_REPEAT, GLenum filterMode=GL_LINEAR);</div>
+<div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#aab734dbbcf6211507ab65d5bb94a4ef9"> 48</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_texture2_d.html#aab734dbbcf6211507ab65d5bb94a4ef9">~Texture2D</a>();</div>
+<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; </div>
+<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; </div>
+<div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#a8eded044ccdf9bd3e1e5bcfe74526bdc"> 55</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_texture2_d.html#a8eded044ccdf9bd3e1e5bcfe74526bdc">InitFromFile</a>(<span class="keyword">const</span> std::string &amp;filename);</div>
+<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
+<div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#aba57b01065096fe9f6483e8f68622944"> 66</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_texture2_d.html#aba57b01065096fe9f6483e8f68622944">InitFromBytes</a>(<span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869">width</a>, <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88">height</a>, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> * data);</div>
+<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; </div>
+<div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#aee8a0aad1795680cb840ffcf544ed7b8"> 77</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_texture2_d.html#aee8a0aad1795680cb840ffcf544ed7b8">InitFromFloats</a>(<span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869">width</a>, <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88">height</a>, <span class="keyword">const</span> <span class="keywordtype">float</span> * data);</div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
+<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; </div>
+<div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#a0783ad70829ef353aa92344d320b107c"> 83</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_texture2_d.html#a0783ad70829ef353aa92344d320b107c">UpdateFromBytes</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> * data);</div>
+<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; </div>
+<div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#ad7640f0cbda6398a6bb80202b80dd693"> 88</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_texture2_d.html#ad7640f0cbda6398a6bb80202b80dd693">UpdateFromFloats</a>(<span class="keyword">const</span> <span class="keywordtype">float</span> * data);</div>
+<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; </div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; </div>
+<div class="line"><a name="l00092"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#a15d5c319cf7e012e703668f4d4e7be87"> 92</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_texture2_d.html#a15d5c319cf7e012e703668f4d4e7be87">initialized</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; </div>
+<div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869"> 95</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869">width</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; </div>
+<div class="line"><a name="l00098"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88"> 98</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88">height</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; </div>
+<div class="line"><a name="l00101"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#ad4e0faadfe016e6ee501e66fc0244504"> 101</a></span>&#160; GLuint <a class="code" href="classmingfx_1_1_texture2_d.html#ad4e0faadfe016e6ee501e66fc0244504">opengl_id</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
+<div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#a1c8827426f43343c0ad171e181a741ea"> 104</a></span>&#160; GLenum <a class="code" href="classmingfx_1_1_texture2_d.html#a1c8827426f43343c0ad171e181a741ea">wrap_mode</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; </div>
+<div class="line"><a name="l00107"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#af0052203fcfd9bbb903a40d14700b13b"> 107</a></span>&#160; GLenum <a class="code" href="classmingfx_1_1_texture2_d.html#af0052203fcfd9bbb903a40d14700b13b">filter_mode</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; </div>
+<div class="line"><a name="l00110"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#aa5cbe3396e4560ec0746e91dbc55bc9f"> 110</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_texture2_d.html#aa5cbe3396e4560ec0746e91dbc55bc9f">set_wrap_mode</a>(GLenum wrapMode);</div>
+<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; </div>
+<div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#a4a3b2b550fefdf79f0fb392b04e7b013"> 113</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_texture2_d.html#a4a3b2b550fefdf79f0fb392b04e7b013">set_filter_mode</a>(GLenum filterMode);</div>
+<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; </div>
+<div class="line"><a name="l00117"></a><span class="lineno"><a class="line" href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b"> 117</a></span>&#160; <a class="code" href="classmingfx_1_1_color.html">Color</a> <a class="code" href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b">Pixel</a>(<span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; </div>
+<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; </div>
+<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordtype">bool</span> InitOpenGL();</div>
+<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; </div>
+<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; GLenum dataType_; <span class="comment">// GL_UNSIGNED_BYTE or GL_FLOAT</span></div>
+<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> * data_ubyte_;</div>
+<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> * data_float_;</div>
+<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; </div>
+<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keywordtype">int</span> width_;</div>
+<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordtype">int</span> height_;</div>
+<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordtype">bool</span> handleMemInternally_;</div>
+<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; </div>
+<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; GLuint texID_;</div>
+<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; GLenum wrapMode_;</div>
+<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; GLenum filterMode_;</div>
+<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;};</div>
+<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; </div>
+<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; </div>
+<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; </div>
+<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_color_html"><div class="ttname"><a href="classmingfx_1_1_color.html">mingfx::Color</a></div><div class="ttdoc">Represents a 4-component (R,G,B,A) color, stored internally in a float array to be compatable with Op...</div><div class="ttdef"><b>Definition:</b> <a href="color_8h_source.html#l00041">color.h:41</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html">mingfx::Texture2D</a></div><div class="ttdoc">A wrapper around a 2D texture that supports loading images from files or setting texture color data d...</div><div class="ttdef"><b>Definition:</b> <a href="texture2d_8h_source.html#l00042">texture2d.h:42</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_a0783ad70829ef353aa92344d320b107c"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#a0783ad70829ef353aa92344d320b107c">mingfx::Texture2D::UpdateFromBytes</a></div><div class="ttdeci">bool UpdateFromBytes(const unsigned char *data)</div><div class="ttdoc">This function may be called to re-read the texture data from an array formated the same as in InitFro...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_a15d5c319cf7e012e703668f4d4e7be87"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#a15d5c319cf7e012e703668f4d4e7be87">mingfx::Texture2D::initialized</a></div><div class="ttdeci">bool initialized() const</div><div class="ttdoc">Returns true if the texture data has been successfully transferred to OpenGL.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_a1c8827426f43343c0ad171e181a741ea"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#a1c8827426f43343c0ad171e181a741ea">mingfx::Texture2D::wrap_mode</a></div><div class="ttdeci">GLenum wrap_mode() const</div><div class="ttdoc">Returns an enumerated constant for the OpenGL wrap mode used by the texture.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_a1e843f3d8904f9c7a99f7614f87de73b"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#a1e843f3d8904f9c7a99f7614f87de73b">mingfx::Texture2D::Pixel</a></div><div class="ttdeci">Color Pixel(int x, int y) const</div><div class="ttdoc">Returns the color at the specified pixel. The top left corner of the image is (0,0) and the bottom ri...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_a3c396193b466053f23803894039d8d88"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#a3c396193b466053f23803894039d8d88">mingfx::Texture2D::height</a></div><div class="ttdeci">int height() const</div><div class="ttdoc">Returns the height in pixels of the texture.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_a401629d948aa144be81b94fe21938869"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#a401629d948aa144be81b94fe21938869">mingfx::Texture2D::width</a></div><div class="ttdeci">int width() const</div><div class="ttdoc">Returns the width in pixels of the texture.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_a4a3b2b550fefdf79f0fb392b04e7b013"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#a4a3b2b550fefdf79f0fb392b04e7b013">mingfx::Texture2D::set_filter_mode</a></div><div class="ttdeci">void set_filter_mode(GLenum filterMode)</div><div class="ttdoc">Uses the OpenGL texture filter mode arguments.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_a8eded044ccdf9bd3e1e5bcfe74526bdc"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#a8eded044ccdf9bd3e1e5bcfe74526bdc">mingfx::Texture2D::InitFromFile</a></div><div class="ttdeci">bool InitFromFile(const std::string &amp;filename)</div><div class="ttdoc">Call this from within the InitOpenGL() function since it will initialize not just the Texture2D's int...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_aa15b86ec3b7312842c220b081c39980d"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#aa15b86ec3b7312842c220b081c39980d">mingfx::Texture2D::Texture2D</a></div><div class="ttdeci">Texture2D(GLenum wrapMode=GL_REPEAT, GLenum filterMode=GL_LINEAR)</div><div class="ttdoc">Creates an empty texture. Optional parameters can be provided to set the texture wrap mode and filter...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_aa5cbe3396e4560ec0746e91dbc55bc9f"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#aa5cbe3396e4560ec0746e91dbc55bc9f">mingfx::Texture2D::set_wrap_mode</a></div><div class="ttdeci">void set_wrap_mode(GLenum wrapMode)</div><div class="ttdoc">Uses the OpenGL texture wrap mode arguments.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_aab734dbbcf6211507ab65d5bb94a4ef9"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#aab734dbbcf6211507ab65d5bb94a4ef9">mingfx::Texture2D::~Texture2D</a></div><div class="ttdeci">virtual ~Texture2D()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_aba57b01065096fe9f6483e8f68622944"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#aba57b01065096fe9f6483e8f68622944">mingfx::Texture2D::InitFromBytes</a></div><div class="ttdeci">bool InitFromBytes(int width, int height, const unsigned char *data)</div><div class="ttdoc">Call this from within the InitOpenGL() function since it will initialize not just the Texture2D's int...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_ad4e0faadfe016e6ee501e66fc0244504"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#ad4e0faadfe016e6ee501e66fc0244504">mingfx::Texture2D::opengl_id</a></div><div class="ttdeci">GLuint opengl_id() const</div><div class="ttdoc">Returns the unsigned int used as the texture handle by OpenGL.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_ad7640f0cbda6398a6bb80202b80dd693"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#ad7640f0cbda6398a6bb80202b80dd693">mingfx::Texture2D::UpdateFromFloats</a></div><div class="ttdeci">bool UpdateFromFloats(const float *data)</div><div class="ttdoc">This function may be called to re-read the texture data from an array formated the same as in InitFro...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_aee8a0aad1795680cb840ffcf544ed7b8"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#aee8a0aad1795680cb840ffcf544ed7b8">mingfx::Texture2D::InitFromFloats</a></div><div class="ttdeci">bool InitFromFloats(int width, int height, const float *data)</div><div class="ttdoc">Call this from within the InitOpenGL() function since it will initialize not just the Texture2D's int...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_texture2_d_html_af0052203fcfd9bbb903a40d14700b13b"><div class="ttname"><a href="classmingfx_1_1_texture2_d.html#af0052203fcfd9bbb903a40d14700b13b">mingfx::Texture2D::filter_mode</a></div><div class="ttdeci">GLenum filter_mode() const</div><div class="ttdoc">Returns an enumerated constant for the OpenGL filter mode used by the texture.</div></div>
+<div class="ttc" id="acolor_8h_html"><div class="ttname"><a href="color_8h.html">color.h</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="aopengl__headers_8h_html"><div class="ttname"><a href="opengl__headers_8h.html">opengl_headers.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/unicam_8h.html b/dev/MinGfx/docs/html/unicam_8h.html
new file mode 100644
index 0000000..bb51c32
--- /dev/null
+++ b/dev/MinGfx/docs/html/unicam_8h.html
@@ -0,0 +1,114 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/unicam.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">unicam.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="quick__shapes_8h_source.html">quick_shapes.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point2_8h_source.html">point2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector2_8h_source.html">vector2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="vector3_8h_source.html">vector3.h</a>&quot;</code><br />
+</div>
+<p><a href="unicam_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This implements a user interface for controlling the camera with the mouse. <a href="classmingfx_1_1_uni_cam.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/unicam_8h_source.html b/dev/MinGfx/docs/html/unicam_8h_source.html
new file mode 100644
index 0000000..80fa0dc
--- /dev/null
+++ b/dev/MinGfx/docs/html/unicam_8h_source.html
@@ -0,0 +1,234 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/unicam.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">unicam.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="unicam_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_UNICAM_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_UNICAM_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="quick__shapes_8h.html">quick_shapes.h</a>&quot;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point2_8h.html">point2.h</a>&quot;</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector2_8h.html">vector2.h</a>&quot;</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="vector3_8h.html">vector3.h</a>&quot;</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
+<div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html"> 105</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_uni_cam.html">UniCam</a> {</div>
+<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;<span class="keyword">public</span>: </div>
+<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; </div>
+<div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e"> 109</a></span>&#160; <a class="code" href="classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e">UniCam</a>();</div>
+<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; </div>
+<div class="line"><a name="l00112"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#af507e639c4bceb4c79e21a6f80c48d07"> 112</a></span>&#160; <a class="code" href="classmingfx_1_1_uni_cam.html#af507e639c4bceb4c79e21a6f80c48d07">UniCam</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;initialViewMatrix);</div>
+<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; </div>
+<div class="line"><a name="l00114"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#af98022627bcb52dbf54779cfaeb6ff7e"> 114</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_uni_cam.html#af98022627bcb52dbf54779cfaeb6ff7e">~UniCam</a>();</div>
+<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; </div>
+<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; </div>
+<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="comment">// To make the interaction work, the following set of functions need to be</span></div>
+<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="comment">// called from your GraphicsApp or whatever main application class you use</span></div>
+<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="comment">// to receive user input events and a draw callback.</span></div>
+<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; </div>
+<div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#a85afba6e8792636f3c6ba2433db1c52f"> 132</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_uni_cam.html#a85afba6e8792636f3c6ba2433db1c52f">OnButtonDown</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedMousePos, <span class="keywordtype">float</span> mouseZ);</div>
+<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; </div>
+<div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#a33f1b41fcf53ea78ca2b3640902c5bbe"> 142</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_uni_cam.html#a33f1b41fcf53ea78ca2b3640902c5bbe">OnDrag</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedMousePos);</div>
+<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; </div>
+<div class="line"><a name="l00152"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#a2a9431dc3943c8dc485994d88ce2a58a"> 152</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_uni_cam.html#a2a9431dc3943c8dc485994d88ce2a58a">OnButtonUp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a> &amp;normalizedMousePos);</div>
+<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; </div>
+<div class="line"><a name="l00159"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#aab253d966af52ac277ac51194745085c"> 159</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_uni_cam.html#aab253d966af52ac277ac51194745085c">AdvanceAnimation</a>(<span class="keywordtype">double</span> dt);</div>
+<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; </div>
+<div class="line"><a name="l00166"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#ae45f3c80c205a539baeb4f1b8787777d"> 166</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_uni_cam.html#ae45f3c80c205a539baeb4f1b8787777d">Draw</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> &amp;projectionMatrix);</div>
+<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; </div>
+<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; </div>
+<div class="line"><a name="l00178"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3"> 178</a></span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> <a class="code" href="classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3">view_matrix</a>();</div>
+<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; </div>
+<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; </div>
+<div class="line"><a name="l00183"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#a65d5735b4b3a8e38f2b30df4133cadd2"> 183</a></span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="classmingfx_1_1_uni_cam.html#a65d5735b4b3a8e38f2b30df4133cadd2">eye</a>();</div>
+<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; </div>
+<div class="line"><a name="l00187"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#a8363576bf0f85c74d80ced697bd73d40"> 187</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_uni_cam.html#a8363576bf0f85c74d80ced697bd73d40">look</a>();</div>
+<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; </div>
+<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; </div>
+<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="comment">// -------------</span></div>
+<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; </div>
+<div class="line"><a name="l00194"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#a6b17bab82595ca468a3c638512011e5b"> 194</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_uni_cam.html#a6b17bab82595ca468a3c638512011e5b">set_view_matrix</a>(<a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> viewMatrix);</div>
+<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; </div>
+<div class="line"><a name="l00202"></a><span class="lineno"><a class="line" href="classmingfx_1_1_uni_cam.html#a71e0351ac19a18b9c02215a60dc51068"> 202</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_uni_cam.html#a71e0351ac19a18b9c02215a60dc51068">set_default_depth</a>(<span class="keywordtype">float</span> d);</div>
+<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; </div>
+<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; </div>
+<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; </div>
+<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keywordtype">void</span> recalc_angular_vel();</div>
+<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; </div>
+<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keyword">enum class</span> UniCamState {</div>
+<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; START,</div>
+<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; PAN_DOLLY_ROT_DECISION,</div>
+<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; PAN_DOLLY_DECISION,</div>
+<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; ROT_WAIT_FOR_SECOND_CLICK,</div>
+<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; PAN,</div>
+<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; DOLLY,</div>
+<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; ROT,</div>
+<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; SPINNING</div>
+<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; };</div>
+<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; UniCamState state_;</div>
+<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; </div>
+<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <a class="code" href="classmingfx_1_1_point2.html">Point2</a> mouseLast_;</div>
+<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordtype">double</span> elapsedTime_;</div>
+<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; </div>
+<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <a class="code" href="classmingfx_1_1_point2.html">Point2</a> initialClickPos_;</div>
+<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keywordtype">bool</span> hitGeometry_;</div>
+<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> hitPoint_;</div>
+<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; </div>
+<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keywordtype">bool</span> rotInitialized_;</div>
+<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> rotLastIPoint_;</div>
+<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordtype">float</span> boundingSphereRad_;</div>
+<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <a class="code" href="classmingfx_1_1_point3.html">Point3</a> boundingSphereCtr_;</div>
+<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keywordtype">double</span> rotLastTime_;</div>
+<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; std::vector&lt;std::pair&lt;double, double&gt;&gt; rotAngularVelBuffer_;</div>
+<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordtype">double</span> rotAngularVel_;</div>
+<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> rotAxis_;</div>
+<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; </div>
+<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordtype">bool</span> dollyInitialized_;</div>
+<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keywordtype">float</span> dollyFactor_;</div>
+<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="keywordtype">float</span> defaultDepth_;</div>
+<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; </div>
+<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keywordtype">bool</span> showIcon_;</div>
+<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <a class="code" href="classmingfx_1_1_quick_shapes.html">QuickShapes</a> quickShapes_;</div>
+<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; </div>
+<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> V_;</div>
+<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> Vstart_;</div>
+<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; </div>
+<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <span class="comment">// saved from the last draw call in order to unproject the mouse pos</span></div>
+<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <a class="code" href="classmingfx_1_1_matrix4.html">Matrix4</a> Pdraw_;</div>
+<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160;};</div>
+<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; </div>
+<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; </div>
+<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; </div>
+<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; </div>
+<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; </div>
+<div class="ttc" id="aclassmingfx_1_1_matrix4_html"><div class="ttname"><a href="classmingfx_1_1_matrix4.html">mingfx::Matrix4</a></div><div class="ttdoc">A 4x4 transformation matrix stored internally as an array of floats in column-major order so as to be...</div><div class="ttdef"><b>Definition:</b> <a href="matrix4_8h_source.html#l00050">matrix4.h:50</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html"><div class="ttname"><a href="classmingfx_1_1_point2.html">mingfx::Point2</a></div><div class="ttdoc">A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...</div><div class="ttdef"><b>Definition:</b> <a href="point2_8h_source.html#l00028">point2.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_quick_shapes_html"><div class="ttname"><a href="classmingfx_1_1_quick_shapes.html">mingfx::QuickShapes</a></div><div class="ttdoc">This class provides a quick way to draw shapes for use in debugging or simple scenes.</div><div class="ttdef"><b>Definition:</b> <a href="quick__shapes_8h_source.html#l00069">quick_shapes.h:69</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html">mingfx::UniCam</a></div><div class="ttdoc">This implements a user interface for controlling the camera with the mouse.</div><div class="ttdef"><b>Definition:</b> <a href="unicam_8h_source.html#l00105">unicam.h:105</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_a2a9431dc3943c8dc485994d88ce2a58a"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#a2a9431dc3943c8dc485994d88ce2a58a">mingfx::UniCam::OnButtonUp</a></div><div class="ttdeci">void OnButtonUp(const Point2 &amp;normalizedMousePos)</div><div class="ttdoc">Attach this to the corresponding button up event, for example, call this from within GraphicsApp::OnR...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_a33f1b41fcf53ea78ca2b3640902c5bbe"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#a33f1b41fcf53ea78ca2b3640902c5bbe">mingfx::UniCam::OnDrag</a></div><div class="ttdeci">void OnDrag(const Point2 &amp;normalizedMousePos)</div><div class="ttdoc">Attach this to the corresponding mouse move event, for example, call this from within GraphicsApp::On...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_a65d5735b4b3a8e38f2b30df4133cadd2"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#a65d5735b4b3a8e38f2b30df4133cadd2">mingfx::UniCam::eye</a></div><div class="ttdeci">Point3 eye()</div><div class="ttdoc">Returns the &quot;eye&quot; point (i.e., focal point) of the camera in world space coordinates.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_a6b17bab82595ca468a3c638512011e5b"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#a6b17bab82595ca468a3c638512011e5b">mingfx::UniCam::set_view_matrix</a></div><div class="ttdeci">void set_view_matrix(Matrix4 viewMatrix)</div><div class="ttdoc">This is not required, but you may use this if you wish to set an initial view matrix or reset the vie...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_a6e7771961011f573b2e2249f602b2d2e"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#a6e7771961011f573b2e2249f602b2d2e">mingfx::UniCam::UniCam</a></div><div class="ttdeci">UniCam()</div><div class="ttdoc">Creates a UniCam object with an initial view matrix = identity.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_a71e0351ac19a18b9c02215a60dc51068"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#a71e0351ac19a18b9c02215a60dc51068">mingfx::UniCam::set_default_depth</a></div><div class="ttdeci">void set_default_depth(float d)</div><div class="ttdoc">This sets the depth of the center of rotation for the case when the user's click does not intersect a...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_a8363576bf0f85c74d80ced697bd73d40"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#a8363576bf0f85c74d80ced697bd73d40">mingfx::UniCam::look</a></div><div class="ttdeci">Vector3 look()</div><div class="ttdoc">Returns the look direction (i.e., -Z axis of the camera matrix) in world space coordinates.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_a85afba6e8792636f3c6ba2433db1c52f"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#a85afba6e8792636f3c6ba2433db1c52f">mingfx::UniCam::OnButtonDown</a></div><div class="ttdeci">void OnButtonDown(const Point2 &amp;normalizedMousePos, float mouseZ)</div><div class="ttdoc">Attach this to whatever mouse button you wish, for example, call this from within GraphicsApp::OnRigh...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_aab253d966af52ac277ac51194745085c"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#aab253d966af52ac277ac51194745085c">mingfx::UniCam::AdvanceAnimation</a></div><div class="ttdeci">void AdvanceAnimation(double dt)</div><div class="ttdoc">Attach this to a callback that can be used to control animation. Within GraphicsApp::UpdateSimulation...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_ae45f3c80c205a539baeb4f1b8787777d"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#ae45f3c80c205a539baeb4f1b8787777d">mingfx::UniCam::Draw</a></div><div class="ttdeci">void Draw(const Matrix4 &amp;projectionMatrix)</div><div class="ttdoc">Finally, attach this to your draw callback routine. Within GraphicsApp::DrawUsingOpenGL(),...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_af507e639c4bceb4c79e21a6f80c48d07"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#af507e639c4bceb4c79e21a6f80c48d07">mingfx::UniCam::UniCam</a></div><div class="ttdeci">UniCam(const Matrix4 &amp;initialViewMatrix)</div><div class="ttdoc">Creates a UniCam object with the supplied initial view matrix.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_af7e7276f9390ec57ca577092c99d6ca3"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#af7e7276f9390ec57ca577092c99d6ca3">mingfx::UniCam::view_matrix</a></div><div class="ttdeci">Matrix4 view_matrix()</div><div class="ttdoc">Access the camera view matrix created by the UniCam interactions via this method and use it to draw t...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_uni_cam_html_af98022627bcb52dbf54779cfaeb6ff7e"><div class="ttname"><a href="classmingfx_1_1_uni_cam.html#af98022627bcb52dbf54779cfaeb6ff7e">mingfx::UniCam::~UniCam</a></div><div class="ttdeci">virtual ~UniCam()</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="apoint2_8h_html"><div class="ttname"><a href="point2_8h.html">point2.h</a></div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+<div class="ttc" id="aquick__shapes_8h_html"><div class="ttname"><a href="quick__shapes_8h.html">quick_shapes.h</a></div></div>
+<div class="ttc" id="avector2_8h_html"><div class="ttname"><a href="vector2_8h.html">vector2.h</a></div></div>
+<div class="ttc" id="avector3_8h_html"><div class="ttname"><a href="vector3_8h.html">vector3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/vector2_8h.html b/dev/MinGfx/docs/html/vector2_8h.html
new file mode 100644
index 0000000..b035960
--- /dev/null
+++ b/dev/MinGfx/docs/html/vector2_8h.html
@@ -0,0 +1,149 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/vector2.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">vector2.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;iostream&gt;</code><br />
+<code>#include &quot;<a class="el" href="point2_8h_source.html">point2.h</a>&quot;</code><br />
+</div>
+<p><a href="vector2_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 2D Vector with floating point coordinates, used for storing 2D translations, mouse movements, and screen-space vectors. <a href="classmingfx_1_1_vector2.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a79ffb6c38c6c0b68ce1fdb7ae76ea6bd"><td class="memItemLeft" align="right" valign="top">Vector2&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a79ffb6c38c6c0b68ce1fdb7ae76ea6bd">mingfx::operator/</a> (const Vector2 &amp;v, const float s)</td></tr>
+<tr class="memdesc:a79ffb6c38c6c0b68ce1fdb7ae76ea6bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Divide the vector by the scalar s. <a href="namespacemingfx.html#a79ffb6c38c6c0b68ce1fdb7ae76ea6bd">More...</a><br /></td></tr>
+<tr class="separator:a79ffb6c38c6c0b68ce1fdb7ae76ea6bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8bc25e621d21323fdd96f2c4a4141432"><td class="memItemLeft" align="right" valign="top">Vector2&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a8bc25e621d21323fdd96f2c4a4141432">mingfx::operator*</a> (const float s, const Vector2 &amp;v)</td></tr>
+<tr class="memdesc:a8bc25e621d21323fdd96f2c4a4141432"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply the vector by the scalar s. <a href="namespacemingfx.html#a8bc25e621d21323fdd96f2c4a4141432">More...</a><br /></td></tr>
+<tr class="separator:a8bc25e621d21323fdd96f2c4a4141432"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8358de6421374fb037e8c51e8f2d5878"><td class="memItemLeft" align="right" valign="top">Vector2&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a8358de6421374fb037e8c51e8f2d5878">mingfx::operator*</a> (const Vector2 &amp;v, const float s)</td></tr>
+<tr class="memdesc:a8358de6421374fb037e8c51e8f2d5878"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply the vector by the scalar s. <a href="namespacemingfx.html#a8358de6421374fb037e8c51e8f2d5878">More...</a><br /></td></tr>
+<tr class="separator:a8358de6421374fb037e8c51e8f2d5878"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5daeaa383c40eed6f41b2c1b7930499f"><td class="memItemLeft" align="right" valign="top">Vector2&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a5daeaa383c40eed6f41b2c1b7930499f">mingfx::operator-</a> (const Vector2 &amp;v)</td></tr>
+<tr class="memdesc:a5daeaa383c40eed6f41b2c1b7930499f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Negate the vector. <a href="namespacemingfx.html#a5daeaa383c40eed6f41b2c1b7930499f">More...</a><br /></td></tr>
+<tr class="separator:a5daeaa383c40eed6f41b2c1b7930499f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac71c01d7c300671cb343a24b68a875bf"><td class="memItemLeft" align="right" valign="top">Point2&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ac71c01d7c300671cb343a24b68a875bf">mingfx::operator+</a> (const Vector2 &amp;v, const Point2 &amp;p)</td></tr>
+<tr class="memdesc:ac71c01d7c300671cb343a24b68a875bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a vector and a point, returns a point. <a href="namespacemingfx.html#ac71c01d7c300671cb343a24b68a875bf">More...</a><br /></td></tr>
+<tr class="separator:ac71c01d7c300671cb343a24b68a875bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2083f9992ba509a275db11522f16a2e"><td class="memItemLeft" align="right" valign="top">Point2&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ab2083f9992ba509a275db11522f16a2e">mingfx::operator+</a> (const Point2 &amp;p, const Vector2 &amp;v)</td></tr>
+<tr class="memdesc:ab2083f9992ba509a275db11522f16a2e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a point and a vector, returns a point. <a href="namespacemingfx.html#ab2083f9992ba509a275db11522f16a2e">More...</a><br /></td></tr>
+<tr class="separator:ab2083f9992ba509a275db11522f16a2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acdffada748181cc17ec93784f858ff9f"><td class="memItemLeft" align="right" valign="top">Vector2&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#acdffada748181cc17ec93784f858ff9f">mingfx::operator+</a> (const Vector2 &amp;v1, const Vector2 &amp;v2)</td></tr>
+<tr class="memdesc:acdffada748181cc17ec93784f858ff9f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a vector and a vector, returns a vector. <a href="namespacemingfx.html#acdffada748181cc17ec93784f858ff9f">More...</a><br /></td></tr>
+<tr class="separator:acdffada748181cc17ec93784f858ff9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae81fac825c0f6eca59cc1a1cc06d63f2"><td class="memItemLeft" align="right" valign="top">Point2&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ae81fac825c0f6eca59cc1a1cc06d63f2">mingfx::operator-</a> (const Point2 &amp;p, const Vector2 &amp;v)</td></tr>
+<tr class="memdesc:ae81fac825c0f6eca59cc1a1cc06d63f2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts a vector from a point, returns a point. <a href="namespacemingfx.html#ae81fac825c0f6eca59cc1a1cc06d63f2">More...</a><br /></td></tr>
+<tr class="separator:ae81fac825c0f6eca59cc1a1cc06d63f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a128585c0b87e03beda4a660d4e58789b"><td class="memItemLeft" align="right" valign="top">Vector2&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a128585c0b87e03beda4a660d4e58789b">mingfx::operator-</a> (const Vector2 &amp;v1, const Vector2 &amp;v2)</td></tr>
+<tr class="memdesc:a128585c0b87e03beda4a660d4e58789b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts v2 from v1, returns a vector. <a href="namespacemingfx.html#a128585c0b87e03beda4a660d4e58789b">More...</a><br /></td></tr>
+<tr class="separator:a128585c0b87e03beda4a660d4e58789b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad370bce0bb5b88beb974aad1d44890e8"><td class="memItemLeft" align="right" valign="top">Vector2&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ad370bce0bb5b88beb974aad1d44890e8">mingfx::operator-</a> (const Point2 &amp;p1, const Point2 &amp;p2)</td></tr>
+<tr class="memdesc:ad370bce0bb5b88beb974aad1d44890e8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the vector spanning p1 and p2. <a href="namespacemingfx.html#ad370bce0bb5b88beb974aad1d44890e8">More...</a><br /></td></tr>
+<tr class="separator:ad370bce0bb5b88beb974aad1d44890e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acbe43aa24ecedf663c65becf2be282c7"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#acbe43aa24ecedf663c65becf2be282c7">mingfx::operator&lt;&lt;</a> (std::ostream &amp;os, const Vector2 &amp;v)</td></tr>
+<tr class="separator:acbe43aa24ecedf663c65becf2be282c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3f12496d7a5028b71882373d6fa7203"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#ab3f12496d7a5028b71882373d6fa7203">mingfx::operator&gt;&gt;</a> (std::istream &amp;is, Vector2 &amp;v)</td></tr>
+<tr class="separator:ab3f12496d7a5028b71882373d6fa7203"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/vector2_8h_source.html b/dev/MinGfx/docs/html/vector2_8h_source.html
new file mode 100644
index 0000000..935000d
--- /dev/null
+++ b/dev/MinGfx/docs/html/vector2_8h_source.html
@@ -0,0 +1,261 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/vector2.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">vector2.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="vector2_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_VECTOR2_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_VECTOR2_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; </div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point2_8h.html">point2.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; </div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; </div>
+<div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html"> 28</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> {</div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; </div>
+<div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f"> 32</a></span>&#160; <a class="code" href="classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f">Vector2</a>();</div>
+<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; </div>
+<div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#acc16337b6b06ebea2fde4c4bd1be7abd"> 36</a></span>&#160; <a class="code" href="classmingfx_1_1_vector2.html#acc16337b6b06ebea2fde4c4bd1be7abd">Vector2</a>(<span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a">x</a>, <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b">y</a>);</div>
+<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; </div>
+<div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a6e3d063a7080bfe199acc70cd5afded2"> 39</a></span>&#160; <a class="code" href="classmingfx_1_1_vector2.html#a6e3d063a7080bfe199acc70cd5afded2">Vector2</a>(<span class="keywordtype">float</span> *v);</div>
+<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; </div>
+<div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a40f53939581f5d06a1b757b0398525f8"> 42</a></span>&#160; <a class="code" href="classmingfx_1_1_vector2.html#a40f53939581f5d06a1b757b0398525f8">Vector2</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v);</div>
+<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; </div>
+<div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#ac49b009c4b6052ebe71d5cf4ce241b1f"> 45</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_vector2.html#ac49b009c4b6052ebe71d5cf4ce241b1f">~Vector2</a>();</div>
+<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; </div>
+<div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#ad7acc2cf4dcd2eca210899c846bb7dfe"> 48</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_vector2.html#ad7acc2cf4dcd2eca210899c846bb7dfe">operator==</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; </div>
+<div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a1cf3488f1f14a9bf7f6e1278c1c63cdb"> 51</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_vector2.html#a1cf3488f1f14a9bf7f6e1278c1c63cdb">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; </div>
+<div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a28c44a323e5bd1a251dee9e00e2e1769"> 54</a></span>&#160; <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; <a class="code" href="classmingfx_1_1_vector2.html#a28c44a323e5bd1a251dee9e00e2e1769">operator=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v);</div>
+<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; </div>
+<div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#ae1fc0ce3ca1af3d0546af32742e13000"> 57</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector2.html#ae1fc0ce3ca1af3d0546af32742e13000">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; </div>
+<div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a93acf7f4f150cfe53859e31d90eddd1e"> 66</a></span>&#160; <span class="keywordtype">float</span>&amp; <a class="code" href="classmingfx_1_1_vector2.html#a93acf7f4f150cfe53859e31d90eddd1e">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i);</div>
+<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; </div>
+<div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a"> 70</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a">x</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> v[0]; }</div>
+<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; </div>
+<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b"> 74</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b">y</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> v[1]; }</div>
+<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; </div>
+<div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a267e6749091f23263d1620f801f0a831"> 77</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector2.html#a267e6749091f23263d1620f801f0a831">w</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> 0.0; }</div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
+<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; </div>
+<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="comment">// --- Vector operations ---</span></div>
+<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; </div>
+<div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#ae2208539c6b29712c22f557dcfdd55d9"> 83</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector2.html#ae2208539c6b29712c22f557dcfdd55d9">Dot</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; </div>
+<div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a71b90903d00cdc318ea42f593db6dbb9"> 86</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector2.html#a71b90903d00cdc318ea42f593db6dbb9">Length</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; </div>
+<div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a632ddd5b06c48fa0f6f39550e91082c0"> 89</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_vector2.html#a632ddd5b06c48fa0f6f39550e91082c0">Normalize</a>();</div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; </div>
+<div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a70f9f612a99017bf051e40ebd7fa7f83"> 93</a></span>&#160; <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="classmingfx_1_1_vector2.html#a70f9f612a99017bf051e40ebd7fa7f83">ToUnit</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
+<div class="line"><a name="l00098"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a5813ffa3c185551eec1927e1daa4cb17"> 98</a></span>&#160; <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="classmingfx_1_1_vector2.html#a5813ffa3c185551eec1927e1daa4cb17">Lerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;b, <span class="keywordtype">float</span> alpha) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; </div>
+<div class="line"><a name="l00101"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a80ef53519d50a6a6f158f66755c040d1"> 101</a></span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> * <a class="code" href="classmingfx_1_1_vector2.html#a80ef53519d50a6a6f158f66755c040d1">value_ptr</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
+<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; </div>
+<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; </div>
+<div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a06d6c283aba957bddc2b9849698838b2"> 106</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="classmingfx_1_1_vector2.html#a06d6c283aba957bddc2b9849698838b2">Normalize</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v);</div>
+<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; </div>
+<div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a9e81c518908ca06c98ba099b075fe1cd"> 109</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector2.html#a9e81c518908ca06c98ba099b075fe1cd">Dot</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v2);</div>
+<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; </div>
+<div class="line"><a name="l00112"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a7cb11f9fe8962ff9092fc1e5736faacf"> 112</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; <a class="code" href="classmingfx_1_1_vector2.html#a7cb11f9fe8962ff9092fc1e5736faacf">Zero</a>();</div>
+<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; </div>
+<div class="line"><a name="l00115"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a5b51e62f03e95d6be1262f037aecf0fd"> 115</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; <a class="code" href="classmingfx_1_1_vector2.html#a5b51e62f03e95d6be1262f037aecf0fd">One</a>();</div>
+<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; </div>
+<div class="line"><a name="l00118"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#a8ef6e0525ec34aaee9cf35bab098ecdb"> 118</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; <a class="code" href="classmingfx_1_1_vector2.html#a8ef6e0525ec34aaee9cf35bab098ecdb">UnitX</a>();</div>
+<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; </div>
+<div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#ab7b3ba42a5a63c512bd7b32fd4cc0db0"> 121</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; <a class="code" href="classmingfx_1_1_vector2.html#ab7b3ba42a5a63c512bd7b32fd4cc0db0">UnitY</a>();</div>
+<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; </div>
+<div class="line"><a name="l00125"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector2.html#ac332b5f01b3357b85e6d279fb059d561"> 125</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="classmingfx_1_1_vector2.html#ac332b5f01b3357b85e6d279fb059d561">Lerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;a, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;b, <span class="keywordtype">float</span> alpha);</div>
+<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; </div>
+<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordtype">float</span> v[2];</div>
+<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;};</div>
+<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; </div>
+<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; </div>
+<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;<span class="comment">// ---------- Operator Overloads for Working with Vectors ----------</span></div>
+<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; </div>
+<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; </div>
+<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;<span class="comment">// --- Scalers ---</span></div>
+<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; </div>
+<div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a79ffb6c38c6c0b68ce1fdb7ae76ea6bd"> 138</a></span>&#160;<a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed">operator/</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v, <span class="keyword">const</span> <span class="keywordtype">float</span> s);</div>
+<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; </div>
+<div class="line"><a name="l00141"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a8bc25e621d21323fdd96f2c4a4141432"> 141</a></span>&#160;<a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <span class="keywordtype">float</span> s, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v);</div>
+<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; </div>
+<div class="line"><a name="l00144"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a8358de6421374fb037e8c51e8f2d5878"> 144</a></span>&#160;<a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v, <span class="keyword">const</span> <span class="keywordtype">float</span> s);</div>
+<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; </div>
+<div class="line"><a name="l00147"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a5daeaa383c40eed6f41b2c1b7930499f"> 147</a></span>&#160;<a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">operator-</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v);</div>
+<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; </div>
+<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160;<span class="comment">// Note: no -(point) operator, that&#39;s an undefined operation</span></div>
+<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; </div>
+<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; </div>
+<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;<span class="comment">// --- Point and Vector Arithmetic ---</span></div>
+<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; </div>
+<div class="line"><a name="l00155"></a><span class="lineno"><a class="line" href="namespacemingfx.html#ac71c01d7c300671cb343a24b68a875bf"> 155</a></span>&#160;<a class="code" href="classmingfx_1_1_point2.html">Point2</a> <a class="code" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">operator+</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; p);</div>
+<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; </div>
+<div class="line"><a name="l00158"></a><span class="lineno"><a class="line" href="namespacemingfx.html#ab2083f9992ba509a275db11522f16a2e"> 158</a></span>&#160;<a class="code" href="classmingfx_1_1_point2.html">Point2</a> <a class="code" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">operator+</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; p, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v);</div>
+<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; </div>
+<div class="line"><a name="l00161"></a><span class="lineno"><a class="line" href="namespacemingfx.html#acdffada748181cc17ec93784f858ff9f"> 161</a></span>&#160;<a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">operator+</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v2);</div>
+<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; </div>
+<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;<span class="comment">// Note: no (point + point) operator, that&#39;s an undefined operation</span></div>
+<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; </div>
+<div class="line"><a name="l00166"></a><span class="lineno"><a class="line" href="namespacemingfx.html#ae81fac825c0f6eca59cc1a1cc06d63f2"> 166</a></span>&#160;<a class="code" href="classmingfx_1_1_point2.html">Point2</a> <a class="code" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">operator-</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; p, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v);</div>
+<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; </div>
+<div class="line"><a name="l00169"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a128585c0b87e03beda4a660d4e58789b"> 169</a></span>&#160;<a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">operator-</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a>&amp; v2);</div>
+<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; </div>
+<div class="line"><a name="l00172"></a><span class="lineno"><a class="line" href="namespacemingfx.html#ad370bce0bb5b88beb974aad1d44890e8"> 172</a></span>&#160;<a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> <a class="code" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">operator-</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; p1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point2.html">Point2</a>&amp; p2);</div>
+<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; </div>
+<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;<span class="comment">// Note: no (vector - point) operator, that&#39;s an undefined operation</span></div>
+<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; </div>
+<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; </div>
+<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;<span class="comment">// --- Stream operators ---</span></div>
+<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; </div>
+<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;<span class="comment">// Vector2</span></div>
+<div class="line"><a name="l00180"></a><span class="lineno"><a class="line" href="namespacemingfx.html#acbe43aa24ecedf663c65becf2be282c7"> 180</a></span>&#160;std::ostream &amp; <a class="code" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">operator&lt;&lt; </a>( std::ostream &amp;os, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v);</div>
+<div class="line"><a name="l00181"></a><span class="lineno"><a class="line" href="namespacemingfx.html#ab3f12496d7a5028b71882373d6fa7203"> 181</a></span>&#160;std::istream &amp; <a class="code" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">operator&gt;&gt; </a>( std::istream &amp;is, <a class="code" href="classmingfx_1_1_vector2.html">Vector2</a> &amp;v);</div>
+<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; </div>
+<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; </div>
+<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; </div>
+<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_point2_html"><div class="ttname"><a href="classmingfx_1_1_point2.html">mingfx::Point2</a></div><div class="ttdoc">A 2D Point with floating point coordinates, used for storing 2D texture coordinates,...</div><div class="ttdef"><b>Definition:</b> <a href="point2_8h_source.html#l00028">point2.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html"><div class="ttname"><a href="classmingfx_1_1_vector2.html">mingfx::Vector2</a></div><div class="ttdoc">A 2D Vector with floating point coordinates, used for storing 2D translations, mouse movements,...</div><div class="ttdef"><b>Definition:</b> <a href="vector2_8h_source.html#l00028">vector2.h:28</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a06d6c283aba957bddc2b9849698838b2"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a06d6c283aba957bddc2b9849698838b2">mingfx::Vector2::Normalize</a></div><div class="ttdeci">static Vector2 Normalize(const Vector2 &amp;v)</div><div class="ttdoc">Returns a new vector that is the unit version of v.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a1cf3488f1f14a9bf7f6e1278c1c63cdb"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a1cf3488f1f14a9bf7f6e1278c1c63cdb">mingfx::Vector2::operator!=</a></div><div class="ttdeci">bool operator!=(const Vector2 &amp;v) const</div><div class="ttdoc">Check for &quot;inequality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a267e6749091f23263d1620f801f0a831"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a267e6749091f23263d1620f801f0a831">mingfx::Vector2::w</a></div><div class="ttdeci">float w() const</div><div class="ttdoc">In homogeneous coordinates, the w coordinate for all vectors is 0.0.</div><div class="ttdef"><b>Definition:</b> <a href="vector2_8h_source.html#l00077">vector2.h:77</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a28c44a323e5bd1a251dee9e00e2e1769"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a28c44a323e5bd1a251dee9e00e2e1769">mingfx::Vector2::operator=</a></div><div class="ttdeci">Vector2 &amp; operator=(const Vector2 &amp;v)</div><div class="ttdoc">Vector assignment operator.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a40f53939581f5d06a1b757b0398525f8"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a40f53939581f5d06a1b757b0398525f8">mingfx::Vector2::Vector2</a></div><div class="ttdeci">Vector2(const Vector2 &amp;v)</div><div class="ttdoc">Copy constructor for vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a5813ffa3c185551eec1927e1daa4cb17"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a5813ffa3c185551eec1927e1daa4cb17">mingfx::Vector2::Lerp</a></div><div class="ttdeci">Vector2 Lerp(const Vector2 &amp;b, float alpha) const</div><div class="ttdoc">Linear interpolation between this vector and another. Alpha=0.0 returns this vector,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a5b51e62f03e95d6be1262f037aecf0fd"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a5b51e62f03e95d6be1262f037aecf0fd">mingfx::Vector2::One</a></div><div class="ttdeci">static const Vector2 &amp; One()</div><div class="ttdoc">(1,1) - a shortcut for a special vector that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a632ddd5b06c48fa0f6f39550e91082c0"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a632ddd5b06c48fa0f6f39550e91082c0">mingfx::Vector2::Normalize</a></div><div class="ttdeci">void Normalize()</div><div class="ttdoc">Normalizes the vector by making it unit length.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a6e3d063a7080bfe199acc70cd5afded2"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a6e3d063a7080bfe199acc70cd5afded2">mingfx::Vector2::Vector2</a></div><div class="ttdeci">Vector2(float *v)</div><div class="ttdoc">Constructs a vector given a pointer to x,y,z data.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a70f9f612a99017bf051e40ebd7fa7f83"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a70f9f612a99017bf051e40ebd7fa7f83">mingfx::Vector2::ToUnit</a></div><div class="ttdeci">Vector2 ToUnit() const</div><div class="ttdoc">Returns a normalized (i.e., unit length) version of the vector without modifying the original ('this'...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a71b90903d00cdc318ea42f593db6dbb9"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a71b90903d00cdc318ea42f593db6dbb9">mingfx::Vector2::Length</a></div><div class="ttdeci">float Length() const</div><div class="ttdoc">Returns the length of the vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a7cb11f9fe8962ff9092fc1e5736faacf"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a7cb11f9fe8962ff9092fc1e5736faacf">mingfx::Vector2::Zero</a></div><div class="ttdeci">static const Vector2 &amp; Zero()</div><div class="ttdoc">(0,0) - a shortcut for a special vector that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a80ef53519d50a6a6f158f66755c040d1"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a80ef53519d50a6a6f158f66755c040d1">mingfx::Vector2::value_ptr</a></div><div class="ttdeci">const float * value_ptr() const</div><div class="ttdoc">Returns a const pointer to the raw data array.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a8ef6e0525ec34aaee9cf35bab098ecdb"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a8ef6e0525ec34aaee9cf35bab098ecdb">mingfx::Vector2::UnitX</a></div><div class="ttdeci">static const Vector2 &amp; UnitX()</div><div class="ttdoc">(1,0) - a shortcut for a special vector that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a93acf7f4f150cfe53859e31d90eddd1e"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a93acf7f4f150cfe53859e31d90eddd1e">mingfx::Vector2::operator[]</a></div><div class="ttdeci">float &amp; operator[](const int i)</div><div class="ttdoc">Returns a reference to the ith coordinate of the vector. Use this accessor if you wish to set the coo...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a962433a7e3158cf6b224604a0463852f"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a962433a7e3158cf6b224604a0463852f">mingfx::Vector2::Vector2</a></div><div class="ttdeci">Vector2()</div><div class="ttdoc">Default constructor to create zero vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_a9e81c518908ca06c98ba099b075fe1cd"><div class="ttname"><a href="classmingfx_1_1_vector2.html#a9e81c518908ca06c98ba099b075fe1cd">mingfx::Vector2::Dot</a></div><div class="ttdeci">static float Dot(const Vector2 &amp;v1, const Vector2 &amp;v2)</div><div class="ttdoc">Returns v1 dot v2.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_ab7b3ba42a5a63c512bd7b32fd4cc0db0"><div class="ttname"><a href="classmingfx_1_1_vector2.html#ab7b3ba42a5a63c512bd7b32fd4cc0db0">mingfx::Vector2::UnitY</a></div><div class="ttdeci">static const Vector2 &amp; UnitY()</div><div class="ttdoc">(0,1) - a shortcut for a special vector that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_ac332b5f01b3357b85e6d279fb059d561"><div class="ttname"><a href="classmingfx_1_1_vector2.html#ac332b5f01b3357b85e6d279fb059d561">mingfx::Vector2::Lerp</a></div><div class="ttdeci">static Vector2 Lerp(const Vector2 &amp;a, const Vector2 &amp;b, float alpha)</div><div class="ttdoc">Linear interpolation between two vectors. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b',...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_ac427d5c06474777e851bed05ec5d134b"><div class="ttname"><a href="classmingfx_1_1_vector2.html#ac427d5c06474777e851bed05ec5d134b">mingfx::Vector2::y</a></div><div class="ttdeci">float y() const</div><div class="ttdoc">Read only access to the y coordinate. Can also use my_vector[1]. Use the my_vector[1] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="vector2_8h_source.html#l00074">vector2.h:74</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_ac49b009c4b6052ebe71d5cf4ce241b1f"><div class="ttname"><a href="classmingfx_1_1_vector2.html#ac49b009c4b6052ebe71d5cf4ce241b1f">mingfx::Vector2::~Vector2</a></div><div class="ttdeci">virtual ~Vector2()</div><div class="ttdoc">Vector destructor.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_acc16337b6b06ebea2fde4c4bd1be7abd"><div class="ttname"><a href="classmingfx_1_1_vector2.html#acc16337b6b06ebea2fde4c4bd1be7abd">mingfx::Vector2::Vector2</a></div><div class="ttdeci">Vector2(float x, float y)</div><div class="ttdoc">Constructs a vector (x,y,0), where the 0 comes from the use of homogeneous coordinates in computer gr...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_ad7acc2cf4dcd2eca210899c846bb7dfe"><div class="ttname"><a href="classmingfx_1_1_vector2.html#ad7acc2cf4dcd2eca210899c846bb7dfe">mingfx::Vector2::operator==</a></div><div class="ttdeci">bool operator==(const Vector2 &amp;v) const</div><div class="ttdoc">Check for &quot;equality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_ae1fc0ce3ca1af3d0546af32742e13000"><div class="ttname"><a href="classmingfx_1_1_vector2.html#ae1fc0ce3ca1af3d0546af32742e13000">mingfx::Vector2::operator[]</a></div><div class="ttdeci">float operator[](const int i) const</div><div class="ttdoc">Read only access to the ith coordinate of the vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_ae2208539c6b29712c22f557dcfdd55d9"><div class="ttname"><a href="classmingfx_1_1_vector2.html#ae2208539c6b29712c22f557dcfdd55d9">mingfx::Vector2::Dot</a></div><div class="ttdeci">float Dot(const Vector2 &amp;v) const</div><div class="ttdoc">Returns &quot;this dot v&quot;.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector2_html_ae84b079eb21494bc7c9a93d32a63712a"><div class="ttname"><a href="classmingfx_1_1_vector2.html#ae84b079eb21494bc7c9a93d32a63712a">mingfx::Vector2::x</a></div><div class="ttdeci">float x() const</div><div class="ttdoc">Read only access to the x coordinate. Can also use my_vector[0]. Use the my_vector[0] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="vector2_8h_source.html#l00070">vector2.h:70</a></div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="anamespacemingfx_html_a2f5a225a54f07164d5172a3721a3aee6"><div class="ttname"><a href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">mingfx::operator-</a></div><div class="ttdeci">Quaternion operator-(const Quaternion &amp;q)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a3c3b45ed6edf3fe76f98a7fd165dca03"><div class="ttname"><a href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">mingfx::operator+</a></div><div class="ttdeci">AABB operator+(const AABB &amp;A, const AABB &amp;B)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a444ae88d836b913ac8307fbf4357f7ed"><div class="ttname"><a href="namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed">mingfx::operator/</a></div><div class="ttdeci">Quaternion operator/(const Quaternion &amp;q, const float s)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a6bc967741341f4f318a505d884192906"><div class="ttname"><a href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">mingfx::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a6eb31e6e81c6e29144799be4c9db404d"><div class="ttname"><a href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">mingfx::operator&gt;&gt;</a></div><div class="ttdeci">std::istream &amp; operator&gt;&gt;(std::istream &amp;is, Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_ae5708e414f585dde2a5418ddae259a57"><div class="ttname"><a href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">mingfx::operator*</a></div><div class="ttdeci">Matrix4 operator*(const Matrix4 &amp;m, const float &amp;s)</div><div class="ttdoc">Multiply matrix and scalar, returns the new matrix.</div></div>
+<div class="ttc" id="apoint2_8h_html"><div class="ttname"><a href="point2_8h.html">point2.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/vector3_8h.html b/dev/MinGfx/docs/html/vector3_8h.html
new file mode 100644
index 0000000..d2c0502
--- /dev/null
+++ b/dev/MinGfx/docs/html/vector3_8h.html
@@ -0,0 +1,149 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/vector3.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">vector3.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;iostream&gt;</code><br />
+<code>#include &quot;<a class="el" href="point3_8h_source.html">point3.h</a>&quot;</code><br />
+</div>
+<p><a href="vector3_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graphics operations. <a href="classmingfx_1_1_vector3.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacemingfx"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html">mingfx</a></td></tr>
+<tr class="memdesc:namespacemingfx"><td class="mdescLeft">&#160;</td><td class="mdescRight">Namespace for the MinGfx Toolkit. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa19b1dea0b7aa468950e56044fda328a"><td class="memItemLeft" align="right" valign="top">Vector3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aa19b1dea0b7aa468950e56044fda328a">mingfx::operator/</a> (const Vector3 &amp;v, const float s)</td></tr>
+<tr class="memdesc:aa19b1dea0b7aa468950e56044fda328a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Divide the vector by the scalar s. <a href="namespacemingfx.html#aa19b1dea0b7aa468950e56044fda328a">More...</a><br /></td></tr>
+<tr class="separator:aa19b1dea0b7aa468950e56044fda328a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e3941689c65388690916d00e0d423d4"><td class="memItemLeft" align="right" valign="top">Vector3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a7e3941689c65388690916d00e0d423d4">mingfx::operator*</a> (const float s, const Vector3 &amp;v)</td></tr>
+<tr class="memdesc:a7e3941689c65388690916d00e0d423d4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply the vector by the scalar s. <a href="namespacemingfx.html#a7e3941689c65388690916d00e0d423d4">More...</a><br /></td></tr>
+<tr class="separator:a7e3941689c65388690916d00e0d423d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8a18cb8506dee589eaf6883a32e6fb5"><td class="memItemLeft" align="right" valign="top">Vector3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aa8a18cb8506dee589eaf6883a32e6fb5">mingfx::operator*</a> (const Vector3 &amp;v, const float s)</td></tr>
+<tr class="memdesc:aa8a18cb8506dee589eaf6883a32e6fb5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Multiply the vector by the scalar s. <a href="namespacemingfx.html#aa8a18cb8506dee589eaf6883a32e6fb5">More...</a><br /></td></tr>
+<tr class="separator:aa8a18cb8506dee589eaf6883a32e6fb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd07add6169773bae12d40201f8af7db"><td class="memItemLeft" align="right" valign="top">Vector3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#afd07add6169773bae12d40201f8af7db">mingfx::operator-</a> (const Vector3 &amp;v)</td></tr>
+<tr class="memdesc:afd07add6169773bae12d40201f8af7db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Negate the vector. <a href="namespacemingfx.html#afd07add6169773bae12d40201f8af7db">More...</a><br /></td></tr>
+<tr class="separator:afd07add6169773bae12d40201f8af7db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b4428d2cf65ba5226ef4036352d311e"><td class="memItemLeft" align="right" valign="top">Point3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a4b4428d2cf65ba5226ef4036352d311e">mingfx::operator+</a> (const Vector3 &amp;v, const Point3 &amp;p)</td></tr>
+<tr class="memdesc:a4b4428d2cf65ba5226ef4036352d311e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a vector and a point, returns a point. <a href="namespacemingfx.html#a4b4428d2cf65ba5226ef4036352d311e">More...</a><br /></td></tr>
+<tr class="separator:a4b4428d2cf65ba5226ef4036352d311e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aadea317107a50ec6847ce01927b61c82"><td class="memItemLeft" align="right" valign="top">Point3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aadea317107a50ec6847ce01927b61c82">mingfx::operator+</a> (const Point3 &amp;p, const Vector3 &amp;v)</td></tr>
+<tr class="memdesc:aadea317107a50ec6847ce01927b61c82"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a point and a vector, returns a point. <a href="namespacemingfx.html#aadea317107a50ec6847ce01927b61c82">More...</a><br /></td></tr>
+<tr class="separator:aadea317107a50ec6847ce01927b61c82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeeeb04b70f8e8becbcda7a3dc7024c1b"><td class="memItemLeft" align="right" valign="top">Vector3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aeeeb04b70f8e8becbcda7a3dc7024c1b">mingfx::operator+</a> (const Vector3 &amp;v1, const Vector3 &amp;v2)</td></tr>
+<tr class="memdesc:aeeeb04b70f8e8becbcda7a3dc7024c1b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a vector and a vector, returns a vector. <a href="namespacemingfx.html#aeeeb04b70f8e8becbcda7a3dc7024c1b">More...</a><br /></td></tr>
+<tr class="separator:aeeeb04b70f8e8becbcda7a3dc7024c1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a579b90d99a1d6f794ca44017ded3a8db"><td class="memItemLeft" align="right" valign="top">Point3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a579b90d99a1d6f794ca44017ded3a8db">mingfx::operator-</a> (const Point3 &amp;p, const Vector3 &amp;v)</td></tr>
+<tr class="memdesc:a579b90d99a1d6f794ca44017ded3a8db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts a vector from a point, returns a point. <a href="namespacemingfx.html#a579b90d99a1d6f794ca44017ded3a8db">More...</a><br /></td></tr>
+<tr class="separator:a579b90d99a1d6f794ca44017ded3a8db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecdf7f36c4feb04034f1d07c49d5c0e3"><td class="memItemLeft" align="right" valign="top">Vector3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#aecdf7f36c4feb04034f1d07c49d5c0e3">mingfx::operator-</a> (const Vector3 &amp;v1, const Vector3 &amp;v2)</td></tr>
+<tr class="memdesc:aecdf7f36c4feb04034f1d07c49d5c0e3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subtracts v2 from v1, returns a vector. <a href="namespacemingfx.html#aecdf7f36c4feb04034f1d07c49d5c0e3">More...</a><br /></td></tr>
+<tr class="separator:aecdf7f36c4feb04034f1d07c49d5c0e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77d92da8f1a866306518422cd9d2f0af"><td class="memItemLeft" align="right" valign="top">Vector3&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a77d92da8f1a866306518422cd9d2f0af">mingfx::operator-</a> (const Point3 &amp;p1, const Point3 &amp;p2)</td></tr>
+<tr class="memdesc:a77d92da8f1a866306518422cd9d2f0af"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the vector spanning p1 and p2. <a href="namespacemingfx.html#a77d92da8f1a866306518422cd9d2f0af">More...</a><br /></td></tr>
+<tr class="separator:a77d92da8f1a866306518422cd9d2f0af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3425c24faf923364cd3a764d50601c52"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a3425c24faf923364cd3a764d50601c52">mingfx::operator&lt;&lt;</a> (std::ostream &amp;os, const Vector3 &amp;v)</td></tr>
+<tr class="separator:a3425c24faf923364cd3a764d50601c52"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8cc2f52569661416cb2ca67c516b7c93"><td class="memItemLeft" align="right" valign="top">std::istream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemingfx.html#a8cc2f52569661416cb2ca67c516b7c93">mingfx::operator&gt;&gt;</a> (std::istream &amp;is, Vector3 &amp;v)</td></tr>
+<tr class="separator:a8cc2f52569661416cb2ca67c516b7c93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/html/vector3_8h_source.html b/dev/MinGfx/docs/html/vector3_8h_source.html
new file mode 100644
index 0000000..a64d797
--- /dev/null
+++ b/dev/MinGfx/docs/html/vector3_8h_source.html
@@ -0,0 +1,275 @@
+<!-- HTML header for doxygen 1.8.9.1-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<title>MinGfx Toolkit: src/vector3.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+});
+</script>
+<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">MinGfx Toolkit
+ &#160;<span id="projectnumber">1.0</span>
+ </div>
+ <div id="projectbrief">A minimal library for writing cross-platform (Windows, OSX, linux) graphics programs.</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">vector3.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="vector3_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> This file is part of the MinGfx Project.</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2017,2018 Regents of the University of Minnesota.</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All Rights Reserved.</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Original Author(s) of this File:</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Dan Keefe, 2018, University of Minnesota</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> </span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> Author(s) of Significant Updates/Modifications to the File:</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> ...</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#ifndef SRC_VECTOR3_H_</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define SRC_VECTOR3_H_</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; </div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point3_8h.html">point3.h</a>&quot;</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; </div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemingfx.html">mingfx</a> {</div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; </div>
+<div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html"> 62</a></span>&#160;<span class="keyword">class </span><a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> {</div>
+<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; </div>
+<div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd"> 66</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">Vector3</a>();</div>
+<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; </div>
+<div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a256018f34e230d542027d07d14fd6e65"> 70</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html#a256018f34e230d542027d07d14fd6e65">Vector3</a>(<span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">x</a>, <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">y</a>, <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6">z</a>);</div>
+<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; </div>
+<div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a95b274c7a5ff118af20bc71682c6b1f1"> 73</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html#a95b274c7a5ff118af20bc71682c6b1f1">Vector3</a>(<span class="keywordtype">float</span> *v);</div>
+<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; </div>
+<div class="line"><a name="l00076"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#af6100965af7770f833dbf0c9f30f4fdd"> 76</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html#af6100965af7770f833dbf0c9f30f4fdd">Vector3</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v);</div>
+<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; </div>
+<div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a6e0d09d774615bcfde5645c22a645969"> 79</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classmingfx_1_1_vector3.html#a6e0d09d774615bcfde5645c22a645969">~Vector3</a>();</div>
+<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; </div>
+<div class="line"><a name="l00082"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a85486d0a355417fe4b41fa64146c9e98"> 82</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_vector3.html#a85486d0a355417fe4b41fa64146c9e98">operator==</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; </div>
+<div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#ab93acb916c310920b9c011159eaaa016"> 85</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classmingfx_1_1_vector3.html#ab93acb916c310920b9c011159eaaa016">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; </div>
+<div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#aa5b1c05c285fad7f2709f6f351a63608"> 88</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; <a class="code" href="classmingfx_1_1_vector3.html#aa5b1c05c285fad7f2709f6f351a63608">operator=</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v);</div>
+<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; </div>
+<div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#aa37b1fc4b1df9f72726d981c08cd0d1b"> 91</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector3.html#aa37b1fc4b1df9f72726d981c08cd0d1b">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; </div>
+<div class="line"><a name="l00100"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#abcdda4627b24af879aba38d4fc0e6f71"> 100</a></span>&#160; <span class="keywordtype">float</span>&amp; <a class="code" href="classmingfx_1_1_vector3.html#abcdda4627b24af879aba38d4fc0e6f71">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i); </div>
+<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; </div>
+<div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4"> 104</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">x</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> v[0]; }</div>
+<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; </div>
+<div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17"> 108</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">y</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> v[1]; }</div>
+<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; </div>
+<div class="line"><a name="l00112"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6"> 112</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6">z</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> v[2]; }</div>
+<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; </div>
+<div class="line"><a name="l00115"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5"> 115</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">w</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> 0.0; }</div>
+<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; </div>
+<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; </div>
+<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="comment">// --- Vector operations ---</span></div>
+<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; </div>
+<div class="line"><a name="l00127"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a31692a459a8056fe220d115eb5addc88"> 127</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector3.html#a31692a459a8056fe220d115eb5addc88">Dot</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; </div>
+<div class="line"><a name="l00136"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a38cd4deed7d342464619b34b0ef95bec"> 136</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_vector3.html#a38cd4deed7d342464619b34b0ef95bec">Cross</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; </div>
+<div class="line"><a name="l00139"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a7633dc1625b1f2e6b381438e896b45a3"> 139</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector3.html#a7633dc1625b1f2e6b381438e896b45a3">Length</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; </div>
+<div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a9b8e9ecbe10477adec527842f62d0dca"> 142</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classmingfx_1_1_vector3.html#a9b8e9ecbe10477adec527842f62d0dca">Normalize</a>();</div>
+<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; </div>
+<div class="line"><a name="l00146"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a3caef3c6f24b90730ef70c84ce0e0d71"> 146</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_vector3.html#a3caef3c6f24b90730ef70c84ce0e0d71">ToUnit</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; </div>
+<div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#aa7ddfd662e866c019a772ba66eae7331"> 149</a></span>&#160; <span class="keyword">const</span> <span class="keywordtype">float</span> * <a class="code" href="classmingfx_1_1_vector3.html#aa7ddfd662e866c019a772ba66eae7331">value_ptr</a>() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; </div>
+<div class="line"><a name="l00154"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a8dafc21c64a4964bac27519972d909b6"> 154</a></span>&#160; <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_vector3.html#a8dafc21c64a4964bac27519972d909b6">Lerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;b, <span class="keywordtype">float</span> alpha) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; </div>
+<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; </div>
+<div class="line"><a name="l00158"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a52bf8582baa71e7d6f80c412687d9714"> 158</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; <a class="code" href="classmingfx_1_1_vector3.html#a52bf8582baa71e7d6f80c412687d9714">Zero</a>();</div>
+<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; </div>
+<div class="line"><a name="l00161"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#af71b12760516a9cc4837ba9e1dee28db"> 161</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; <a class="code" href="classmingfx_1_1_vector3.html#af71b12760516a9cc4837ba9e1dee28db">One</a>();</div>
+<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; </div>
+<div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#ae8d822fdea67f63580b4e1f78f5b8922"> 164</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; <a class="code" href="classmingfx_1_1_vector3.html#ae8d822fdea67f63580b4e1f78f5b8922">UnitX</a>();</div>
+<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; </div>
+<div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a8d31e433d1ac04aaceea1b1dcd1643df"> 167</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; <a class="code" href="classmingfx_1_1_vector3.html#a8d31e433d1ac04aaceea1b1dcd1643df">UnitY</a>();</div>
+<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; </div>
+<div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a4b696b0d1143d6e30a34a2f889d2ca61"> 170</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; <a class="code" href="classmingfx_1_1_vector3.html#a4b696b0d1143d6e30a34a2f889d2ca61">UnitZ</a>();</div>
+<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; </div>
+<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; </div>
+<div class="line"><a name="l00182"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#aeff0177e2111139469b60733248fad8d"> 182</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_vector3.html#aeff0177e2111139469b60733248fad8d">Normalize</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v);</div>
+<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; </div>
+<div class="line"><a name="l00194"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a45d7d211135edd97ca21b047439db485"> 194</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_vector3.html#a45d7d211135edd97ca21b047439db485">Cross</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v2);</div>
+<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; </div>
+<div class="line"><a name="l00206"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a235fb20d4075960d2ce6198dc95ac507"> 206</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">float</span> <a class="code" href="classmingfx_1_1_vector3.html#a235fb20d4075960d2ce6198dc95ac507">Dot</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v2);</div>
+<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; </div>
+<div class="line"><a name="l00210"></a><span class="lineno"><a class="line" href="classmingfx_1_1_vector3.html#a489b042bedf8fa329ac05fe905ca1c6f"> 210</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="classmingfx_1_1_vector3.html#a489b042bedf8fa329ac05fe905ca1c6f">Lerp</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;a, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;b, <span class="keywordtype">float</span> alpha);</div>
+<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; </div>
+<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <span class="keywordtype">float</span> v[3];</div>
+<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;};</div>
+<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; </div>
+<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; </div>
+<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160;<span class="comment">// ---------- Operator Overloads for Working with Vectors ----------</span></div>
+<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; </div>
+<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; </div>
+<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;<span class="comment">// --- Scalers ---</span></div>
+<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; </div>
+<div class="line"><a name="l00223"></a><span class="lineno"><a class="line" href="namespacemingfx.html#aa19b1dea0b7aa468950e56044fda328a"> 223</a></span>&#160;<a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed">operator/</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v, <span class="keyword">const</span> <span class="keywordtype">float</span> s);</div>
+<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; </div>
+<div class="line"><a name="l00226"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a7e3941689c65388690916d00e0d423d4"> 226</a></span>&#160;<a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <span class="keywordtype">float</span> s, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v);</div>
+<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; </div>
+<div class="line"><a name="l00229"></a><span class="lineno"><a class="line" href="namespacemingfx.html#aa8a18cb8506dee589eaf6883a32e6fb5"> 229</a></span>&#160;<a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">operator*</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v, <span class="keyword">const</span> <span class="keywordtype">float</span> s);</div>
+<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; </div>
+<div class="line"><a name="l00232"></a><span class="lineno"><a class="line" href="namespacemingfx.html#afd07add6169773bae12d40201f8af7db"> 232</a></span>&#160;<a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">operator-</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v);</div>
+<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; </div>
+<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160;<span class="comment">// Note: no -(point) operator, that&#39;s an undefined operation</span></div>
+<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; </div>
+<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; </div>
+<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160;<span class="comment">// --- Point and Vector Arithmetic ---</span></div>
+<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; </div>
+<div class="line"><a name="l00240"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a4b4428d2cf65ba5226ef4036352d311e"> 240</a></span>&#160;<a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">operator+</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; p);</div>
+<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; </div>
+<div class="line"><a name="l00243"></a><span class="lineno"><a class="line" href="namespacemingfx.html#aadea317107a50ec6847ce01927b61c82"> 243</a></span>&#160;<a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">operator+</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; p, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v);</div>
+<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; </div>
+<div class="line"><a name="l00246"></a><span class="lineno"><a class="line" href="namespacemingfx.html#aeeeb04b70f8e8becbcda7a3dc7024c1b"> 246</a></span>&#160;<a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">operator+</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v2);</div>
+<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; </div>
+<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;<span class="comment">// Note: no (point + point) operator, that&#39;s an undefined operation</span></div>
+<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; </div>
+<div class="line"><a name="l00251"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a579b90d99a1d6f794ca44017ded3a8db"> 251</a></span>&#160;<a class="code" href="classmingfx_1_1_point3.html">Point3</a> <a class="code" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">operator-</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; p, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v);</div>
+<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; </div>
+<div class="line"><a name="l00254"></a><span class="lineno"><a class="line" href="namespacemingfx.html#aecdf7f36c4feb04034f1d07c49d5c0e3"> 254</a></span>&#160;<a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">operator-</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a>&amp; v2);</div>
+<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; </div>
+<div class="line"><a name="l00257"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a77d92da8f1a866306518422cd9d2f0af"> 257</a></span>&#160;<a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> <a class="code" href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">operator-</a>(<span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; p1, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_point3.html">Point3</a>&amp; p2);</div>
+<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; </div>
+<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160;<span class="comment">// Note: no (vector - point) operator, that&#39;s an undefined operation</span></div>
+<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; </div>
+<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; </div>
+<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; </div>
+<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; </div>
+<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160;<span class="comment">// --- Stream operators ---</span></div>
+<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; </div>
+<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;<span class="comment">// Vector3</span></div>
+<div class="line"><a name="l00267"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a3425c24faf923364cd3a764d50601c52"> 267</a></span>&#160;std::ostream &amp; <a class="code" href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">operator&lt;&lt; </a>( std::ostream &amp;os, <span class="keyword">const</span> <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v);</div>
+<div class="line"><a name="l00268"></a><span class="lineno"><a class="line" href="namespacemingfx.html#a8cc2f52569661416cb2ca67c516b7c93"> 268</a></span>&#160;std::istream &amp; <a class="code" href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">operator&gt;&gt; </a>( std::istream &amp;is, <a class="code" href="classmingfx_1_1_vector3.html">Vector3</a> &amp;v);</div>
+<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; </div>
+<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; </div>
+<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;} <span class="comment">// end namespace</span></div>
+<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; </div>
+<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="ttc" id="aclassmingfx_1_1_point3_html"><div class="ttname"><a href="classmingfx_1_1_point3.html">mingfx::Point3</a></div><div class="ttdoc">A 3D Point with floating point coordinates, used for storing vertices and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="point3_8h_source.html#l00052">point3.h:52</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html"><div class="ttname"><a href="classmingfx_1_1_vector3.html">mingfx::Vector3</a></div><div class="ttdoc">A 3D Vector with floating point coordinates, used for storing normals and all sorts of other 3D graph...</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00062">vector3.h:62</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a235fb20d4075960d2ce6198dc95ac507"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a235fb20d4075960d2ce6198dc95ac507">mingfx::Vector3::Dot</a></div><div class="ttdeci">static float Dot(const Vector3 &amp;v1, const Vector3 &amp;v2)</div><div class="ttdoc">Returns v1 dot v2.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a2556298f536ba115019982222ce6e0c5"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a2556298f536ba115019982222ce6e0c5">mingfx::Vector3::w</a></div><div class="ttdeci">float w() const</div><div class="ttdoc">In homogeneous coordinates, the w coordinate for all vectors is 0.0.</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00115">vector3.h:115</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a256018f34e230d542027d07d14fd6e65"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a256018f34e230d542027d07d14fd6e65">mingfx::Vector3::Vector3</a></div><div class="ttdeci">Vector3(float x, float y, float z)</div><div class="ttdoc">Constructs a vector (x,y,z,0), where the 0 comes from the use of homogeneous coordinates in computer ...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a31692a459a8056fe220d115eb5addc88"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a31692a459a8056fe220d115eb5addc88">mingfx::Vector3::Dot</a></div><div class="ttdeci">float Dot(const Vector3 &amp;v) const</div><div class="ttdoc">Returns &quot;this dot v&quot;, for example:</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a38cd4deed7d342464619b34b0ef95bec"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a38cd4deed7d342464619b34b0ef95bec">mingfx::Vector3::Cross</a></div><div class="ttdeci">Vector3 Cross(const Vector3 &amp;v) const</div><div class="ttdoc">Returns &quot;this cross v&quot;, for example:</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a3caef3c6f24b90730ef70c84ce0e0d71"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a3caef3c6f24b90730ef70c84ce0e0d71">mingfx::Vector3::ToUnit</a></div><div class="ttdeci">Vector3 ToUnit() const</div><div class="ttdoc">Returns a normalized (i.e., unit length) version of the vector without modifying the original 'this' ...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a45d7d211135edd97ca21b047439db485"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a45d7d211135edd97ca21b047439db485">mingfx::Vector3::Cross</a></div><div class="ttdeci">static Vector3 Cross(const Vector3 &amp;v1, const Vector3 &amp;v2)</div><div class="ttdoc">Returns v1 cross v2.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a489b042bedf8fa329ac05fe905ca1c6f"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a489b042bedf8fa329ac05fe905ca1c6f">mingfx::Vector3::Lerp</a></div><div class="ttdeci">static Vector3 Lerp(const Vector3 &amp;a, const Vector3 &amp;b, float alpha)</div><div class="ttdoc">Linear interpolation between two vectors. Alpha=0.0 returns 'a' and alpha=1.0 returns 'b',...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a4b696b0d1143d6e30a34a2f889d2ca61"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a4b696b0d1143d6e30a34a2f889d2ca61">mingfx::Vector3::UnitZ</a></div><div class="ttdeci">static const Vector3 &amp; UnitZ()</div><div class="ttdoc">(0,0,1) - a shortcut for a special vector that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a52bf8582baa71e7d6f80c412687d9714"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a52bf8582baa71e7d6f80c412687d9714">mingfx::Vector3::Zero</a></div><div class="ttdeci">static const Vector3 &amp; Zero()</div><div class="ttdoc">(0,0,0) - a shortcut for a special vector that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a6e0d09d774615bcfde5645c22a645969"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a6e0d09d774615bcfde5645c22a645969">mingfx::Vector3::~Vector3</a></div><div class="ttdeci">virtual ~Vector3()</div><div class="ttdoc">Vector destructor.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a7633dc1625b1f2e6b381438e896b45a3"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a7633dc1625b1f2e6b381438e896b45a3">mingfx::Vector3::Length</a></div><div class="ttdeci">float Length() const</div><div class="ttdoc">Returns the length of the vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a78d1dba881575517f0427d55cc418df6"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a78d1dba881575517f0427d55cc418df6">mingfx::Vector3::z</a></div><div class="ttdeci">float z() const</div><div class="ttdoc">Read only access to the z coordinate. Can also use my_vector[2]. Use the my_vector[2] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00112">vector3.h:112</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a7f57af8bbecbc793fa17def4521de4dd"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a7f57af8bbecbc793fa17def4521de4dd">mingfx::Vector3::Vector3</a></div><div class="ttdeci">Vector3()</div><div class="ttdoc">Default constructor to create zero vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a85486d0a355417fe4b41fa64146c9e98"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a85486d0a355417fe4b41fa64146c9e98">mingfx::Vector3::operator==</a></div><div class="ttdeci">bool operator==(const Vector3 &amp;v) const</div><div class="ttdoc">Check for &quot;equality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a8d31e433d1ac04aaceea1b1dcd1643df"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a8d31e433d1ac04aaceea1b1dcd1643df">mingfx::Vector3::UnitY</a></div><div class="ttdeci">static const Vector3 &amp; UnitY()</div><div class="ttdoc">(0,1,0) - a shortcut for a special vector that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a8dafc21c64a4964bac27519972d909b6"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a8dafc21c64a4964bac27519972d909b6">mingfx::Vector3::Lerp</a></div><div class="ttdeci">Vector3 Lerp(const Vector3 &amp;b, float alpha) const</div><div class="ttdoc">Linear interpolation between this vector and another. Alpha=0.0 returns this vector,...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a95b274c7a5ff118af20bc71682c6b1f1"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a95b274c7a5ff118af20bc71682c6b1f1">mingfx::Vector3::Vector3</a></div><div class="ttdeci">Vector3(float *v)</div><div class="ttdoc">Constructs a vector given a pointer to x,y,z data.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_a9b8e9ecbe10477adec527842f62d0dca"><div class="ttname"><a href="classmingfx_1_1_vector3.html#a9b8e9ecbe10477adec527842f62d0dca">mingfx::Vector3::Normalize</a></div><div class="ttdeci">void Normalize()</div><div class="ttdoc">Normalizes the vector by making it unit length.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_aa37b1fc4b1df9f72726d981c08cd0d1b"><div class="ttname"><a href="classmingfx_1_1_vector3.html#aa37b1fc4b1df9f72726d981c08cd0d1b">mingfx::Vector3::operator[]</a></div><div class="ttdeci">float operator[](const int i) const</div><div class="ttdoc">Read only access to the ith coordinate of the vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_aa5b1c05c285fad7f2709f6f351a63608"><div class="ttname"><a href="classmingfx_1_1_vector3.html#aa5b1c05c285fad7f2709f6f351a63608">mingfx::Vector3::operator=</a></div><div class="ttdeci">Vector3 &amp; operator=(const Vector3 &amp;v)</div><div class="ttdoc">Vector assignment operator.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_aa7ddfd662e866c019a772ba66eae7331"><div class="ttname"><a href="classmingfx_1_1_vector3.html#aa7ddfd662e866c019a772ba66eae7331">mingfx::Vector3::value_ptr</a></div><div class="ttdeci">const float * value_ptr() const</div><div class="ttdoc">Returns a const pointer to the raw data array.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_ab93acb916c310920b9c011159eaaa016"><div class="ttname"><a href="classmingfx_1_1_vector3.html#ab93acb916c310920b9c011159eaaa016">mingfx::Vector3::operator!=</a></div><div class="ttdeci">bool operator!=(const Vector3 &amp;v) const</div><div class="ttdoc">Check for &quot;inequality&quot;, taking floating point imprecision into account.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_abcdda4627b24af879aba38d4fc0e6f71"><div class="ttname"><a href="classmingfx_1_1_vector3.html#abcdda4627b24af879aba38d4fc0e6f71">mingfx::Vector3::operator[]</a></div><div class="ttdeci">float &amp; operator[](const int i)</div><div class="ttdoc">Returns a reference to the ith coordinate of the vector. Use this accessor if you wish to set the coo...</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_ac380342bfa614c9a3babe1efd14d2cf4"><div class="ttname"><a href="classmingfx_1_1_vector3.html#ac380342bfa614c9a3babe1efd14d2cf4">mingfx::Vector3::x</a></div><div class="ttdeci">float x() const</div><div class="ttdoc">Read only access to the x coordinate. Can also use my_vector[0]. Use the my_vector[0] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00104">vector3.h:104</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_ae8d822fdea67f63580b4e1f78f5b8922"><div class="ttname"><a href="classmingfx_1_1_vector3.html#ae8d822fdea67f63580b4e1f78f5b8922">mingfx::Vector3::UnitX</a></div><div class="ttdeci">static const Vector3 &amp; UnitX()</div><div class="ttdoc">(1,0,0) - a shortcut for a special vector that is frequently needed</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_aeb74fbc0a970b40abb0db8f8e490ee17"><div class="ttname"><a href="classmingfx_1_1_vector3.html#aeb74fbc0a970b40abb0db8f8e490ee17">mingfx::Vector3::y</a></div><div class="ttdeci">float y() const</div><div class="ttdoc">Read only access to the y coordinate. Can also use my_vector[1]. Use the my_vector[1] = 1....</div><div class="ttdef"><b>Definition:</b> <a href="vector3_8h_source.html#l00108">vector3.h:108</a></div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_aeff0177e2111139469b60733248fad8d"><div class="ttname"><a href="classmingfx_1_1_vector3.html#aeff0177e2111139469b60733248fad8d">mingfx::Vector3::Normalize</a></div><div class="ttdeci">static Vector3 Normalize(const Vector3 &amp;v)</div><div class="ttdoc">Returns a new vector that is the unit version of v.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_af6100965af7770f833dbf0c9f30f4fdd"><div class="ttname"><a href="classmingfx_1_1_vector3.html#af6100965af7770f833dbf0c9f30f4fdd">mingfx::Vector3::Vector3</a></div><div class="ttdeci">Vector3(const Vector3 &amp;v)</div><div class="ttdoc">Copy constructor for vector.</div></div>
+<div class="ttc" id="aclassmingfx_1_1_vector3_html_af71b12760516a9cc4837ba9e1dee28db"><div class="ttname"><a href="classmingfx_1_1_vector3.html#af71b12760516a9cc4837ba9e1dee28db">mingfx::Vector3::One</a></div><div class="ttdeci">static const Vector3 &amp; One()</div><div class="ttdoc">(1,1,1) - a shortcut for a special vector that is frequently needed</div></div>
+<div class="ttc" id="anamespacemingfx_html"><div class="ttname"><a href="namespacemingfx.html">mingfx</a></div><div class="ttdoc">Namespace for the MinGfx Toolkit.</div><div class="ttdef"><b>Definition:</b> <a href="aabb_8h_source.html#l00021">aabb.h:21</a></div></div>
+<div class="ttc" id="anamespacemingfx_html_a2f5a225a54f07164d5172a3721a3aee6"><div class="ttname"><a href="namespacemingfx.html#a2f5a225a54f07164d5172a3721a3aee6">mingfx::operator-</a></div><div class="ttdeci">Quaternion operator-(const Quaternion &amp;q)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a3c3b45ed6edf3fe76f98a7fd165dca03"><div class="ttname"><a href="namespacemingfx.html#a3c3b45ed6edf3fe76f98a7fd165dca03">mingfx::operator+</a></div><div class="ttdeci">AABB operator+(const AABB &amp;A, const AABB &amp;B)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a444ae88d836b913ac8307fbf4357f7ed"><div class="ttname"><a href="namespacemingfx.html#a444ae88d836b913ac8307fbf4357f7ed">mingfx::operator/</a></div><div class="ttdeci">Quaternion operator/(const Quaternion &amp;q, const float s)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a6bc967741341f4f318a505d884192906"><div class="ttname"><a href="namespacemingfx.html#a6bc967741341f4f318a505d884192906">mingfx::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_a6eb31e6e81c6e29144799be4c9db404d"><div class="ttname"><a href="namespacemingfx.html#a6eb31e6e81c6e29144799be4c9db404d">mingfx::operator&gt;&gt;</a></div><div class="ttdeci">std::istream &amp; operator&gt;&gt;(std::istream &amp;is, Color &amp;c)</div></div>
+<div class="ttc" id="anamespacemingfx_html_ae5708e414f585dde2a5418ddae259a57"><div class="ttname"><a href="namespacemingfx.html#ae5708e414f585dde2a5418ddae259a57">mingfx::operator*</a></div><div class="ttdeci">Matrix4 operator*(const Matrix4 &amp;m, const float &amp;s)</div><div class="ttdoc">Multiply matrix and scalar, returns the new matrix.</div></div>
+<div class="ttc" id="apoint3_8h_html"><div class="ttname"><a href="point3_8h.html">point3.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.9.1-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/dev/MinGfx/docs/index.html b/dev/MinGfx/docs/index.html
new file mode 100644
index 0000000..7252082
--- /dev/null
+++ b/dev/MinGfx/docs/index.html
@@ -0,0 +1,2 @@
+<!-- redirect to load the index.html file generated by doxygen at html/index.html -->
+<meta http-equiv="REFRESH" content="0;URL=html/index.html">
diff --git a/dev/MinGfx/example/CMakeLists.txt b/dev/MinGfx/example/CMakeLists.txt
new file mode 100644
index 0000000..a9b27b7
--- /dev/null
+++ b/dev/MinGfx/example/CMakeLists.txt
@@ -0,0 +1,166 @@
+# Original Author(s) of this File:
+# Daniel Keefe, 2017, University of Minnesota
+#
+# Author(s) of Significant Updates/Modifications to the File:
+# ...
+
+
+
+# You are encouraged to copy this example, move it outside of the MinGfx directory, and use
+# it as a starting point for your project. When you do this, you'll have to edit the
+# following line as needed to point to the MinGfx install prefix used on your system.
+
+# !!!!!!!!!!!!! EDIT THE FOLLOWING LINE AS NEEDED !!!!!!!!!!!!!
+list(APPEND CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../build/install ../../..)
+
+# For example, you might have installed to a build tree that now looks like this:
+# /Users/keefe/courses/cs4611/sw/include/MinGfx-1.0/
+# /Users/keefe/courses/cs4611/sw/include/Eigen
+# /Users/keefe/courses/cs4611/sw/include/nanogui
+# /Users/keefe/courses/cs4611/sw/include/ etc..
+
+# /Users/keefe/courses/cs4611/sw/lib/MinGfx-1.0/libMinGfx.a
+# /Users/keefe/courses/cs4611/sw/lib/libnanogui.so
+# /Users/keefe/courses/cs4611/sw/lib/ etc..
+
+# If so, you would set the prefix path as follows:
+#list(APPEND CMAKE_PREFIX_PATH /Users/keefe/courses/cs4611/sw)
+
+
+
+
+
+#### BASIC PROJECT SETUP ####
+
+project(mingfx-example)
+
+# Using 3.9 to get a modern version of FindOpenGL.cmake
+cmake_minimum_required (VERSION 3.9)
+
+# Dependencies that are auto-downloaded, built, and installed for you will go in the
+# directory pointed to by the CMAKE_INSTALL_PREFIX. It defaults to a location inside
+# the build directory.
+if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR "${CMAKE_INSTALL_PREFIX}" STREQUAL "")
+ set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "default install path" FORCE )
+endif()
+
+# Add to paths cmake uses to search for scripts, modules, and config packages
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_INSTALL_PREFIX})
+list(INSERT CMAKE_PREFIX_PATH 0 ${CMAKE_INSTALL_PREFIX})
+
+include(MessageMacros)
+h1("Building ${PROJECT_NAME}")
+h2("Configuring paths")
+
+message(STATUS "Module path: ${CMAKE_MODULE_PATH}")
+message(STATUS "Prefix path: ${CMAKE_PREFIX_PATH}")
+message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}")
+
+
+
+#### SOURCE FOR THIS PROJECT ####
+h2("Configuring source files")
+
+set(SOURCEFILES
+ main-circleviewer.cpp
+ CircleViewer.cpp
+)
+
+set(HEADERFILES
+ CircleViewer.h
+)
+
+set(EXTRAFILES
+# README.md
+)
+
+set_source_files_properties(${EXTRAFILES} PROPERTIES HEADER_FILE_ONLY TRUE)
+
+
+
+#### COMPILE OPTIONS ####
+
+h2("Configuring Compiler Options")
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
+
+
+message(STATUS "Building for " ${CMAKE_SYSTEM_NAME} ".")
+
+# Linux specific
+if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+ add_definitions(-DLINUX)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
+endif()
+
+
+# Apple specific
+if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+ add_definitions(-DOSX)
+
+ # RPATH settings, see https://cmake.org/Wiki/CMake_RPATH_handling
+ set(CMAKE_MACOSX_RPATH ON)
+
+ # use, i.e. don't skip the full RPATH for the build tree
+ SET(CMAKE_SKIP_BUILD_RPATH FALSE)
+
+ # when building, don't use the install RPATH already
+ # (but later on when installing)
+ SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+
+ SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+
+ # add the automatically determined parts of the RPATH
+ # which point to directories outside the build tree to the install RPATH
+ SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+
+ # the RPATH to be used when installing, but only if it's not a system directory
+ LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
+ IF("${isSystemDir}" STREQUAL "-1")
+ SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+ ENDIF("${isSystemDir}" STREQUAL "-1")
+
+endif()
+
+
+# Windows specific
+if (WIN32)
+ add_definitions(-DWIN32)
+endif()
+
+
+
+
+#### DEFINE TARGET(S) ####
+
+h2("Defining Target(s)")
+
+add_executable(${PROJECT_NAME} ${SOURCEFILES} ${HEADERFILES} ${EXTRAFILES})
+
+
+
+#### FIND AND ADD DEPENDENCIES ####
+
+h2("Adding Dependencies")
+set(EXTERNAL_DIR external)
+
+
+# MinGfx (linked with an imported cmake target so no need to specify include dirs)
+# This will try to find MinGfxConfig.cmake, which should have been installed under
+# CMAKE_INSTALL_PREFIX/lib/cmake/MinGfx when you installed the MinGfx Toolkit.
+find_package(MinGfx REQUIRED)
+target_link_libraries(${PROJECT_NAME} PUBLIC MinGfx::MinGfx)
+
+# Add external dependency on OpenGL
+include(AutoBuildOpenGL)
+AutoBuild_use_package_OpenGL(${PROJECT_NAME} PUBLIC)
+
+
+
+#### INSTALL TARGET(S) ####
+
+h2("Configuring Install Target")
+
+# The install locations are relative to the CMAKE_INSTALL_PREFIX variable
+install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
+
diff --git a/dev/MinGfx/example/CircleViewer.cpp b/dev/MinGfx/example/CircleViewer.cpp
new file mode 100644
index 0000000..9bf50b9
--- /dev/null
+++ b/dev/MinGfx/example/CircleViewer.cpp
@@ -0,0 +1,122 @@
+
+#include "CircleViewer.h"
+
+#include <nanogui/nanogui.h>
+#include <iostream>
+
+
+CircleViewer::CircleViewer() : GraphicsApp(1024,768, "Circle Simulation") {
+ simTime_ = 0.0;
+ paused_ = false;
+
+ //InitGraphicsContext();
+}
+
+
+CircleViewer::~CircleViewer() {
+
+}
+
+void CircleViewer::InitNanoGUI() {
+ nanogui::FormHelper *gui = new nanogui::FormHelper(screen());
+ nanogui::ref<nanogui::Window> window = gui->addWindow(Eigen::Vector2i(10, 10), "Simulation Controls");
+ pauseBtn_ = gui->addButton("Pause", std::bind(&CircleViewer::OnPauseBtnPressed, this));
+ gui->addButton("Restart", std::bind(&CircleViewer::OnRestartBtnPressed, this));
+
+ screen()->performLayout();
+}
+
+void CircleViewer::UpdateSimulation(double dt) {
+ if (!paused_) {
+ simTime_ += dt;
+ std::cout << "Update Simulation " << simTime_ << std::endl;
+ }
+}
+
+
+void CircleViewer::OnRestartBtnPressed() {
+ simTime_ = 0.0;
+}
+
+void CircleViewer::OnPauseBtnPressed() {
+ paused_ = !paused_;
+ if (paused_) {
+ pauseBtn_->setCaption("Play");
+ }
+ else {
+ pauseBtn_->setCaption("Pause");
+ }
+}
+
+
+void CircleViewer::OnMouseMove(const Point2 &pos, const Vector2 &delta) {
+ std::cout << "Mouse moved by " << delta << " to reach " << pos << std::endl;
+}
+
+
+void CircleViewer::OnLeftMouseDown(const Point2 &pos) {
+ std::cout << "Left mouse button DOWN at " << pos << std::endl;
+}
+
+void CircleViewer::OnLeftMouseDrag(const Point2 &pos, const Vector2 &delta) {
+ std::cout << "Mouse dragged (left button) by " << delta << " to reach " << pos << std::endl;
+}
+
+void CircleViewer::OnLeftMouseUp(const Point2 &pos) {
+ std::cout << "Left mouse button UP at " << pos << std::endl;
+}
+
+
+void CircleViewer::OnRightMouseDown(const Point2 &pos) {
+ std::cout << "Right mouse button DOWN at " << pos << std::endl;
+}
+
+void CircleViewer::OnRightMouseDrag(const Point2 &pos, const Vector2 &delta) {
+ std::cout << "Mouse dragged (right button) by " << delta << " to reach " << pos << std::endl;
+}
+
+void CircleViewer::OnRightMouseUp(const Point2 &pos) {
+ std::cout << "Right mouse button UP at " << pos << std::endl;
+}
+
+
+void CircleViewer::OnKeyDown(const char *c, int modifiers) {
+ std::cout << "Key DOWN (" << c << ") modifiers=" << modifiers << std::endl;
+}
+
+void CircleViewer::OnKeyUp(const char *c, int modifiers) {
+ std::cout << "Key UP (" << c << ") modifiers=" << modifiers << std::endl;
+}
+
+
+void CircleViewer::OnSpecialKeyDown(int key, int scancode, int modifiers) {
+ std::cout << "Special Key DOWN key=" << key << " scancode=" << scancode << " modifiers=" << modifiers << std::endl;
+}
+
+void CircleViewer::OnSpecialKeyUp(int key, int scancode, int modifiers) {
+ std::cout << "Special Key UP key=" << key << " scancode=" << scancode << " modifiers=" << modifiers << std::endl;
+}
+
+
+void CircleViewer::DrawUsingNanoVG(NVGcontext *ctx) {
+ // example of drawing some circles
+
+ nvgBeginPath(ctx);
+ nvgCircle(ctx, 512+50.0*cos(simTime_), 350+200.0*sin(simTime_), 50);
+ nvgFillColor(ctx, nvgRGBA(100,100,255,200));
+ nvgFill(ctx);
+ nvgStrokeColor(ctx, nvgRGBA(0,0,0,255));
+ nvgStroke(ctx);
+
+ nvgBeginPath(ctx);
+ nvgCircle(ctx, 512+200.0*cos(simTime_), 350+50.0*sin(simTime_), 50);
+ nvgFillColor(ctx, nvgRGBA(255,100,100,200));
+ nvgFill(ctx);
+ nvgStrokeColor(ctx, nvgRGBA(0,0,0,255));
+ nvgStroke(ctx);
+}
+
+void CircleViewer::DrawUsingOpenGL() {
+
+}
+
diff --git a/dev/MinGfx/example/CircleViewer.h b/dev/MinGfx/example/CircleViewer.h
new file mode 100644
index 0000000..4aefbc8
--- /dev/null
+++ b/dev/MinGfx/example/CircleViewer.h
@@ -0,0 +1,77 @@
+
+#include <mingfx.h>
+
+
+/** An application that opens up a window that includes a few buttons
+ for controlling the simulation and can be used to draw circles and
+ other computer graphics.
+
+ After constructing a new CircleViewer, call Run() to start and
+ run the application. Run() will not return until the application
+ window is closed. Make sure that you call cs3081::InitGraphics()
+ before creating the RobotViewer app. Example:
+
+ ```
+ int main(int argc, char **argv) {
+ cs3081::InitGraphics();
+ cs3081::CircleViewer *app = new cs3081::CircleViewer();
+ app->Run();
+ cs3081::ShutdownGraphics();
+ return 0;
+ }
+ ```
+
+ While the window is open UpdateSimulation() will be called
+ repeatedly, once per frame. Fill this in to update your simulation
+ or perform any other processing that should happen over time as the
+ simulation progresses.
+
+ Fill in the On*() methods as desired to respond to user input events.
+
+ Fill in the Draw*() methods to draw graphics to the screen using
+ either the nanovg library or raw OpenGL.
+*/
+class CircleViewer : public GraphicsApp {
+public:
+ CircleViewer();
+ ~CircleViewer();
+
+ void InitNanoGUI();
+
+ void UpdateSimulation(double dt);
+
+
+ void OnRestartBtnPressed();
+
+ void OnPauseBtnPressed();
+
+
+ void OnMouseMove(const Point2 &pos, const Vector2 &delta);
+
+ void OnLeftMouseDown(const Point2 &pos);
+ void OnLeftMouseDrag(const Point2 &pos, const Vector2 &delta);
+ void OnLeftMouseUp(const Point2 &pos);
+
+ void OnRightMouseDown(const Point2 &pos);
+ void OnRightMouseDrag(const Point2 &pos, const Vector2 &delta);
+ void OnRightMouseUp(const Point2 &pos);
+
+
+ void OnKeyDown(const char *c, int modifiers);
+
+ void OnKeyUp(const char *c, int modifiers);
+
+ void OnSpecialKeyDown(int key, int scancode, int modifiers);
+
+ void OnSpecialKeyUp(int key, int scancode, int modifiers);
+
+
+ void DrawUsingNanoVG(NVGcontext *ctx);
+
+ void DrawUsingOpenGL();
+
+private:
+ double simTime_;
+ bool paused_;
+ nanogui::Button *pauseBtn_;
+};
diff --git a/dev/MinGfx/example/cmake/AutoBuild.cmake b/dev/MinGfx/example/cmake/AutoBuild.cmake
new file mode 100644
index 0000000..2e349b9
--- /dev/null
+++ b/dev/MinGfx/example/cmake/AutoBuild.cmake
@@ -0,0 +1,541 @@
+# Author: Daniel F. Keefe
+# Copyright 2017,2018, Daniel F. Keefe and Regents of the University of Minnesota
+# All Rights Reserved.
+
+
+# OVERVIEW / INTENT: AutoBuild is a series of CMake macros and functions for working with sub-projects that are dependencies of a main project. We assume that both the main project and dependencies each build with CMake already. AutoBuild manages the process of checking to see if the dependencies are already available, installed on the system. If not, AutoBuild will automatically download, build, and install the dependencies for you as part of the CMake Configure process.
+
+# WHY IS THIS NEEDED / USEFUL?: AutoBuild is similar in spirit to CMake's ExternalProject_add() command. In fact, AutoBuild uses that command internally. However, there is a key difference between AutoBuild and ExternalProject_add(). With ExternalProject_add() there is a chicken-and-the-egg problem. ExternalProject_add() doesn't download and build the external project until after CMake has finished running and you are building your actual code using Unix Makefiles, Visual Studio, or Xcode. This means the dependency does not exist on disk until CMake has finished running, and, thus, there is no way to use CMake's find_package() routines to find the dependency. You can still make your project link with the dependency, but you have to hardcode paths to tell CMake where it will exist after it is built rather than find it already installed on the system. If you want to only build the dependency if it is not already found on the system, then this means you need to maintain two ways of linking with the dependency in your CMakeLists.txt, using one approach when the dependency is found already installed and using another approach (hardcoded paths with ExternalProject_add()) when it is not found. The hardcoded paths can get a bit complex when working with cross-platform code, and this is precisely what CMake's find_package() is supposed to handle, so it is a bit annoying that it cannot be used in this case.
+
+# HOW IT WORKS: AutoBuild takes a different approach where the goal is for our project's CMakeLists.txt file to always use the same approach to link with a dependency. If the dependency is found on the system, then we go ahead and link with it right away. If it is not found, then rather than scheduling it to be built as part of the build process for our own project, we "pause" our build for a moment to download, build, and install the dependency. Then, once the dependency has been installed, we try again to find it using find_package(), which should always succeed since we just did the install, and continue on building our program.
+
+# LIMITATIONS: Handling dependencies is a hard problem, and this "AutoBuild" strategy is not without its own limitations. For example, a complication arises when using the CMake GUI. When using the CMake GUI, users expect to be able to set the CMAKE_INSTALL_PREFIX interactively after pressing Configure once to bring up all the available options. So, there is a problem if we build and install dependency projects during this first run of CMake Configure -- the user will not yet have had a chance to set CMAKE_INSTALL_PREFIX before the dependency projects are installed, and they may be installed to an undesirable location. AutoBuild addresses this by running a status check at the end of the CMake Configure step. The first time the status check detects that a dependency project should be "auto-built", it prints an informative error message, reminding the user to set CMAKE_INSTALL_PREFIX and then re-run CMake Configure to actually do the download, build, and install steps for each dependency. This seems to be a good match for CMake's GUI mode because it also allows the user to check other related settings (e.g., turning off autobuild for specific projects, forcing autobuild even if the dependency is found on the system, setting the directory to use for downloading projects).
+
+# RUNNING FROM A SCRIPT: When running from the command line or a script, the error-the-first-time-an-autobuild-is-scheduled behavior described above is typically not desired. In this case, users should already be setting CMAKE_INSTALL_PREFIX and any other desired CMake flags on the command line so it is fine to run the autobuilds immediately. To do this, simply run cmake with the following command line argument: -DAUTOBUILD_EXECUTE_NOW=ON
+
+
+# USAGE: WHAT TO ADD TO YOUR CMAKELISTS.TXT FILE TO USE AUTOBUILD:
+
+# Edit 1: Add two calls to your main CMakeLists.txt:
+
+# 1a. Near the top of the file include AutoBuild and call init, like so:
+# include(AutoBuild)
+# AutoBuild_init()
+
+# 1b. At the end of the file call:
+# AutoBuild_check_status()
+
+
+# Edit 2: For each target you wish to link with an external dependency, add a use_package() call right after you
+# define the target with add_library() or add_executable. If the dependency you wish to link with uses
+# modern CMake Config Packages, then the generic AutoBuild_use_package() call is all that is needed.
+# For example, to link my-program with the MinVR library, add the following to the CMakeLists.txt file
+# where you define the my-program target with add_executable:
+
+# add_execuatable(my-program ${SOURCEFILES})
+# AutoBuild_use_package(MinVR . my-program PUBLIC MinVR::MinVR
+# DOWNLOAD_ARGS GIT_REPOSITORY https://github.com/MinVR/MinVR.git GIT_TAG beta
+# )
+
+# Since CMake Config Packages are relatively new and very complex, so not every package provides one
+# (or a correct one). In these cases, the generic AutoBuild_use_package() will not work, and we have
+# to write a version of that is specific to the project we wish to add as a dependency. For example,
+# in order to link with GLFW, which does not provide a ConfigGLFW.cmake file, we must write a
+# GLFW-specific version of AutoBuild_use_package() and then use it like so:
+
+# include(AutoBuildGLFW)
+# AutoBuild_use_package_GLFW(my-program PUBLIC)
+
+# GLFW is one of the first examples in this style, so it is included in the AutoBuild repo. If the
+# repo does not already include an AutoBuild<package-name>.cmake script, then copy an existing
+# example, modify it to work for the package of interest, and once it is working, push it back to
+# the AutoBuild repo so others can benefit as well.
+
+
+
+
+
+
+
+# Usage:
+# AutoBuild_init()
+# Call this one time in your main CMakeLists.txt script somewhere near the beginning of the file.
+macro(AutoBuild_init)
+ message(STATUS "AutoBuild: Initializing.")
+
+ option(AUTOBUILD_DEPENDENCIES "This is a global option that turns on/off the AutoBuild functionality. It is also possible to turn on/off autobuilding for specific packages via variables of the form AUTOBUILD_PACKAGE_<NAME>." ON)
+
+ set(AUTOBUILD_DOWNLOAD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external" CACHE STRING "Location for external project sources downloaded by AutoBuild." )
+endmacro()
+
+
+
+
+
+
+# Usage:
+# AutoBuild_check_status()
+# Call this one time in your main CMakeLists.txt script somewhere near the end of the file.
+macro(AutoBuild_check_status)
+ message(STATUS "AutoBuild: Checking status...")
+
+ # Report status to the user, and if we detected dependencies to autobuild, stop with a
+ # cmake error to give the user a chance to adjust config options, such as the
+ # CMAKE_INSTALL_PREFIX and overriding AUTOBUILD_<PROJNAME> on a case-by-case basis if
+ # needed. Assuming all looks good, we will then download, build, and install each
+ # dependency that we need the next time CMake Configure is run.
+
+ set(PREFIX "AUTOBUILD_PACKAGE_")
+ get_cmake_property(ALLVARS VARIABLES)
+ string(REGEX MATCHALL "(^|;)${PREFIX}[A-Za-z0-9_]*" MATCHED_VARS "${ALLVARS}")
+
+ if (NOT "${MATCHED_VARS}" STREQUAL "")
+ message(STATUS "AutoBuild: Status check for each dependency linked using AutoBuild:")
+
+ set(RERUN_CONFIGURE "FALSE")
+
+ foreach (VARIABLE ${MATCHED_VARS})
+ #message(STATUS "${VARIABLE}=${${VARIABLE}}")
+
+ string(REPLACE ${PREFIX} "" PACKAGE_NAME ${VARIABLE})
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+ if ("${${PACKAGE_NAME}_AUTOBUILT}")
+ set(STATUS_STR "Now installed to CMAKE_INSTALL_PREFIX (${CMAKE_INSTALL_PREFIX}).")
+ elseif("${${VARIABLE}}")
+ set(STATUS_STR "Set to auto-build next time you run CMake Configure.")
+ set(RERUN_CONFIGURE "TRUE")
+ else()
+ set(STATUS_STR "Autobuild off (either found on the system or manually turned off).")
+ endif()
+
+ message(STATUS "AutoBuild: Dependency = ${PACKAGE_NAME}; Status = ${STATUS_STR}")
+
+ endforeach()
+
+ # Error out if any packages are set to autobuild but have not yet been built
+ if ("${RERUN_CONFIGURE}")
+
+ # This flag confirms that the user has had a chance to see any new AutoBuild config
+ # options and we can now proceed on the next run of CMake Configure to do the auto
+ # download, build, and install steps.
+ set(AUTOBUILD_EXECUTE_NOW "ON" CACHE BOOL "If on, the AutoBuild download, build, install steps will run the next time CMake Configure is run.")
+ mark_as_advanced(AUTOBUILD_EXECUTE_NOW)
+
+ message(SEND_ERROR "AutoBuild: One or more packages are setup to be downloaded, built, and installed with AutoBuild the next time you run CMake Configure. Check now to make sure that your CMAKE_INSTALL_PREFIX points to the place where you want these dependencies installed. Also, check variables of the form AUTOBUILD_PACKAGE_* to make sure the packages you want to build are ON and the ones you do not are OFF. When all looks good, run Configure again to perform the download, build, and install steps. This message will be shown only once -- the first time your project schedules a dependency to be autobuilt.")
+
+ endif()
+ endif()
+
+ message(STATUS "AutoBuild: Completed status check.")
+endmacro()
+
+
+
+
+
+
+
+# Usage:
+# AutoBuild_use_package(
+# # This 1st argument is required, it is the name of the project/package you wish to use. The project should
+# # provide a <package-name>Config.cmake file for CMake to find.
+# MinVR
+#
+# # The 2nd argument is required and it is the relative path from the root of the external project's source
+# # tree to a CMakeLists.txt file that can be used to build the project.
+# .
+#
+# # The 3rd argument is required. It is the name of the target you wish to link this dependency to.
+# my-program
+#
+# # The 4th argument is required. It impacts how dependencies are propogated through CMake. You can treat
+# # this dependency as an INTERFACE, PUBLIC, or PRIVATE. See the following URL for details:
+# # https://cmake.org/cmake/help/latest/command/target_include_directories.html
+# PUBLIC
+#
+# # The 5th argument is required. It is the name of the imported target(s) provided in the projects CMake
+# # Config Package. By convention, these typically start with the project name and then ::, like a namespace.
+# MinVR::MinVR
+#
+# # The remaining arguments are optional and are used to provide more specific instructions on the find_package,
+# # download, build, and install steps. List additional flags for these steps after the keywords:
+# # FIND_PACKAGE_ARGS, DOWNLOAD_ARGS, and/or BUILD_AND_INSTALL_ARGS. For example:
+#
+# DOWNLOAD_ARGS GIT_REPOSITORY https://github.com/MinVR/MinVR.git GIT_TAG beta
+# )
+#
+macro(AutoBuild_use_package PACKAGE_NAME RELPATH_TO_CMAKELISTS YOUR_TARGET INTERFACE_PUBLIC_OR_PRIVATE IMPORTED_TARGETS)
+
+ set(OPTIONS)
+ set(ONE_VALUE_ARGS)
+ set(MULTI_VALUE_ARGS FIND_PACKAGE_ARGS DOWNLOAD_ARGS BUILD_AND_INSTALL_ARGS)
+ cmake_parse_arguments(EXTRA "${OPTIONS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN})
+
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+ AutoBuild_find_package_config_mode(${PACKAGE_NAME} ${EXTRA_FIND_PACKAGE_ARGS})
+
+ if ("${AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER}}")
+ if ("${AUTOBUILD_EXECUTE_NOW}")
+ message(STATUS "AutoBuild: Starting download, build, install sequence for ${PACKAGE_NAME}.")
+
+ AutoBuild_download_project(${PACKAGE_NAME} ${EXTRA_DOWNLOAD_ARGS})
+
+ AutoBuild_build_and_install_project(${PACKAGE_NAME} ${RELPATH_TO_CMAKELISTS} ${EXTRA_BUILD_AND_INSTALL_ARGS})
+
+ AutoBuild_find_built_package_config_mode(${PACKAGE_NAME} CONFIG ${EXTRA_FIND_PACKAGE_ARGS})
+
+ set(${PACKAGE_NAME_UPPER}_AUTOBUILT "TRUE" CACHE BOOL "Confirms that package ${PACKAGE_NAME} was successfully built by the AutoBuild system.")
+ mark_as_advanced(${PACKAGE_NAME}_AUTOBUILT)
+
+ else()
+ message(STATUS "AutoBuild: Scheduled to build ${PACKAGE_NAME} the next time CMake Configure is run.")
+ endif()
+ endif()
+
+
+ # If we've found the package, either directly on the system or after autobuilding, then link with it
+ if ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}")
+ message(STATUS "Linking target ${YOUR_TARGET} with ${INTERFACE_PUBLIC_OR_PRIVATE} dependency ${PACKAGE_NAME}.")
+
+ target_link_libraries(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} ${IMPORTED_TARGETS})
+
+ target_compile_definitions(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} -DUSE_${PACKAGE_NAME_UPPER})
+ endif()
+
+endmacro()
+
+
+
+
+
+
+
+
+
+
+
+# ------ Implementation Details Below this Line -- External Users Should Not Need To Call Anything Below -------
+
+
+macro(AutoBuild_find_package_config_mode PACKAGE_NAME)
+ # Users can pass in extra arguments to the find_package command if needed.
+ set(EXTRA_MACRO_ARGS ${ARGN})
+
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+
+ # Force CMake to find the package again -- need for the case where the package exists on the system
+ # but we want to force building and installing it. after the install, we need to clear these flags
+ # so that find_package will find the newlyl installed version.
+ unset(${PACKAGE_NAME}_DIR CACHE)
+ unset(${PACKAGE_NAME_UPPER}_DIR CACHE)
+ unset(${PACKAGE_NAME}_FOUND CACHE)
+ unset(${PACKAGE_NAME_UPPER}_FOUND CACHE)
+
+ message(STATUS "AutoBuild: Searching for package ${PACKAGE_NAME} using cmake's find_package() config mode...")
+
+ if (NOT AUTOBUILD_DEPENDENCIES)
+
+ message(STATUS "AutoBuild: AUTOBUILD_DEPENDENCIES is OFF, using default CMake find_package() behavior.")
+ find_package(${PACKAGE_NAME} CONFIG ${EXTRA_MACRO_ARGS})
+
+ else()
+
+ # Try first to find the package within the current CMAKE_INSTALL_PREFIX. In the case when multiple
+ # versions of a library are installed on the same system, this makes sure that we will find a version
+ # that was previously built using AutoBuild first.
+ find_package(${PACKAGE_NAME} CONFIG PATHS ${CMAKE_INSTALL_PREFIX} NO_DEFAULT_PATH ${EXTRA_MACRO_ARGS})
+
+ # Try again with the normal version of find_package(), which will search a variety of places on
+ # the system, see details here: https://cmake.org/cmake/help/latest/command/find_package.html
+ if (NOT ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}"))
+ find_package(${PACKAGE_NAME} CONFIG ${EXTRA_MACRO_ARGS})
+ endif()
+
+
+ if ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME}_DIR}")
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_DIR}")
+ endif()
+ message(STATUS "AutoBuild: OK - Found ${PACKAGE_NAME} at ${FOUND_AT_DIR}.")
+ # Found the package on the system, so there is no need to autobuild it, but we still add
+ # an option (defaulting to OFF) so that users can "force" building their own version of
+ # the dependency if they wish.
+ option(AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER} "If on, the AutoBuild CMake plugin will download, build, and install ${PACKAGE_NAME} to CMAKE_INSTALL_PREFIX the next time that CMake Configure is run." OFF)
+ else()
+ message(STATUS "AutoBuild: Could not find ${PACKAGE_NAME}, setting AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER}=ON.")
+ # If the package is still not found, then we will need to autobuild it, add the option with a default of ON
+ option(AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER} "If on, the AutoBuild CMake plugin will download, build, and install ${PACKAGE_NAME} to CMAKE_INSTALL_PREFIX the next time that CMake Configure is run." ON)
+ endif()
+
+ endif()
+endmacro()
+
+
+
+macro(AutoBuild_find_built_package_config_mode PACKAGE_NAME)
+ # Users can pass in extra arguments to the find_package command if needed.
+ set(EXTRA_MACRO_ARGS ${ARGN})
+
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+ # Force CMake to find the package again -- need for the case where the package exists on the system
+ # but we want to force building and installing it. after the install, we need to clear these flags
+ # so that find_package will find the newlyl installed version.
+ unset(${PACKAGE_NAME}_DIR CACHE)
+ unset(${PACKAGE_NAME_UPPER}_DIR CACHE)
+ unset(${PACKAGE_NAME}_FOUND CACHE)
+ unset(${PACKAGE_NAME_UPPER}_FOUND CACHE)
+
+ message(STATUS "AutoBuild: Searching again (after autobuilding) for package ${PACKAGE_NAME} using config mode...")
+
+ # Try first to find the package within the current CMAKE_INSTALL_PREFIX. In the case when multiple
+ # versions of a library are installed on the same system, this makes sure that we will find a version
+ # that was previously built using AutoBuild first.
+ find_package(${PACKAGE_NAME} PATHS ${CMAKE_INSTALL_PREFIX} NO_DEFAULT_PATH ${EXTRA_MACRO_ARGS} QUIET)
+
+ # Try again with the normal version of find_package(), which will search a variety of places on
+ # the system, see details here: https://cmake.org/cmake/help/latest/command/find_package.html
+ if (NOT ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}"))
+ find_package(${PACKAGE_NAME} ${EXTRA_MACRO_ARGS})
+ endif()
+
+
+ if ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME}_DIR}")
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_DIR}")
+ endif()
+ message(STATUS "AutoBuild: OK - Found ${PACKAGE_NAME} at ${FOUND_AT_DIR}.")
+ else()
+ message(FATAL_ERROR "AutoBuild: Just completed a download, build, and install sequence for package ${PACKAGE_NAME}, and it should now be installed at the prefix ${CMAKE_INSTALL_PREFIX}, but cmake is still unable to find it with find_package().")
+ endif()
+endmacro()
+
+
+
+macro(AutoBuild_find_package_module_mode PACKAGE_NAME)
+ # Users can pass in extra arguments to the find_package command if needed.
+ set(EXTRA_MACRO_ARGS ${ARGN})
+
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+
+ # Force CMake to find the package again -- need for the case where the package exists on the system
+ # but we want to force building and installing it. after the install, we need to clear these flags
+ # so that find_package will find the newlyl installed version.
+ unset(${PACKAGE_NAME}_DIR CACHE)
+ unset(${PACKAGE_NAME_UPPER}_DIR CACHE)
+ unset(${PACKAGE_NAME}_FOUND CACHE)
+ unset(${PACKAGE_NAME_UPPER}_FOUND CACHE)
+
+ message(STATUS "AutoBuild: Searching for package ${PACKAGE_NAME} using cmake's find_package() module mode...")
+
+ if (NOT AUTOBUILD_DEPENDENCIES)
+
+ message(STATUS "AutoBuild: AUTOBUILD_DEPENDENCIES is OFF, using default CMake find_package() behavior.")
+ find_package(${PACKAGE_NAME} MODULE ${EXTRA_MACRO_ARGS})
+
+ else()
+
+ # AutoBuild allows users to force building a dependency even if it is already found installed on the
+ # system. To make this work, any Find*.cmake scripts that are used with AutoBuild must look first
+ # for the library under ${CMAKE_INSTALL_PREFIX}. This makes it so that preference is given to
+ # libraries just built and installed there with AutoBuild.
+ find_package(${PACKAGE_NAME} MODULE ${EXTRA_MACRO_ARGS})
+
+ if ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME}_DIR}")
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_DIR}")
+ endif()
+ message(STATUS "AutoBuild: OK - Found ${PACKAGE_NAME} at ${FOUND_AT_DIR}.")
+ # Found the package on the system, so there is no need to autobuild it, but we still add
+ # an option (defaulting to OFF) so that users can "force" building their own version of
+ # the dependency if they wish.
+ option(AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER} "If on, the AutoBuild CMake plugin will download, build, and install ${PACKAGE_NAME} to CMAKE_INSTALL_PREFIX the next time that CMake Configure is run." OFF)
+ else()
+ message(STATUS "AutoBuild: Could not find ${PACKAGE_NAME}, setting AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER}=ON.")
+ # If the package is still not found, then we will need to autobuild it, add the option with a default of ON
+ option(AUTOBUILD_PACKAGE_${PACKAGE_NAME_UPPER} "If on, the AutoBuild CMake plugin will download, build, and install ${PACKAGE_NAME} to CMAKE_INSTALL_PREFIX the next time that CMake Configure is run." ON)
+ endif()
+
+ endif()
+endmacro()
+
+
+
+macro(AutoBuild_find_built_package_module_mode PACKAGE_NAME)
+ # Users can pass in extra arguments to the find_package command if needed.
+ set(EXTRA_MACRO_ARGS ${ARGN})
+
+ string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UPPER)
+
+ # Force CMake to find the package again -- need for the case where the package exists on the system
+ # but we want to force building and installing it. after the install, we need to clear these flags
+ # so that find_package will find the newlyl installed version.
+ unset(${PACKAGE_NAME}_DIR CACHE)
+ unset(${PACKAGE_NAME_UPPER}_DIR CACHE)
+ unset(${PACKAGE_NAME}_FOUND CACHE)
+ unset(${PACKAGE_NAME_UPPER}_FOUND CACHE)
+
+ message(STATUS "AutoBuild: Searching again (after autobuilding) for package ${PACKAGE_NAME} using module mode...")
+
+ # AutoBuild allows users to force building a dependency even if it is already found installed on the
+ # system. To make this work, any Find*.cmake scripts that are used with AutoBuild must look first
+ # for the library under ${CMAKE_INSTALL_PREFIX}. This makes it so that preference is given to
+ # libraries just built and installed there with AutoBuild.
+ find_package(${PACKAGE_NAME} MODULE ${EXTRA_MACRO_ARGS})
+
+ if ("${${PACKAGE_NAME}_FOUND}" OR "${${PACKAGE_NAME_UPPER}_FOUND}")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME}_DIR}")
+ if ("${FOUND_AT_DIR}" STREQUAL "")
+ set(FOUND_AT_DIR "${${PACKAGE_NAME_UPPER}_DIR}")
+ endif()
+ message(STATUS "AutoBuild: OK - Found ${PACKAGE_NAME} at ${FOUND_AT_DIR}.")
+ else()
+ message(FATAL_ERROR "AutoBuild: Just completed a download, build, and install sequence for package ${PACKAGE_NAME}, and it should now be installed at the prefix ${CMAKE_INSTALL_PREFIX}, but cmake is still unable to find it with find_package().")
+ endif()
+endmacro()
+
+
+
+# Usage:
+# AutoBuild_download_project(
+# # This first argument is the name of the project to download. It is required:
+# glm
+#
+# # Additional arguments specify how to download the project using GIT, SVN, CVS, or URL.
+# # These can be any of the arguments used for the downloading step of the cmake builtin
+# # ExternalProject_Add command.
+# GIT_REPOSITORY "https://github.com/g-truc/glm.git"
+# GIT_TAG master
+# etc..
+# )
+function(AutoBuild_download_project EXT_PROJECT_NAME)
+
+ big_message("AUTOBUILD: BEGIN EXTERNAL PROJECT DOWNLOAD (${EXT_PROJECT_NAME}).")
+
+ message(STATUS "AutoBuild: Creating a download helper project for ${EXT_PROJECT_NAME}.")
+
+ set(DOWNLOAD_OPTIONS ${ARGN})
+ string (REGEX REPLACE "(^|[^\\\\]);" "\\1 " DOWNLOAD_OPTIONS "${DOWNLOAD_OPTIONS}")
+
+ file(MAKE_DIRECTORY ${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME})
+
+ # Write the CMakeLists.txt.in file to disk
+ set(DLHELPER_FILE_TEXT "\n \
+ # This is a helper cmake project -- the only thing this project does is download \n \
+ # the external project. So, the configure, build, install, and test commands for \n \
+ # ExternalProject_Add() are intentionally set as NOPs. \n \
+ \n \
+ cmake_minimum_required (VERSION 3.9) \n \
+ \n \
+ project(@EXT_PROJECT_NAME@-download) \n \
+ \n \
+ include(ExternalProject) \n \
+ ExternalProject_Add( \n \
+ @EXT_PROJECT_NAME@ \n \
+ SOURCE_DIR \"@AUTOBUILD_DOWNLOAD_DIR@/@EXT_PROJECT_NAME@/src\" \n \
+ BINARY_DIR \"@AUTOBUILD_DOWNLOAD_DIR@/@EXT_PROJECT_NAME@/download-helper\" \n \
+ @DOWNLOAD_OPTIONS@ \n \
+ CONFIGURE_COMMAND \"\" \n \
+ BUILD_COMMAND \"\" \n \
+ INSTALL_COMMAND \"\" \n \
+ TEST_COMMAND \"\" \n \
+ LOG_DOWNLOAD ON \n \
+ GIT_PROGRESS 1 \n \
+ ) \n \
+ ")
+
+ file(WRITE ${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}/download-helper/CMakeLists.txt.in ${DLHELPER_FILE_TEXT})
+
+ configure_file(
+ ${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}/download-helper/CMakeLists.txt.in
+ ${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}/download-helper/CMakeLists.txt
+ )
+
+ message(STATUS "AutoBuild: Generating build files for the ${EXT_PROJECT_NAME} download helper project.")
+ message(STATUS " Using working dir: ${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}/download-helper")
+
+ execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . WORKING_DIRECTORY "${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}/download-helper" OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr RESULT_VARIABLE exitcode)
+ if(NOT "${exitcode}" STREQUAL "0")
+ message(FATAL_ERROR "AutoBuild: Error while creating download helper project: ${stdout} ${stderr}")
+ endif()
+
+ message(STATUS "AutoBuild: Building the ${EXT_PROJECT_NAME} download helper project. (This actually performs the download and may take some time...)")
+ execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}/download-helper" OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr RESULT_VARIABLE exitcode)
+ if(NOT "${exitcode}" STREQUAL "0")
+ message(FATAL_ERROR "AutoBuild: Error running download helper project: ${stdout} ${stderr}")
+ endif()
+
+ message(STATUS "AutoBuild: Completed download of external project ${EXT_PROJECT_NAME}.")
+
+endfunction()
+
+
+# Usage:
+# AutoBuild_build_and_install_project(
+# # This first argument is the name of the external project to download. It is required:
+# VRPN
+# # This second argument is the relative path from ${EXTERNAL_DIR_NAME}/projectname/ to the project's
+# # main CMakeLists.txt file:
+# src
+#
+# # Additional arguments are passed on as options to the cmake build file generator
+# -DVRPN_BUILD_DIRECTSHOW_VIDEO_SERVER=OFF
+# -DVRPN_BUILD_HID_GUI=OFF
+# etc..
+# )
+function(AutoBuild_build_and_install_project EXT_PROJECT_NAME RELPATH_TO_CMAKELISTS)
+
+ big_message("AUTOBUILD: BEGIN EXTERNAL PROJECT BUILD AND INSTALL (${EXT_PROJECT_NAME}).")
+
+ # any extra args to the function are interpreted as arguments for the cmake config process
+ set(CMAKE_CONFIG_OPTIONS ${ARGN})
+
+ # always set the install prefix to be the same as for the main project
+ list(APPEND CMAKE_CONFIG_OPTIONS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX})
+
+ set(SRC_DIR "${AUTOBUILD_DOWNLOAD_DIR}/${EXT_PROJECT_NAME}/src/${RELPATH_TO_CMAKELISTS}")
+ set(BUILD_DIR "${CMAKE_BINARY_DIR}/external/${EXT_PROJECT_NAME}")
+
+ file(MAKE_DIRECTORY ${BUILD_DIR})
+
+ message(STATUS "AutoBuild: Generating build files for external project ${EXT_PROJECT_NAME}.")
+ message(STATUS " Using source dir: ${SRC_DIR}")
+ message(STATUS " Using build dir: ${BUILD_DIR}")
+ message(STATUS " Config options: ${CMAKE_CONFIG_OPTIONS}")
+
+ execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" ${SRC_DIR} ${CMAKE_CONFIG_OPTIONS} WORKING_DIRECTORY ${BUILD_DIR} OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr RESULT_VARIABLE exitcode)
+ if(NOT "${exitcode}" STREQUAL "0")
+ message(FATAL_ERROR "AutoBuild: Error generating build files for external project: ${stdout} ${stderr}")
+ endif()
+
+ message(STATUS "AutoBuild: Building external project ${EXT_PROJECT_NAME} (Configuration = Debug). (This may take some time...)")
+ execute_process(COMMAND "${CMAKE_COMMAND}" --build ${BUILD_DIR} --config Debug --target install OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr RESULT_VARIABLE exitcode)
+ if(NOT "${exitcode}" STREQUAL "0")
+ message(FATAL_ERROR "AutoBuild: Error building Debug configuration for external project: ${stdout} ${stderr}")
+ endif()
+
+ message(STATUS "AutoBuild: Building external project ${EXT_PROJECT_NAME} (Configuration = Release). (This may take some time...)")
+ execute_process(COMMAND "${CMAKE_COMMAND}" --build ${BUILD_DIR} --config Release --target install OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr RESULT_VARIABLE exitcode)
+ if(NOT "${exitcode}" STREQUAL "0")
+ message(FATAL_ERROR "AutoBuild: Error building Release configuration for external project: ${stdout} ${stderr}")
+ endif()
+
+ message(STATUS "AutoBuild: Completed external build of ${EXT_PROJECT_NAME}.\n\n")
+
+endfunction()
+
+
+macro(big_message TITLE)
+ string(TOUPPER ${TITLE} TITLE)
+ message(STATUS "\n\n==== ${TITLE} ====")
+endmacro()
+
+
+
diff --git a/dev/MinGfx/example/cmake/AutoBuildOpenGL.cmake b/dev/MinGfx/example/cmake/AutoBuildOpenGL.cmake
new file mode 100644
index 0000000..c74b2b8
--- /dev/null
+++ b/dev/MinGfx/example/cmake/AutoBuildOpenGL.cmake
@@ -0,0 +1,47 @@
+# Author: Daniel F. Keefe
+# Copyright 2017,2018, Daniel F. Keefe and Regents of the University of Minnesota
+# All Rights Reserved.
+
+
+# Usage:
+# AutoBuild_use_package_OpenGL(
+# # The 1st argument is required. It is the name of the target you wish to link this dependency to.
+# my-program
+#
+# # The 2nd argument is required. It impacts how dependencies are propogated through CMake. You can treat
+# # this dependency as an INTERFACE, PUBLIC, or PRIVATE. See the following URL for details:
+# # https://cmake.org/cmake/help/latest/command/target_include_directories.html
+# PUBLIC
+# )
+#
+macro(AutoBuild_use_package_OpenGL YOUR_TARGET INTERFACE_PUBLIC_OR_PRIVATE)
+
+ message(STATUS "AutoBuild: Searching for package OpenGL...")
+
+ # Check to see if the library is already installed on the system
+ # CMake ships with FindOpenGL.cmake and in CMake 3.9+ it defines
+ # the imported targets OpenGL::GL and OpenGL::GLU. Using these is
+ # now the preferred way to link with OpenGL and all of its dependencies.
+ # See https://cmake.org/cmake/help/v3.9/module/FindOpenGL.html
+ find_package(OpenGL)
+
+ if (NOT ${OPENGL_FOUND})
+ message(FATAL_ERROR "AutoBuild: OpenGL was not found on the system. AutoBuild can auto-download
+ and build many dependencies for you, but not OpenGL. It should come pre-installed on your system.")
+ endif()
+
+ message(STATUS "AutoBuild: Ok. Found OpenGL.")
+ message(STATUS " OpenGL headers: ${OPENGL_INCLUDE_DIR}")
+ message(STATUS " OpenGL libs: ${OPENGL_LIBRARIES}")
+
+ message(STATUS "Linking target ${YOUR_TARGET} with ${INTERFACE_PUBLIC_OR_PRIVATE} dependency OpenGL::GL.")
+ target_link_libraries(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} OpenGL::GL)
+
+ if (${OPENGL_GLU_FOUND})
+ message(STATUS "Linking target ${YOUR_TARGET} with ${INTERFACE_PUBLIC_OR_PRIVATE} dependency OpenGL::GLU.")
+ target_link_libraries(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} OpenGL::GLU)
+ endif()
+
+ target_compile_definitions(${YOUR_TARGET} ${INTERFACE_PUBLIC_OR_PRIVATE} -DUSE_OPENGL)
+
+endmacro()
diff --git a/dev/MinGfx/example/cmake/MessageMacros.cmake b/dev/MinGfx/example/cmake/MessageMacros.cmake
new file mode 100644
index 0000000..4628e5c
--- /dev/null
+++ b/dev/MinGfx/example/cmake/MessageMacros.cmake
@@ -0,0 +1,17 @@
+# This file is part of the MinVR cmake build system.
+# See the main MinVR/CMakeLists.txt file for authors, copyright, and license info.
+
+
+macro(h1 TITLE)
+ string(TOUPPER ${TITLE} TITLE)
+ message(STATUS "\n\n==== ${TITLE} ====")
+endmacro()
+
+macro(h2 TITLE)
+ message(STATUS "\n* ${TITLE}")
+endmacro()
+
+macro(h3 TITLE)
+ message(STATUS "- ${TITLE}")
+endmacro()
+
diff --git a/dev/MinGfx/example/main-circleviewer.cpp b/dev/MinGfx/example/main-circleviewer.cpp
new file mode 100644
index 0000000..50e0d33
--- /dev/null
+++ b/dev/MinGfx/example/main-circleviewer.cpp
@@ -0,0 +1,12 @@
+
+#include "CircleViewer.h"
+
+
+int main(int argc, char **argv) {
+
+ CircleViewer app;
+ app.Run();
+
+ return 0;
+}
+
diff --git a/dev/MinGfx/src/.gitignore b/dev/MinGfx/src/.gitignore
new file mode 100644
index 0000000..4d353dd
--- /dev/null
+++ b/dev/MinGfx/src/.gitignore
@@ -0,0 +1,2 @@
+mingfx_config.h
+
diff --git a/dev/MinGfx/src/CMakeLists.txt b/dev/MinGfx/src/CMakeLists.txt
new file mode 100644
index 0000000..ff8225b
--- /dev/null
+++ b/dev/MinGfx/src/CMakeLists.txt
@@ -0,0 +1,107 @@
+# This file is part of the MinGfx cmake build system.
+# See the main MinGfx/CMakeLists.txt file for details.
+
+
+set(HEADERFILES
+ src/aabb.h
+ src/bvh.h
+ src/color.h
+ src/craft_cam.h
+ src/default_shader.h
+ src/gfxmath.h
+ src/graphics_app.h
+ src/matrix4.h
+ src/mesh.h
+ src/mingfx.h
+ src/mingfx_config.h
+ src/opengl_headers.h
+ src/platform.h
+ src/point2.h
+ src/point3.h
+ src/quaternion.h
+ src/quick_shapes.h
+ src/ray.h
+ src/shader_program.h
+ src/text_shader.h
+ src/texture2d.h
+ src/unicam.h
+ src/vector2.h
+ src/vector3.h
+)
+
+set(SOURCEFILES
+ src/aabb.cc
+ src/bvh.cc
+ src/color.cc
+ src/craft_cam.cc
+ src/default_shader.cc
+ src/gfxmath.cc
+ src/graphics_app.cc
+ src/matrix4.cc
+ src/mesh.cc
+ src/platform.cc
+ src/point2.cc
+ src/point3.cc
+ src/quaternion.cc
+ src/quick_shapes.cc
+ src/ray.cc
+ src/shader_program.cc
+ src/text_shader.cc
+ src/texture2d.cc
+ src/unicam.cc
+ src/vector2.cc
+ src/vector3.cc
+)
+
+set(EXTRAFILES
+ src/mingfx_config.h.in
+)
+
+set(SHADERFILES
+ src/shaders/default.frag
+ src/shaders/default.vert
+ src/shaders/fullscreen.frag
+ src/shaders/fullscreen.vert
+ src/shaders/text.frag
+ src/shaders/text.vert
+)
+
+set_source_files_properties(${EXTRAFILES} PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties(${SHADERFILES} PROPERTIES HEADER_FILE_ONLY TRUE)
+
+source_group("Header Files" FILES ${HEADERFILES})
+source_group("Source Files" FILES ${SOURCEFILES})
+source_group("Shaders" FILES ${SHADERFILES})
+
+#add_library(MinGfx SHARED ${HEADERFILES} ${SOURCEFILES} ${EXTRAFILES} ${SHADERFILES})
+
+add_library(MinGfx ${HEADERFILES} ${SOURCEFILES} ${EXTRAFILES} ${SHADERFILES})
+
+
+# Using target_include_directories() rather than just include_directories() is
+# critical in order to support generating a MinGfxConfig.cmake file. It supports
+# generator expressions, so we can point to two different include dirs depending
+# on whether building or using the installed version.
+target_include_directories(MinGfx PUBLIC
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src> # for headers when building
+ $<INSTALL_INTERFACE:${INSTALL_INCLUDE_DEST}> # for client in install mode
+)
+
+# Add external dependency on NanoGUI
+include(AutoBuildNanoGUI)
+AutoBuild_use_package_NanoGUI(MinGfx PUBLIC)
+
+# Add external dependency on OpenGL
+include(AutoBuildOpenGL)
+AutoBuild_use_package_OpenGL(MinGfx PUBLIC)
+
+
+install(TARGETS MinGfx EXPORT MinGfxTargets COMPONENT CoreLib
+ LIBRARY DESTINATION "${INSTALL_LIB_DEST}"
+ ARCHIVE DESTINATION "${INSTALL_LIB_DEST}"
+ RUNTIME DESTINATION "${INSTALL_BIN_DEST}"
+)
+
+install(FILES ${HEADERFILES} DESTINATION "${INSTALL_INCLUDE_DEST}" COMPONENT CoreLib)
+install(FILES ${SHADERFILES} DESTINATION "${INSTALL_SHADERS_DEST}" COMPONENT CoreLib)
+
diff --git a/dev/MinGfx/src/aabb.cc b/dev/MinGfx/src/aabb.cc
new file mode 100644
index 0000000..1d94900
--- /dev/null
+++ b/dev/MinGfx/src/aabb.cc
@@ -0,0 +1,150 @@
+#include "aabb.h"
+
+#include "mesh.h"
+
+#include <float.h>
+
+namespace mingfx {
+
+AABB::AABB() {
+ min_[0] = min_[1] = min_[2] = std::numeric_limits<float>::max();
+ max_[0] = max_[1] = max_[2] = -std::numeric_limits<float>::max();
+ user_data_ = 0;
+}
+
+
+AABB::AABB(const Point3 &a) {
+ min_ = a;
+ max_ = a;
+ user_data_ = 0;
+}
+
+AABB::AABB(const Vector3 &v) {
+ min_ = Point3(-0.5f*v[0], -0.5f*v[1], -0.5f*v[2]);
+ max_ = Point3( 0.5f*v[0], 0.5f*v[1], 0.5f*v[2]);
+ user_data_ = 0;
+}
+
+AABB::AABB(const Point3 &p, const Vector3 &v) {
+ min_ = Point3(p[0] - 0.5f*v[0], p[1] - 0.5f*v[1], p[2] - 0.5f*v[2]);
+ max_ = Point3(p[0] + 0.5f*v[0], p[1] + 0.5f*v[1], p[2] + 0.5f*v[2]);
+ user_data_ = 0;
+}
+
+AABB::AABB(const Point3 &a, const Point3 &b, const Point3 &c) {
+ min_ = a;
+ min_[0] = std::min(min_[0], b[0]);
+ min_[1] = std::min(min_[1], b[1]);
+ min_[2] = std::min(min_[2], b[2]);
+ min_[0] = std::min(min_[0], c[0]);
+ min_[1] = std::min(min_[1], c[1]);
+ min_[2] = std::min(min_[2], c[2]);
+
+ max_ = a;
+ max_[0] = std::max(max_[0], b[0]);
+ max_[1] = std::max(max_[1], b[1]);
+ max_[2] = std::max(max_[2], b[2]);
+ max_[0] = std::max(max_[0], c[0]);
+ max_[1] = std::max(max_[1], c[1]);
+ max_[2] = std::max(max_[2], c[2]);
+ user_data_ = 0;
+}
+
+
+AABB::AABB(const Mesh &mesh, unsigned int tri_id) {
+ std::vector<unsigned int> indices = mesh.read_triangle_indices_data(tri_id);
+ Point3 a = mesh.read_vertex_data(indices[0]);
+ Point3 b = mesh.read_vertex_data(indices[1]);
+ Point3 c = mesh.read_vertex_data(indices[2]);
+
+ min_ = a;
+ min_[0] = std::min(min_[0], b[0]);
+ min_[1] = std::min(min_[1], b[1]);
+ min_[2] = std::min(min_[2], b[2]);
+ min_[0] = std::min(min_[0], c[0]);
+ min_[1] = std::min(min_[1], c[1]);
+ min_[2] = std::min(min_[2], c[2]);
+
+ max_ = a;
+ max_[0] = std::max(max_[0], b[0]);
+ max_[1] = std::max(max_[1], b[1]);
+ max_[2] = std::max(max_[2], b[2]);
+ max_[0] = std::max(max_[0], c[0]);
+ max_[1] = std::max(max_[1], c[1]);
+ max_[2] = std::max(max_[2], c[2]);
+
+ user_data_ = 0;
+}
+
+
+AABB::AABB(const Mesh &mesh) {
+ min_[0] = min_[1] = min_[2] = std::numeric_limits<float>::max();
+ max_[0] = max_[1] = max_[2] = -std::numeric_limits<float>::max();
+
+ for (int i=0; i < mesh.num_vertices(); i++) {
+ Point3 a = mesh.read_vertex_data(i);
+ min_[0] = std::min(min_[0], a[0]);
+ min_[1] = std::min(min_[1], a[1]);
+ min_[2] = std::min(min_[2], a[2]);
+
+ max_[0] = std::max(max_[0], a[0]);
+ max_[1] = std::max(max_[1], a[1]);
+ max_[2] = std::max(max_[2], a[2]);
+ }
+
+ user_data_ = 0;
+}
+
+
+AABB::~AABB() {}
+
+Vector3 AABB::Dimensions() const {
+ return max_ - min_;
+}
+
+float AABB::Volume() const {
+ if (max_[0] < min_[0]) {
+ // empty box
+ return -1.0;
+ }
+
+ Vector3 dims = max_ - min_;
+ return (dims[0] * dims[1] * dims[2]);
+}
+
+
+Point3 AABB::min() const {
+ return min_;
+}
+
+Point3 AABB::max() const {
+ return max_;
+}
+
+
+void AABB::set_user_data(int data) {
+ user_data_ = data;
+}
+
+int AABB::user_data() {
+ return user_data_;
+}
+
+
+// Compute an AABB that contains both A and B completely
+AABB operator+(const AABB &A, const AABB &B) {
+ AABB C;
+
+ C.min_[0] = std::min(A.min_[0], B.min_[0]);
+ C.min_[1] = std::min(A.min_[1], B.min_[1]);
+ C.min_[2] = std::min(A.min_[2], B.min_[2]);
+
+ C.max_[0] = std::max(A.max_[0], B.max_[0]);
+ C.max_[1] = std::max(A.max_[1], B.max_[1]);
+ C.max_[2] = std::max(A.max_[2], B.max_[2]);
+
+ return C;
+}
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/aabb.h b/dev/MinGfx/src/aabb.h
new file mode 100644
index 0000000..0c94140
--- /dev/null
+++ b/dev/MinGfx/src/aabb.h
@@ -0,0 +1,96 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ David Schroeder, 2010-ish, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ Dan Keefe, 2018, University of Minnesota
+ ...
+ */
+
+#ifndef SRC_AABB_H_
+#define SRC_AABB_H_
+
+#include "point3.h"
+#include "vector3.h"
+
+namespace mingfx {
+
+// forward declaration
+class Mesh;
+
+/** A 3D axis-aligned bounding box defined by two corners (min and max). AABBs
+ can be added together using the + operator to make them grow to cover the
+ extents of both boxes. Each box can also store a user_id (int), which can be
+ used to associate the box with some other object in your program.
+ */
+class AABB {
+public:
+ /// Creates an empty box.
+ AABB();
+
+ /// Box that contains a single point
+ AABB(const Point3 &a);
+
+ /// Box that contains a triangle defined by 3 points
+ AABB(const Point3 &a, const Point3 &b, const Point3 &c);
+
+ /// Box centered at the origin with width, height, and depth specified by
+ /// the vector.
+ AABB(const Vector3 &extents);
+
+ /// Box centered at the center with width, height, and depth specified by
+ /// the vector.
+ AABB(const Point3 &center, const Vector3 &extents);
+
+ /// Box that contains a whole mesh
+ AABB(const Mesh &mesh);
+
+ /// Box that contains just triangle number "tri_id" from the specified mesh.
+ AABB(const Mesh &mesh, unsigned int tri_id);
+
+ virtual ~AABB();
+
+ /// Returns the dimensions of the box in x, y, and z as a 3D vector.
+ Vector3 Dimensions() const;
+
+ /// Returns the volume of the box or -1.0 when empty and 0.0 if the box
+ /// contains just a single point.
+ float Volume() const;
+
+ /// Returns the coordinates for the minimum corner of the box.
+ Point3 min() const;
+
+ /// Returns the coordinates for the maximum corner of the box.
+ Point3 max() const;
+
+ /// You can set this to whatever you want in order to use it as a handle
+ /// into your own program. The intent is to make it possible for you to
+ /// associate this AABB with the id of some object in your application.
+ void set_user_data(int data);
+
+ /// You can set this to whatever you want in order to use it as a handle
+ /// into your own program. The intent is to make it possible for you to
+ /// associate this AABB with the id of some object in your application.
+ int user_data();
+
+private:
+
+ Point3 min_, max_;
+
+ int user_data_;
+
+ friend AABB operator+(const AABB &A, const AABB &B);
+};
+
+// Returns an AABB that contains both A and B completely (kind of like a union)
+AABB operator+(const AABB &A, const AABB &B);
+
+
+} // end namespace
+
+#endif
diff --git a/dev/MinGfx/src/bvh.cc b/dev/MinGfx/src/bvh.cc
new file mode 100644
index 0000000..ff8dbbc
--- /dev/null
+++ b/dev/MinGfx/src/bvh.cc
@@ -0,0 +1,120 @@
+#include "bvh.h"
+
+#include "mesh.h"
+#include "ray.h"
+
+#include <float.h>
+#include <algorithm>
+
+namespace mingfx {
+
+
+BVH::BVH() : root_(NULL) {
+}
+
+BVH::~BVH() {
+ FreeNodeRecursive(root_);
+}
+
+void BVH::CreateFromMesh(const Mesh &mesh) {
+ FreeNodeRecursive(root_);
+
+ std::vector<AABB> tri_boxes;
+ for (int i=0; i<mesh.num_triangles(); i++) {
+ AABB box = AABB(mesh, i);
+ box.set_user_data(i);
+ tri_boxes.push_back(box);
+ }
+
+ root_ = new Node();
+ BuildHierarchyRecursive(root_, tri_boxes);
+}
+
+void BVH::CreateFromListOfBoxes(const std::vector<AABB> &boxes) {
+ FreeNodeRecursive(root_);
+
+ root_ = new Node();
+ BuildHierarchyRecursive(root_, boxes);
+}
+
+
+void BVH::FreeNodeRecursive(Node* node) {
+ if (node == NULL) return;
+ FreeNodeRecursive(node->child1);
+ FreeNodeRecursive(node->child2);
+ delete node;
+}
+
+bool sort_by_x(const AABB &lhs, const AABB &rhs) {
+ return (lhs.min()[0] + lhs.max()[0]) < (rhs.min()[0] + rhs.max()[0]);
+}
+
+bool sort_by_y(const AABB &lhs, const AABB &rhs) {
+ return (lhs.min()[1] + lhs.max()[1]) < (rhs.min()[1] + rhs.max()[1]);
+}
+
+bool sort_by_z(const AABB &lhs, const AABB &rhs) {
+ return (lhs.min()[2] + lhs.max()[2]) < (rhs.min()[2] + rhs.max()[2]);
+}
+
+void BVH::BuildHierarchyRecursive(Node *node, std::vector<AABB> tri_boxes) {
+ // got down to a leaf, a single box
+ if (tri_boxes.size() == 1) {
+ node->box = tri_boxes[0];
+ return;
+ }
+
+ // calc the full bounding box for this node
+ for (int i=0; i<tri_boxes.size(); i++) {
+ node->box = node->box + tri_boxes[i];
+ }
+
+ // sort boxes along the longest axis
+ Vector3 dims = node->box.Dimensions();
+ dims[0] = fabsf(dims[0]);
+ dims[1] = fabsf(dims[1]);
+ dims[2] = fabsf(dims[2]);
+
+ if ((dims[0] > dims[1]) && (dims[0] > dims[2])) {
+ std::sort(tri_boxes.begin(), tri_boxes.end(), sort_by_x);
+ }
+ else if ((dims[1] > dims[0]) && (dims[1] > dims[2])) {
+ std::sort(tri_boxes.begin(), tri_boxes.end(), sort_by_y);
+ }
+ else {
+ std::sort(tri_boxes.begin(), tri_boxes.end(), sort_by_z);
+ }
+
+ // assign half to child1 and half to child2
+ std::size_t const half_size = tri_boxes.size() / 2;
+ std::vector<AABB> left_boxes(tri_boxes.begin(), tri_boxes.begin() + half_size);
+ std::vector<AABB> right_boxes(tri_boxes.begin() + half_size, tri_boxes.end());
+
+ node->child1 = new Node();
+ BuildHierarchyRecursive(node->child1, left_boxes);
+ node->child2 = new Node();
+ BuildHierarchyRecursive(node->child2, right_boxes);
+}
+
+std::vector<int> BVH::IntersectAndReturnUserData(const Ray &r) const {
+ std::vector<int> data_list;
+ IntersectRecursive(r, root_, &data_list);
+ return data_list;
+}
+
+void BVH::IntersectRecursive(const Ray &r, Node *node, std::vector<int> *data_list) const {
+ float t;
+ if (r.IntersectAABB(node->box, &t)) {
+ if ((node->child1 == NULL) && (node->child2 == NULL)) {
+ // reached a leaf node, add the object's user data to the list
+ data_list->push_back(node->box.user_data());
+ }
+ else {
+ // go deeper and check children
+ IntersectRecursive(r, node->child1, data_list);
+ IntersectRecursive(r, node->child2, data_list);
+ }
+ }
+}
+
+} // end namespace
diff --git a/dev/MinGfx/src/bvh.h b/dev/MinGfx/src/bvh.h
new file mode 100644
index 0000000..46b15ce
--- /dev/null
+++ b/dev/MinGfx/src/bvh.h
@@ -0,0 +1,106 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ David Schroeder, 2010-ish, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ Dan Keefe, 2018, University of Minnesota
+ ...
+ */
+
+#ifndef SRC_BVH_H_
+#define SRC_BVH_H_
+
+#include "aabb.h"
+#include "point3.h"
+
+
+namespace mingfx {
+
+// forward declarations
+class Mesh;
+class Ray;
+
+
+/** A Bounding Volume Hierarchy (BVH) data structure that can be used to
+ accelerate ray-object intersection tests by carving up space into a hierarchy
+ of partitions represented in a tree. Each node of the tree is represented
+ as an AABB (Axis-Aligned Bounding Box) that contains all of the nodes under it.
+ Different objects can be stored inside each bounding box. For example, when
+ a BVH is created for a mesh, each leaf node can contain a AABB that contains
+ just a single triangle. Or, when a BVH is created for an entire scene, you
+ could have each leaf node contain an entire mesh or other object within the
+ scene. In each case, use AABB's set_user_data() and user_data() methods to
+ store a handle for whetever you want to store inside the nodes.
+ */
+class BVH {
+public:
+ /// Initializes the class with an empty hierarchy.
+ BVH();
+
+ virtual ~BVH();
+
+ /** Creates a bounding volume hierarchy where each leaf node contains a single
+ triangle from the mesh. For leaf nodes, the triangle index can be retrieved
+ with:
+ ~~~
+ int tri_id = leafnode->box.user_data();
+ ~~~
+ The user_data will be -1 for non-leaf nodes. Once the structure has been
+ created, it can be used to perform fast ray-mesh intersection tests. See
+ Ray::FastIntersectMesh().
+ */
+ void CreateFromMesh(const Mesh &mesh);
+
+
+ /** Creates a BVH where each leaf node contains one of the boxes passed in
+ to the function.
+ */
+ void CreateFromListOfBoxes(const std::vector<AABB> &boxes);
+
+
+ /** Traverse the BVH to find leaf nodes whose AABBs are intersected by the
+ ray. These are candidates to test more thoroughly using whatever ray-object
+ intersection test is appropriate for the objects stored inside the AABB.
+ This routine returns the user_data for each AABB leaf node. In the case of
+ a BVH created using CreateFromMesh, this means it stores the indices to
+ the mesh triangles that should be tested for ray-triangle intersection.
+ */
+ std::vector<int> IntersectAndReturnUserData(const Ray &r) const;
+
+
+private:
+
+ // Simple internal data structure for storing each node of the BVH tree.
+ class Node {
+ public:
+ Node() : child1(NULL), child2(NULL) {}
+
+ // Links to children
+ Node *child1;
+ Node *child2;
+
+ // Contains all geometry below this node.
+ AABB box;
+ };
+
+
+ // for now, the copy constructor is private so no copies are allowed.
+ // eventually, this would be good to implement and then it can be made public.
+ BVH(const BVH &other);
+
+ void BuildHierarchyRecursive(Node *node, std::vector<AABB> boxes);
+ void IntersectRecursive(const Ray &r, Node *node, std::vector<int> *data_list) const;
+ void FreeNodeRecursive(Node* node);
+
+ Node* root_;
+};
+
+
+} // end namespace
+
+#endif
diff --git a/dev/MinGfx/src/color.cc b/dev/MinGfx/src/color.cc
new file mode 100644
index 0000000..cc5db87
--- /dev/null
+++ b/dev/MinGfx/src/color.cc
@@ -0,0 +1,130 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "color.h"
+
+#include <math.h>
+
+namespace mingfx {
+
+Color::Color() {
+ c[0] = 0.0;
+ c[1] = 0.0;
+ c[2] = 0.0;
+ c[3] = 1.0;
+}
+
+Color::Color(float red, float green, float blue, float alpha) {
+ c[0] = red;
+ c[1] = green;
+ c[2] = blue;
+ c[3] = alpha;
+}
+
+Color::Color(float *ptr) {
+ c[0] = ptr[0];
+ c[1] = ptr[1];
+ c[2] = ptr[2];
+ c[3] = ptr[3];
+}
+
+Color::Color(const Color& other) {
+ c[0] = other[0];
+ c[1] = other[1];
+ c[2] = other[2];
+ c[3] = other[3];
+}
+
+Color::Color(const std::vector<float> &vals) {
+ c[0] = vals[0];
+ c[1] = vals[1];
+ c[2] = vals[2];
+ if (vals.size() > 3) {
+ c[3] = vals[3];
+ }
+ else {
+ c[3] = 1.0;
+ }
+}
+
+
+Color::~Color() {
+}
+
+bool Color::operator==(const Color& other) const {
+ return ((other[0] == c[0]) &&
+ (other[1] == c[1]) &&
+ (other[2] == c[2]) &&
+ (other[3] == c[3]));
+}
+
+bool Color::operator!=(const Color& other) const {
+ return ((other[0] != c[0]) ||
+ (other[1] != c[1]) ||
+ (other[2] != c[2]) ||
+ (other[3] != c[3]));
+}
+
+Color& Color::operator=(const Color& other) {
+ c[0] = other[0];
+ c[1] = other[1];
+ c[2] = other[2];
+ c[3] = other[3];
+ return *this;
+}
+
+float Color::operator[](const int i) const {
+ return c[i];
+}
+
+float& Color::operator[](const int i) {
+ return c[i];
+}
+
+
+const float * Color::value_ptr() const {
+ return c;
+}
+
+std::vector<float> Color::ToVector() const {
+ std::vector<float> v;
+ v.push_back(c[0]);
+ v.push_back(c[1]);
+ v.push_back(c[2]);
+ v.push_back(c[3]);
+ return v;
+}
+
+
+Color Color::Lerp(const Color &b, float alpha) const {
+ float red = (1.0f-alpha)*(*this)[0] + alpha*b[0];
+ float grn = (1.0f-alpha)*(*this)[1] + alpha*b[1];
+ float blu = (1.0f-alpha)*(*this)[2] + alpha*b[2];
+ float alp = (1.0f-alpha)*(*this)[3] + alpha*b[3];
+ return Color(red,grn,blu,alp);
+}
+
+Color Color::Lerp(const Color &a, const Color &b, float alpha) {
+ float red = (1.0f-alpha)*a[0] + alpha*b[0];
+ float grn = (1.0f-alpha)*a[1] + alpha*b[1];
+ float blu = (1.0f-alpha)*a[2] + alpha*b[2];
+ float alp = (1.0f-alpha)*a[3] + alpha*b[3];
+ return Color(red,grn,blu,alp);
+}
+
+
+std::ostream & operator<< ( std::ostream &os, const Color &c) {
+ return os << "(" << c[0] << ", " << c[1] << ", " << c[2] << ", " << c[3] << ")";
+}
+
+std::istream & operator>> ( std::istream &is, Color &c) {
+ // format: (r, g, b, a)
+ char dummy;
+ return is >> dummy >> c[0] >> dummy >> c[1] >> dummy >> c[2] >> dummy >> c[3] >> dummy;
+}
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/color.h b/dev/MinGfx/src/color.h
new file mode 100644
index 0000000..553dc84
--- /dev/null
+++ b/dev/MinGfx/src/color.h
@@ -0,0 +1,103 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_COLOR_H_
+#define SRC_COLOR_H_
+
+#include <iostream>
+#include <vector>
+
+namespace mingfx {
+
+
+/** Represents a 4-component (R,G,B,A) color, stored internally in a float array
+ to be compatable with OpenGL. Example usage:
+ ~~~
+ Color black(0, 0, 0);
+ Color white(1, 1, 1);
+ Color gray(0.5, 0.5, 0.5);
+ Color tranparent_red(1.0, 0.0, 0.0, 0.5);
+ Color orange(1.0, 0.65, 0.0);
+
+ float red_component_of_orange = orange[0];
+ float green_component_of_orange = orange[1];
+ float blue_component_of_orange = orange[2];
+ float alpha_component_of_orange = orange[3];
+
+ // Use value_ptr() to send the array of floats directly to OpenGL commands
+ glColor4fv(orange.value_ptr());
+ ~~~
+ */
+class Color {
+public:
+ /// Defaults to black
+ Color();
+
+ /// Constructs a color. Alpha defaults to 1.0 (completely opaque)
+ Color(float red, float green, float blue, float alpha=1.0);
+
+ /// Constructs a point given a pointer to float array
+ Color(float *p);
+
+ /// Constructs a point given a 3 or 4-element vector of floats
+ Color(const std::vector<float> &vals);
+
+ /// Copy constructor
+ Color(const Color& p);
+
+ /// Color destructor
+ virtual ~Color();
+
+ /// Check for equality
+ bool operator==(const Color& p) const;
+
+ /// Check for inequality
+ bool operator!=(const Color& p) const;
+
+ /// Assignment operator
+ Color& operator=(const Color& p);
+
+ /// Accesses the ith component of the color, stored in RGBA order.
+ float operator[](const int i) const;
+
+ /// Accesses the ith coordinate of the color, stored in RGBA order.
+ float& operator[](const int i);
+
+ /// Returns a const pointer to the raw data array
+ const float * value_ptr() const;
+
+ std::vector<float> ToVector() const;
+
+ /// Linear interpolation between this color and another. Alpha=0.0 returns
+ /// this color, and alpha=1.0 returns the other color, other values blend
+ /// between the two via a linear interpolation on each color channel.
+ Color Lerp(const Color &b, float alpha) const;
+
+ /// Linear interpolation between two colors. Alpha=0.0 returns 'a' and
+ /// alpha=1.0 returns 'b', other values blend between the two via a linear
+ /// interpolation on each color channel.
+ static Color Lerp(const Color &a, const Color &b, float alpha);
+
+
+private:
+ float c[4];
+};
+
+
+std::ostream & operator<< ( std::ostream &os, const Color &c);
+std::istream & operator>> ( std::istream &is, Color &c);
+
+
+} // namespace
+
+#endif
diff --git a/dev/MinGfx/src/craft_cam.cc b/dev/MinGfx/src/craft_cam.cc
new file mode 100644
index 0000000..425f524
--- /dev/null
+++ b/dev/MinGfx/src/craft_cam.cc
@@ -0,0 +1,127 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "craft_cam.h"
+
+namespace mingfx {
+
+
+CraftCam::CraftCam() : t_scale_(1.0), r_scale_(1.0), l_scale_(1.0), yaw_(0.0), pitch_(0.0) {
+}
+
+CraftCam::CraftCam(const Matrix4 &initialViewMatrix) :
+ t_scale_(1.0), r_scale_(1.0), l_scale_(1.0), yaw_(0.0), pitch_(0.0)
+{
+}
+
+CraftCam::~CraftCam()
+{
+}
+
+
+void CraftCam::UpdateSimulation(double dt, GLFWwindow *window_ptr) {
+ if ((glfwGetKey(window_ptr, GLFW_KEY_UP) == GLFW_PRESS) ||
+ (glfwGetKey(window_ptr, GLFW_KEY_W) == GLFW_PRESS)) {
+ WalkForward(dt);
+ }
+ if ((glfwGetKey(window_ptr, GLFW_KEY_DOWN) == GLFW_PRESS) ||
+ (glfwGetKey(window_ptr, GLFW_KEY_Z) == GLFW_PRESS)) {
+ WalkBackward(dt);
+ }
+ if ((glfwGetKey(window_ptr, GLFW_KEY_LEFT) == GLFW_PRESS) ||
+ (glfwGetKey(window_ptr, GLFW_KEY_A) == GLFW_PRESS)) {
+ RotateLeft(dt);
+ }
+ if ((glfwGetKey(window_ptr, GLFW_KEY_RIGHT) == GLFW_PRESS) ||
+ (glfwGetKey(window_ptr, GLFW_KEY_S) == GLFW_PRESS)) {
+ RotateRight(dt);
+ }
+}
+
+
+void CraftCam::OnMouseMove(const Vector2 &normalized_mouse_delta) {
+ LookWithMouse(normalized_mouse_delta);
+}
+
+
+
+void CraftCam::WalkForward(double dt) {
+ base_head_ = Matrix4::Translation(3.0f * (float)dt * t_scale_ * Vector3(0,0,1)) * base_head_;
+}
+
+void CraftCam::WalkBackward(double dt) {
+ base_head_ = Matrix4::Translation(3.0f * (float)dt * t_scale_ * Vector3(0,0,-1)) * base_head_;
+}
+
+void CraftCam::RotateLeft(double dt) {
+ base_head_ = Matrix4::RotationY(-0.75f * (float)dt * r_scale_) * base_head_;
+}
+
+void CraftCam::RotateRight(double dt) {
+ base_head_ = Matrix4::RotationY(0.75f * (float)dt * r_scale_) * base_head_;
+}
+
+void CraftCam::LookWithMouse(const Vector2 &mouse_delta) {
+ yaw_ += l_scale_ * mouse_delta[0];
+ pitch_ += l_scale_ * mouse_delta[1];
+ added_rot_ = Matrix4::RotationX(-pitch_) * Matrix4::RotationY(yaw_);
+}
+
+
+Matrix4 CraftCam::view_matrix() {
+ return added_rot_ * base_head_;
+}
+
+void CraftCam::set_view_matrix(Matrix4 view_matrix) {
+ base_head_ = view_matrix;
+ added_rot_ = Matrix4();
+}
+
+Point3 CraftCam::eye() {
+ Matrix4 camMat = view_matrix().Inverse();
+ return camMat.ColumnToPoint3(3);
+}
+
+Vector3 CraftCam::look() {
+ Matrix4 camMat = view_matrix().Inverse();
+ return -camMat.ColumnToVector3(2);
+}
+
+
+void CraftCam::set_translation_scale(float s) {
+ t_scale_ = s;
+}
+
+void CraftCam::set_rotation_scale(float s) {
+ r_scale_ = s;
+}
+
+void CraftCam::set_look_scale(float s) {
+ l_scale_ = s;
+}
+
+
+float CraftCam::translation_scale() {
+ return t_scale_;
+}
+
+float CraftCam::rotation_scale() {
+ return r_scale_;
+}
+
+float CraftCam::look_scale() {
+ return l_scale_;
+}
+
+void CraftCam::UpdateHeight(float new_y_value) {
+ Vector3 offset = Vector3(0, new_y_value - eye()[1], 0);
+ base_head_ = Matrix4::Translation(-offset) * base_head_;
+}
+
+
+
+} // end namespace
+
diff --git a/dev/MinGfx/src/craft_cam.h b/dev/MinGfx/src/craft_cam.h
new file mode 100644
index 0000000..bdfcd7e
--- /dev/null
+++ b/dev/MinGfx/src/craft_cam.h
@@ -0,0 +1,219 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_CRAFT_CAM_H_
+#define SRC_CRAFT_CAM_H_
+
+#include "point2.h"
+#include "matrix4.h"
+#include "vector2.h"
+
+
+namespace mingfx {
+
+
+/** This implements a user interface for controlling the camera with the mouse.
+ This interface is appropriate for "first person" camera control, as in games
+ like Minecraft.
+
+ Use the arrow keys or A,S,W,Z keys to move around in the virtual world.
+ UP/DOWN and W/Z move forward and back. LEFT/RIGHT or A/S rotate your body
+ to face left or right. You can rotate and tilt your head to look
+ left/right/up/down by moving the mouse. In Minecraft, that movement happens
+ whenever you move the mouse, regardless of whether you are holding down a
+ mouse button, but in some games you want to hold the camera still while you
+ use the mouse to draw on the screen or do something else. It's possible to
+ use this interface both ways by calling the MouseMove() function either every
+ time the mouse moves, or only when the mouse is in a dragging mode.
+
+ Example usage:
+ ~~~
+ // Create a global or member variable in your MyGraphicsApp class:
+ CraftCam cam_;
+
+
+ // If you want to always rotate the view with the mouse, use this:
+ void MyGraphicsApp::OnMouseMove(const Point2 &pos, const Vector2 &delta) {
+ Vector2 delta_ndc = PixelsToNormalizedDeviceCoords(pos);
+ cam_.OnMouseMove(delta_ndc);
+ }
+
+ // Alternatively, if you want to only rotate the view when the mouse button is
+ // held down, use this instead. Call cam_.OnMouseMove() in either one function
+ // or the other, but not both!
+ // void MyGraphicsApp::OnLeftMouseDrag(const Point2 &pos, const Vector2 &delta) {
+ // Vector2 delta_ndc = PixelsToNormalizedDeviceCoords(pos);
+ // cam_.OnMouseMove(delta_ndc);
+ // }
+
+ // This tells the camera to simulate walking based on the keyboard keys currently
+ // pressed. You need to pass a pointer to the underlying GLFW window created by
+ // GraphicsApp.
+ void MyGraphicsApp::UpdateSimulation(double dt) {
+ cam_.UpdateSimulation(dt, window());
+ }
+
+ void MyGraphicsApp::InitOpenGL() {
+ cam_.set_view_matrix(Matrix4::lookAt(Point3(0,2,2), Point3(0,2,0), Vector3(0,1,0)););
+ }
+
+ void MyGraphicsApp::DrawOpenGL() {
+ // draw your scene using the view matrix from the camera
+ Matrix4 proj_matrix = Matrix4::perspective(60, aspect_ratio(), 1, 200);
+ Matrix4 view_matrix = cam_.view_matrix();
+ Matrix4 model_matrix = Matrix4::RotateY(to_radians(45.0));
+ quick_shapes.DrawCube(model_matrix, view_matirx, proj_matrix, Color(1,1,1));
+ }
+ ~~~
+ */
+class CraftCam {
+public:
+
+ /// Creates a CraftCam object with an initial view matrix = identity.
+ CraftCam();
+
+ /// Creates a CraftCam object with the supplied initial view matrix.
+ CraftCam(const Matrix4 &initial_view_matrix);
+
+ virtual ~CraftCam();
+
+
+ // To make the interaction work, the following set of functions need to be
+ // called from your GraphicsApp or whatever main application class you use
+ // to receive user input events and a draw callback.
+
+ /// Call this from your app's UpdateSimulation() method. This tells the
+ /// camera to simulate walking based on the keyboard keys currently pressed.
+ /// You need to pass a pointer to the underlying GLFW window created by
+ /// GraphicsApp. Example:
+ /// ~~~
+ /// void MyGraphicsApp::UpdateSimulation(double dt) {
+ /// cam_.UpdateSimulation(dt, window());
+ /// }
+ /// ~~~
+ void UpdateSimulation(double dt, GLFWwindow *window_ptr);
+
+
+ /// Call this from your app's OnMouseMove() or On*MouseDrag() method. Use
+ /// OnMouseMove() if you want to always rotate the view with the mouse.
+ /// Remember to convert the mouse coordinates (usually reported by window
+ /// managers in pixels) into normalized device coordinates:
+ /// ~~~
+ /// void MyGraphicsApp::OnMouseMove(const Point2 &pos, const Vector2 &delta) {
+ /// Vector2 delta_ndc = PixelsToNormalizedDeviceCoords(pos);
+ /// cam_.OnMouseMove(delta_ndc);
+ /// }
+ /// ~~~
+ /// Alternatively, if you want to only rotate the view when the mouse button is
+ /// held down, use On*MouseDrag() instead:
+ /// ~~~
+ /// void MyGraphicsApp::OnLeftMouseDrag(const Point2 &pos, const Vector2 &delta) {
+ /// Vector2 delta_ndc = PixelsToNormalizedDeviceCoords(pos);
+ /// cam_.OnMouseMove(delta_ndc);
+ /// }
+ /// ~~~
+ void OnMouseMove(const Vector2 &normalized_mouse_delta);
+
+
+ /// Access the camera view matrix created by the CraftCam interactions via
+ /// this method and use it to draw the geometry in your scence.
+ /// For example, within GraphicsApp::DrawUsingOpenGL(), you might have:
+ /// ~~~
+ /// Matrix4 P = Matrix4::Perspective(30, aspect_ratio(), 1, 20);
+ /// Matrix4 V = cam.view_matrix();
+ /// Matrix4 M = Matrix4::RotateY(GfxMath::ToRadians(45.0));
+ /// quick_shapes.DrawCube(M, V, P, Color(1,1,1));
+ /// ~~~
+ Matrix4 view_matrix();
+
+
+ /// Returns the "eye" point (i.e., focal point) of the camera in world
+ /// space coordinates.
+ Point3 eye();
+
+ /// Returns the look direction (i.e., -Z axis of the camera matrix) in world
+ /// space coordinates.
+ Vector3 look();
+
+
+ /// Sets the y value of the camera (i.e., the height). If you want to set
+ /// the entire view matrix, then use set_view_matrix(), but if you just want
+ /// to update the height, e.g., while walking around a bumpy terrain, then
+ /// use this.
+ void UpdateHeight(float new_y_value);
+
+
+ // -------------
+
+ /// This is not required, but you may use this if you wish to set an initial
+ /// view matrix or reset the view matrix
+ void set_view_matrix(Matrix4 view_matrix);
+
+
+ /// This is the scale factor used to speed up / slow down forward/backward
+ /// translation when walking for the UP / DOWN keys. It defaults to 1.0,
+ /// smaller values will make the camera walk slower, larger values will
+ /// speed it up.
+ float translation_scale();
+
+ /// This is the scale factor used to speed up / slow down forward/backward
+ /// translation when walking for the UP / DOWN keys. It defaults to 1.0,
+ /// smaller values will make the camera walk slower, larger values will
+ /// speed it up.
+ void set_translation_scale(float s);
+
+ /// This is the scale factor used to speed up / slow down left/right
+ /// rotation when walking for the LEFT / RIGHT keys. It defaults to 1.0,
+ /// smaller values will make the camera turn slower, larger values will
+ /// speed it up.
+ float rotation_scale();
+
+ /// This is the scale factor used to speed up / slow down left/right
+ /// rotation when walking for the LEFT / RIGHT keys. It defaults to 1.0,
+ /// smaller values will make the camera turn slower, larger values will
+ /// speed it up.
+ void set_rotation_scale(float s);
+
+ /// This is the scale factor used to speed up / slow down looking around
+ /// when moving the head with the mouse. It defaults to 1.0, smaller values
+ /// will make the camera turn slower, larger values will speed it up.
+ float look_scale();
+
+ /// This is the scale factor used to speed up / slow down looking around
+ /// when moving the head with the mouse. It defaults to 1.0, smaller values
+ /// will make the camera turn slower, larger values will speed it up.
+ void set_look_scale(float s);
+
+private:
+
+ void WalkForward(double dt);
+ void WalkBackward(double dt);
+ void RotateLeft(double dt);
+ void RotateRight(double dt);
+ void LookWithMouse(const Vector2 &mouse_delta);
+
+ float t_scale_;
+ float r_scale_;
+ float l_scale_;
+ float yaw_;
+ float pitch_;
+ Matrix4 base_head_;
+ Matrix4 added_rot_;
+};
+
+
+} // end namespace
+
+#endif
+
+
diff --git a/dev/MinGfx/src/default_shader.cc b/dev/MinGfx/src/default_shader.cc
new file mode 100644
index 0000000..63331b8
--- /dev/null
+++ b/dev/MinGfx/src/default_shader.cc
@@ -0,0 +1,168 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "default_shader.h"
+
+#include "platform.h"
+
+
+namespace mingfx {
+
+ DefaultShader::DefaultShader(bool addDefaultLight) {
+ for (int i = 0; i < MAX_LIGHTS; i++) {
+ lightPositions_[3 * i + 0] = 0.0f;
+ lightPositions_[3 * i + 1] = 0.0f;
+ lightPositions_[3 * i + 2] = 0.0f;
+
+ lightIas_[4 * i + 0] = 0.0f;
+ lightIas_[4 * i + 1] = 0.0f;
+ lightIas_[4 * i + 2] = 0.0f;
+ lightIas_[4 * i + 3] = 0.0f;
+
+ lightIds_[4 * i + 0] = 0.0f;
+ lightIds_[4 * i + 1] = 0.0f;
+ lightIds_[4 * i + 2] = 0.0f;
+ lightIds_[4 * i + 3] = 0.0f;
+
+ lightIss_[4 * i + 0] = 0.0f;
+ lightIss_[4 * i + 1] = 0.0f;
+ lightIss_[4 * i + 2] = 0.0f;
+ lightIss_[4 * i + 3] = 0.0f;
+ }
+
+ if (addDefaultLight) {
+ AddLight(LightProperties());
+ }
+ }
+
+ DefaultShader::~DefaultShader() {
+
+ }
+
+ void DefaultShader::AddLight(LightProperties light) {
+ lights_.push_back(light);
+ update_light_arrays();
+ }
+
+ void DefaultShader::SetLight(int i, LightProperties light) {
+ lights_[i] = light;
+ update_light_arrays();
+ }
+
+ void DefaultShader::update_light_arrays() {
+ DefaultShader::LightProperties defaultlight;
+
+ for (int i=0; i<MAX_LIGHTS; i++) {
+ DefaultShader::LightProperties *light;
+ if (i < lights_.size()) {
+ light = &lights_[i];
+ }
+ else {
+ light = &defaultlight;
+ }
+
+ lightPositions_[3*i + 0] = light->position[0];
+ lightPositions_[3*i + 1] = light->position[1];
+ lightPositions_[3*i + 2] = light->position[2];
+
+ lightIas_[4*i + 0] = light->ambient_intensity[0];
+ lightIas_[4*i + 1] = light->ambient_intensity[1];
+ lightIas_[4*i + 2] = light->ambient_intensity[2];
+ lightIas_[4*i + 3] = light->ambient_intensity[3];
+
+ lightIds_[4*i + 0] = light->diffuse_intensity[0];
+ lightIds_[4*i + 1] = light->diffuse_intensity[1];
+ lightIds_[4*i + 2] = light->diffuse_intensity[2];
+ lightIds_[4*i + 3] = light->diffuse_intensity[3];
+
+ lightIss_[4*i + 0] = light->specular_intensity[0];
+ lightIss_[4*i + 1] = light->specular_intensity[1];
+ lightIss_[4*i + 2] = light->specular_intensity[2];
+ lightIss_[4*i + 3] = light->specular_intensity[3];
+ }
+ }
+
+
+ int DefaultShader::num_lights() {
+ return (int)lights_.size();
+ }
+
+ DefaultShader::LightProperties DefaultShader::light(int i) {
+ return lights_[i];
+ }
+
+
+ void DefaultShader::Init() {
+ phongShader_.AddVertexShaderFromFile(Platform::FindMinGfxShaderFile("default.vert"));
+ phongShader_.AddFragmentShaderFromFile(Platform::FindMinGfxShaderFile("default.frag"));
+ phongShader_.LinkProgram();
+ }
+
+
+
+ void DefaultShader::Draw(const Matrix4 &model, const Matrix4 &view, const Matrix4 &projection,
+ Mesh *mesh, const MaterialProperties &material)
+ {
+ UseProgram(model, view, projection, material);
+
+ // Draw the mesh using the shader program
+ mesh->Draw();
+
+ StopProgram();
+ }
+
+
+ void DefaultShader::UseProgram(const Matrix4 &model, const Matrix4 &view, const Matrix4 &projection,
+ const MaterialProperties &material)
+ {
+ if (!phongShader_.initialized()) {
+ Init();
+ }
+
+ Matrix4 normalMatrix = (view*model).Inverse().Transpose();
+
+ for (int i=0; i<lights_.size(); i++) {
+ Point3 light_in_eye_space = view * lights_[i].position;
+ lightPositions_[3*i + 0] = light_in_eye_space[0];
+ lightPositions_[3*i + 1] = light_in_eye_space[1];
+ lightPositions_[3*i + 2] = light_in_eye_space[2];
+ }
+
+ // Activate the shader program
+ phongShader_.UseProgram();
+
+ // Pass uniforms and textures from C++ to the GPU Shader Program
+ phongShader_.SetUniform("ModelMatrix", model);
+ phongShader_.SetUniform("ViewMatrix", view);
+ phongShader_.SetUniform("ProjectionMatrix", projection);
+ phongShader_.SetUniform("NormalMatrix", normalMatrix);
+
+ phongShader_.SetUniform("NumLights", (int)lights_.size());
+ phongShader_.SetUniformArray3("LightPositions", lightPositions_, MAX_LIGHTS);
+ phongShader_.SetUniformArray4("LightIntensitiesAmbient", lightIas_, MAX_LIGHTS);
+ phongShader_.SetUniformArray4("LightIntensitiesDiffuse", lightIds_, MAX_LIGHTS);
+ phongShader_.SetUniformArray4("LightIntensitiesSpecular", lightIss_, MAX_LIGHTS);
+
+ phongShader_.SetUniform("MatReflectanceAmbient", material.ambient_reflectance);
+ phongShader_.SetUniform("MatReflectanceDiffuse", material.diffuse_reflectance);
+ phongShader_.SetUniform("MatReflectanceSpecular", material.specular_reflectance);
+ phongShader_.SetUniform("MatReflectanceShininess", material.shinniness);
+ phongShader_.SetUniform("UseSurfaceTexture", material.surface_texture.initialized());
+ if (material.surface_texture.initialized()) {
+ phongShader_.BindTexture("SurfaceTexture", material.surface_texture);
+ }
+ }
+
+
+ void DefaultShader::StopProgram() {
+ // Deactivate the shader program
+ phongShader_.StopProgram();
+ }
+
+
+
+} // end namespace
+
diff --git a/dev/MinGfx/src/default_shader.h b/dev/MinGfx/src/default_shader.h
new file mode 100644
index 0000000..677acae
--- /dev/null
+++ b/dev/MinGfx/src/default_shader.h
@@ -0,0 +1,168 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_DEFAULT_SHADER_H_
+#define SRC_DEFAULT_SHADER_H_
+
+#include "color.h"
+#include "point3.h"
+#include "shader_program.h"
+#include "texture2d.h"
+#include "vector3.h"
+#include "matrix4.h"
+#include "mesh.h"
+
+
+
+namespace mingfx {
+
+/** A simple GLSL shader for textured per-fragment Phong shading with multiple
+ light sources. This can be used to draw 3D models stored in a mingfx::Mesh
+ data structure or you can use it with your own geometry data structures.
+ Lighting properties are stored within the class itself since these are considered
+ part of the shading model. Material properties are considered properties of the
+ meshes or other materials you wish to draw so these are stored outside of the
+ class and passed into the Draw() or UseProgram() functions.
+
+ An example of using DefaultShader to render a mesh:
+ ~~~
+ DefaultShader phong_shader;
+ Mesh teapot;
+ DefaultShader::MaterialProperties teapot_material;
+
+ void Init() {
+ // initialize the shader
+ DefaultShader::LightProperties red_light;
+ red_light.position = Point3(-10, 5, 5);
+ red_light.diffuseIntensity = Color(1,0,0);
+ phong_shader.AddLight(red_light);
+
+ // initialize the mesh
+ teapot.LoadFromOBJ(Platform::FindMinGfxDataFile("teapot.obj"));
+ }
+
+ void DrawUsingOpenGL() {
+ Matrix4 M;
+ Matrix4 V = Matrix4::LookAt(Point3(0,0,3), Point3(0,0,0), Vector3(0,1,0));
+ Matrix4 P = Matrix4::Perspective(60.0, aspect_ratio(), 0.1, 10.0);
+ phong_shader.Draw(M, V, P, teapot, teapot_material);
+ }
+ ~~~
+ */
+class DefaultShader {
+public:
+
+ /// If changed, this needs to also be changed in the glsl shader code
+ static const unsigned int MAX_LIGHTS = 10;
+
+
+ /// Small data structure to hold properties of the material to be lit
+ class MaterialProperties {
+ public:
+ Color ambient_reflectance;
+ Color diffuse_reflectance;
+ Color specular_reflectance;
+ float shinniness;
+ Texture2D surface_texture;
+ // eventually, this might include a normal map, etc.
+
+ // defaults
+ MaterialProperties() :
+ ambient_reflectance(0.25f, 0.25f, 0.25f),
+ diffuse_reflectance(0.6f, 0.6f, 0.6f),
+ specular_reflectance(0.4f, 0.4f, 0.4f),
+ shinniness(20.0f) {}
+ };
+
+ /// Small data structure to hold per-light properties
+ class LightProperties {
+ public:
+ Point3 position;
+ Color ambient_intensity;
+ Color diffuse_intensity;
+ Color specular_intensity;
+
+ // defaults
+ LightProperties() :
+ position(10.0f, 10.0f, 10.0f),
+ ambient_intensity(0.25f, 0.25f, 0.25f),
+ diffuse_intensity(0.6f, 0.6f, 0.6f),
+ specular_intensity(0.6f, 0.6f, 0.6f) {}
+ };
+
+ /// The constructor defaults to adding a single white light to the scene at
+ /// (10,10,10). Change this by passing it 'false'. The constructor does
+ /// not load and compile the shader right away. This is done inside Init().
+ DefaultShader(bool add_default_light=true);
+
+ virtual ~DefaultShader();
+
+ /// Multiple lights are supported, this adds one to the end of the list.
+ /// Up to MAX_LIGHTS can be added.
+ void AddLight(LightProperties light);
+
+ /// Changes the properties for a light that was already added.
+ void SetLight(int i, LightProperties light);
+
+
+ /// This loads vertex and fragment shaders from files, compiles them, and
+ /// links them. So, it must be called from within an active OpenGL context,
+ /// for example, from within GraphicsApp::Init() or GraphicsApp::DrawUsingOpenGL().
+ /// If you call Draw() before calling Init(), then Init() will be called as
+ /// the first step within Draw(). So, if you do not mind a slowdown on the
+ /// very first frame of your program, it is fine to skip calling Init().
+ void Init();
+
+ /// This starts the shader and sets its uniform variables based upon the
+ /// current set of lights, the material properties passed in, and the
+ /// model, view, and projection matrices. Then, it calls mesh->Draw().
+ /// After drawing, it disables the shader.
+ void Draw(const Matrix4 &model, const Matrix4 &view, const Matrix4 &projection,
+ Mesh *mesh, const MaterialProperties &material);
+
+
+ /// Only needed if you do not want to draw a Mesh.
+ /// This does all of the same setup for drawing that the Draw() function does
+ /// and then it returns so that you may draw your own geometry however you want.
+ /// After doing your draw must call StopProgram() to turn off the shader.
+ void UseProgram(const Matrix4 &model, const Matrix4 &view, const Matrix4 &projection,
+ const MaterialProperties &material);
+
+ /// Only needed if you do not want to draw a Mesh. Call this after UseProgram()
+ /// and after drawing your geometry to turn off the shader.
+ void StopProgram();
+
+
+ int num_lights();
+
+ LightProperties light(int i);
+
+
+private:
+
+ std::vector<LightProperties> lights_;
+
+ // cached raw float arrays store data to send directly to the gpu
+ // GLSL requires fixed size arrays for these
+ float lightPositions_[3*MAX_LIGHTS];
+ float lightIas_[4*MAX_LIGHTS];
+ float lightIds_[4*MAX_LIGHTS];
+ float lightIss_[4*MAX_LIGHTS];
+ void update_light_arrays();
+
+ ShaderProgram phongShader_;
+};
+
+} // end namespace
+
+#endif \ No newline at end of file
diff --git a/dev/MinGfx/src/gfxmath.cc b/dev/MinGfx/src/gfxmath.cc
new file mode 100644
index 0000000..11180e6
--- /dev/null
+++ b/dev/MinGfx/src/gfxmath.cc
@@ -0,0 +1,82 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "gfxmath.h"
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <algorithm>
+
+#include "ray.h"
+
+
+namespace mingfx {
+
+const float GfxMath::PI = 3.14159265359f;
+const float GfxMath::TWO_PI = 6.28318530718f;
+const float GfxMath::HALF_PI = 1.57079632679f;
+
+
+float GfxMath::Clamp(float x, float a, float b) {
+ return std::min(std::max(x, a), b);
+}
+
+float GfxMath::ToRadians(float degrees) {
+ return degrees * GfxMath::PI / 180.0f;
+}
+
+float GfxMath::ToDegrees(float radians) {
+ return radians * 180.0f / GfxMath::PI;
+}
+
+Vector3 GfxMath::ToRadians(Vector3 degrees) {
+ return Vector3(ToRadians(degrees[0]), ToRadians(degrees[1]), ToRadians(degrees[2]));
+}
+
+Vector3 GfxMath::ToDegrees(Vector3 radians) {
+ return Vector3(ToDegrees(radians[0]), ToDegrees(radians[1]), ToDegrees(radians[2]));
+}
+
+float GfxMath::Lerp(float a, float b, float alpha) {
+ return (1.0f-alpha)*a + alpha*b;
+}
+
+int GfxMath::iLerp(int a, int b, float alpha) {
+ return (int)std::round((1.0f-alpha)*(float)a + alpha*(float)b);
+}
+
+Point3 GfxMath::ScreenToNearPlane(const Matrix4 &V, const Matrix4 &P, const Point2 &ndcPoint) {
+ Matrix4 filmPtToWorld = (P*V).Inverse();
+ return filmPtToWorld * Point3(ndcPoint[0], ndcPoint[1], -1.0);
+}
+
+
+Point3 GfxMath::ScreenToWorld(const Matrix4 &V, const Matrix4 &P, const Point2 &ndcPoint, float zValue) {
+ Matrix4 filmPtToWorld = (P*V).Inverse();
+ float zneg1topos1 = zValue*2.0f - 1.0f;
+ return filmPtToWorld * Point3(ndcPoint[0], ndcPoint[1], zneg1topos1);
+}
+
+
+Point3 GfxMath::ScreenToDepthPlane(const Matrix4 &V, const Matrix4 &P, const Point2 &ndcPoint, float planeDepth) {
+ Point3 pNear = ScreenToNearPlane(V, P, ndcPoint);
+
+ Matrix4 camMat = V.Inverse();
+ Point3 eye = camMat.ColumnToPoint3(3);
+ Vector3 look = -camMat.ColumnToVector3(2);
+
+ Ray r(eye, pNear - eye);
+
+ Point3 p3D;
+ float t;
+ if (!r.IntersectPlane(eye + planeDepth*look, -look, &t, &p3D)) {
+ std::cerr << "filmplane2D_to_plane3D() error -- no intersection found!" << std::endl;
+ }
+ return p3D;
+}
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/gfxmath.h b/dev/MinGfx/src/gfxmath.h
new file mode 100644
index 0000000..09a3a1d
--- /dev/null
+++ b/dev/MinGfx/src/gfxmath.h
@@ -0,0 +1,81 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_GFXMATH_H_
+#define SRC_GFXMATH_H_
+
+#include "point2.h"
+#include "point3.h"
+#include "vector3.h"
+#include "matrix4.h"
+
+namespace mingfx {
+
+
+/** This class holds a variety of static math functions that are useful to have
+ defined with creating graphics programs.
+ */
+class GfxMath {
+public:
+
+ /// Returns a if x is less than a and b if x is greater than b.
+ static float Clamp(float x, float a, float b);
+
+ static float ToRadians(float degrees);
+
+ static float ToDegrees(float radians);
+
+ static Vector3 ToRadians(Vector3 degrees);
+
+ static Vector3 ToDegrees(Vector3 radians);
+
+ static float Lerp(float a, float b, float alpha);
+
+ static int iLerp(int a, int b, float alpha);
+
+ /// Converts a 2D point on the filmplane represented in Normalized Device
+ /// Coorindates, which means (-1,1) for the top left corner of the screen and
+ /// (1,-1) for the bottom right corner, to a 3D point that lies on the camera's
+ /// near plane. Useful for converting mouse coordinates into a 3D point.
+ /// Remember that this uses NORMALIZED device coordinates for the screenPt,
+ /// not pixels. GraphicsApp and most other graphics engines report mouse move
+ /// events in pixels, so you need to convert these to normalized device coordinates
+ /// first. If you are using GraphicsApp, you can do this with:
+ /// Point2 normPos = graphicsApp->pixels_to_normalized_coordinates(mousePos);
+ static Point3 ScreenToNearPlane(const Matrix4 &viewMatrix, const Matrix4 &projMatrix, const Point2 &normalizedScreenPt);
+
+ /// Similar to filmplane2D_to_nearplane3D() but here rather than using the
+ /// nearplane, you specify the depth of the plane to use as a distance away
+ /// from the camera's focal point.
+ static Point3 ScreenToDepthPlane(const Matrix4 &viewMatrix, const Matrix4 &projMatrix, const Point2 &normalizedScreenPt, float planeDepth);
+
+ /// Converts a 2D point on the filmplane represented in Normalized Device
+ /// Coorindates, which means (-1,1) for the top left corner of the screen and
+ /// (1,-1) for the bottom right corner, to a 3D point in the world. The depth
+ /// buffer value under the pixel must be supplied. If you are using GraphicsApp,
+ /// you can use the mouse pos in pixels to get the required arguments like this:
+ /// Point2 normPos = graphicsApp->pixels_to_normalized_coordinates(mousePos);
+ /// float normZ = graphicsApp->z_value_at_pixel(mousePos);
+ static Point3 ScreenToWorld(const Matrix4 &viewMatrix, const Matrix4 &projMatrix, const Point2 &normalizedScreenPt, float normalizedZ);
+
+
+ static const float PI;
+ static const float TWO_PI;
+ static const float HALF_PI;
+};
+
+
+
+} // end namespace
+
+#endif \ No newline at end of file
diff --git a/dev/MinGfx/src/graphics_app.cc b/dev/MinGfx/src/graphics_app.cc
new file mode 100644
index 0000000..57405f5
--- /dev/null
+++ b/dev/MinGfx/src/graphics_app.cc
@@ -0,0 +1,467 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "graphics_app.h"
+
+
+namespace mingfx {
+
+
+
+GraphicsApp::GraphicsApp(int width, int height, const std::string &caption) :
+ graphicsInitialized_(false), width_(width), height_(height), caption_(caption), lastDrawT_(0.0),
+ leftDown_(false), middleDown_(false), rightDown_(false), screen_(NULL), window_(NULL)
+{
+}
+
+GraphicsApp::~GraphicsApp() {
+}
+
+void GraphicsApp::InitGraphicsContext() {
+
+ glfwInit();
+
+ glfwSetTime(0);
+
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+
+ glfwWindowHint(GLFW_SAMPLES, 0);
+ glfwWindowHint(GLFW_RED_BITS, 8);
+ glfwWindowHint(GLFW_GREEN_BITS, 8);
+ glfwWindowHint(GLFW_BLUE_BITS, 8);
+ glfwWindowHint(GLFW_ALPHA_BITS, 8);
+ glfwWindowHint(GLFW_STENCIL_BITS, 8);
+ glfwWindowHint(GLFW_DEPTH_BITS, 24);
+ glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
+
+
+ // on OSX, glfwCreateWindow bombs if we pass caption_.c_str() in for the 3rd
+ // parameter perhaps because it's const. so, copying to a tmp char array here.
+ char *title = new char[caption_.size() + 1];
+ for (int i = 0; i < caption_.size(); i++) {
+ title[i] = caption_[i];
+ }
+ title[caption_.size()] = '\0';
+ std::cout << caption_ << std::endl;
+
+ // Create a GLFWwindow object
+ window_ = glfwCreateWindow(width_, height_, title, NULL, NULL);
+ if (window_ == nullptr) {
+ std::cerr << "Failed to create GLFW window" << std::endl;
+ glfwTerminate();
+ exit(-1);
+ }
+ glfwMakeContextCurrent(window_);
+ glfwSetWindowUserPointer(window_, this);
+
+ // cleanup tmp title hack
+ delete [] title;
+
+
+#if defined(NANOGUI_GLAD)
+ if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress))
+ throw std::runtime_error("Could not initialize GLAD!");
+ glGetError(); // pull and ignore unhandled errors like GL_INVALID_ENUM
+#endif
+
+ glClearColor(0.2f, 0.25f, 0.3f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ // Create a nanogui screen and pass the glfw pointer to initialize
+ screen_ = new nanogui::Screen();
+ screen_->initialize(window_, true);
+
+ glfwGetFramebufferSize(window_, &width_, &height_);
+ glViewport(0, 0, width_, height_);
+ glfwSwapInterval(0);
+ glfwSwapBuffers(window_);
+
+ screen_->setVisible(true);
+ screen_->performLayout();
+
+ glfwSetCursorPosCallback(window_,
+ [](GLFWwindow *window, double x, double y) {
+ GraphicsApp *app = (GraphicsApp*)glfwGetWindowUserPointer(window);
+ app->cursor_pos_glfw_cb(x, y);
+ }
+ );
+
+ glfwSetMouseButtonCallback(window_,
+ [](GLFWwindow *window, int button, int action, int modifiers) {
+ GraphicsApp *app = (GraphicsApp*)glfwGetWindowUserPointer(window);
+ app->mouse_button_glfw_cb(button, action, modifiers);
+ }
+ );
+
+ glfwSetKeyCallback(window_,
+ [](GLFWwindow *window, int key, int scancode, int action, int mods) {
+ GraphicsApp *app = (GraphicsApp*)glfwGetWindowUserPointer(window);
+ app->key_glfw_cb(key, scancode, action, mods);
+ }
+ );
+
+ glfwSetCharCallback(window_,
+ [](GLFWwindow *window, unsigned int codepoint) {
+ GraphicsApp *app = (GraphicsApp*)glfwGetWindowUserPointer(window);
+ app->char_glfw_cb(codepoint);
+ }
+ );
+
+ glfwSetDropCallback(window_,
+ [](GLFWwindow *window, int count, const char **filenames) {
+ GraphicsApp *app = (GraphicsApp*)glfwGetWindowUserPointer(window);
+ app->drop_glfw_cb(count, filenames);
+ }
+ );
+
+ glfwSetScrollCallback(window_,
+ [](GLFWwindow *window, double x, double y) {
+ GraphicsApp *app = (GraphicsApp*)glfwGetWindowUserPointer(window);
+ app->scroll_glfw_cb(x, y);
+ }
+ );
+
+ glfwSetFramebufferSizeCallback(window_,
+ [](GLFWwindow *window, int width, int height) {
+ GraphicsApp *app = (GraphicsApp*)glfwGetWindowUserPointer(window);
+ app->resize_glfw_cb(width, height);
+ }
+ );
+
+ graphicsInitialized_ = true;
+ }
+
+
+
+void GraphicsApp::Run() {
+
+ if (!graphicsInitialized_) {
+ InitGraphicsContext();
+ }
+
+ InitNanoGUI();
+
+ InitOpenGL();
+
+ // Main program loop
+ glfwSetTime(0.0);
+ while (!glfwWindowShouldClose(window_)) {
+
+ // Poll for new user input events and call callbacks
+ glfwPollEvents();
+
+ // Update the simulation, i.e., perform all non-graphics updates that
+ // should happen each frame.
+ double now = glfwGetTime();
+ UpdateSimulation(now-lastDrawT_);
+ lastDrawT_ = now;
+
+ // Clear is handled in this mainloop so that drawing works even for
+ // users who do not want to fill in DrawUsingOpenGL()
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+
+ // NanoGUI sets these to something other than the OpenGL defaults, which
+ // screws up most OpenGL programs, so we need to reset them each frame here.
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glEnable(GL_DEPTH_TEST);
+
+ // Users may fill this in to do raw OpenGL rendering
+ DrawUsingOpenGL();
+
+ // This renders the nanogui widgets created on screen_
+ screen_->drawContents();
+ screen_->drawWidgets();
+
+ // Users may fill this in to do additional 2D rendering with the NanoVG library
+ DrawUsingNanoVG(screen_->nvgContext());
+
+ glfwSwapBuffers(window_);
+ }
+
+ glfwTerminate();
+}
+
+
+
+bool GraphicsApp::cursor_pos_glfw_cb(double x, double y) {
+
+ if (screen_->cursorPosCallbackEvent(x,y)) {
+ // event was handled by nanogui
+ lastMouse_ = Point2((float)x, (float)y);
+ return true;
+ }
+ else {
+ Point2 cur((float)x, (float)y);
+ Vector2 delta = cur - lastMouse_;
+
+ // if no buttons are down, generate a mouse move event
+ if (!leftDown_ && !middleDown_ && !rightDown_) {
+ mouse_move(cur, delta);
+ }
+
+ // if a button is down, generate a corresponding mouse drag event
+ if (leftDown_) {
+ left_mouse_drag(cur, delta);
+ }
+ if (middleDown_) {
+ middle_mouse_drag(cur, delta);
+ }
+ if (rightDown_) {
+ right_mouse_drag(cur, delta);
+ }
+
+ lastMouse_ = cur;
+ return false;
+ }
+}
+
+bool GraphicsApp::mouse_button_glfw_cb(int button, int action, int modifiers) {
+ if (screen_->mouseButtonCallbackEvent(button, action, modifiers)) {
+ return true;
+ }
+ else if (button == GLFW_MOUSE_BUTTON_LEFT) {
+ double x,y;
+ glfwGetCursorPos(window_, &x, &y);
+ if (action == 1) {
+ left_mouse_down(Point2((float)x, (float)y));
+ leftDown_ = true;
+ }
+ else {
+ left_mouse_up(Point2((float)x, (float)y));
+ leftDown_ = false;
+ }
+ return true;
+ }
+ else if (button == GLFW_MOUSE_BUTTON_MIDDLE) {
+ double x,y;
+ glfwGetCursorPos(window_, &x, &y);
+ if (action == 1) {
+ middle_mouse_down(Point2((float)x, (float)y));
+ middleDown_ = true;
+ }
+ else {
+ middle_mouse_up(Point2((float)x, (float)y));
+ middleDown_ = false;
+ }
+ return true;
+ }
+ else if (button == GLFW_MOUSE_BUTTON_RIGHT) {
+ double x,y;
+ glfwGetCursorPos(window_, &x, &y);
+ if (action == 1) {
+ right_mouse_down(Point2((float)x, (float)y));
+ rightDown_ = true;
+ }
+ else {
+ right_mouse_up(Point2((float)x, (float)y));
+ rightDown_ = false;
+ }
+ return true;
+ }
+ return false;
+}
+
+
+bool GraphicsApp::key_glfw_cb(int key, int scancode, int action, int modifiers) {
+ if (screen_->keyCallbackEvent(key, scancode, action, modifiers)) {
+ return true;
+ }
+ else {
+ if (glfwGetKeyName(key, scancode) != NULL) {
+ if (action == GLFW_PRESS) {
+ key_down(glfwGetKeyName(key, scancode), modifiers);
+ }
+ else if (action == GLFW_REPEAT) {
+ key_repeat(glfwGetKeyName(key, scancode), modifiers);
+ }
+ else {
+ key_up(glfwGetKeyName(key, scancode), modifiers);
+ }
+ return true;
+ }
+ else {
+ if (action == GLFW_PRESS) {
+ special_key_down(key, scancode, modifiers);
+ }
+ else if (action == GLFW_REPEAT) {
+ special_key_repeat(key, scancode, modifiers);
+ }
+ else {
+ special_key_up(key, scancode, modifiers);
+ }
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+bool GraphicsApp::char_glfw_cb(unsigned int codepoint) {
+ if (screen_->charCallbackEvent(codepoint)) {
+ return true;
+ }
+ else {
+ // TODO: could add another virtual function to GraphicsApp to
+ // respond to this if needed
+ }
+ return false;
+}
+
+
+bool GraphicsApp::drop_glfw_cb(int count, const char **filenames) {
+ if (screen_->dropCallbackEvent(count, filenames)) {
+ return true;
+ }
+ else {
+ // TODO: could add another virtual function to GraphicsApp to
+ // respond to this if needed
+ }
+ return false;
+}
+
+
+bool GraphicsApp::scroll_glfw_cb(double x, double y) {
+ if (screen_->scrollCallbackEvent(x,y)) {
+ return true;
+ }
+ else {
+ // TODO: could add another virtual function to GraphicsApp to
+ // respond to this if needed
+ }
+ return false;
+}
+
+
+bool GraphicsApp::resize_glfw_cb(int width, int height) {
+ if (screen_->resizeCallbackEvent(width, height)) {
+ return true;
+ }
+ else {
+ // the width and height reported here are the new framebuffer size
+ // we will query/save/report the new window size instead
+ width_ = window_width();
+ height_ = window_height();
+ OnWindowResize(width_, height_);
+ }
+ return false;
+}
+
+
+bool GraphicsApp::IsKeyDown(int key) {
+ return (glfwGetKey(window_, key) == GLFW_PRESS);
+}
+
+bool GraphicsApp::IsLeftMouseDown() {
+ return (glfwGetMouseButton(window_, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS);
+}
+
+
+bool GraphicsApp::IsMiddleMouseDown() {
+ return (glfwGetMouseButton(window_, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS);
+}
+
+
+bool GraphicsApp::IsRightMouseDown() {
+ return (glfwGetMouseButton(window_, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS);
+}
+
+
+
+float GraphicsApp::aspect_ratio() {
+ int width, height;
+ glfwGetFramebufferSize(window_, &width, &height);
+ return (float)width/(float)height;
+}
+
+int GraphicsApp::window_width() {
+ int width, height;
+ glfwGetWindowSize(window_, &width, &height);
+ return width;
+}
+
+int GraphicsApp::framebuffer_width() {
+ int width, height;
+ glfwGetFramebufferSize(window_, &width, &height);
+ return width;
+}
+
+int GraphicsApp::window_height() {
+ int width, height;
+ glfwGetWindowSize(window_, &width, &height);
+ return height;
+}
+
+int GraphicsApp::framebuffer_height() {
+ int width, height;
+ glfwGetFramebufferSize(window_, &width, &height);
+ return height;
+}
+
+Point2 GraphicsApp::PixelsToNormalizedDeviceCoords(const Point2 &pointInPixels) {
+ float x = (pointInPixels[0] / window_width()) * 2.0f - 1.0f;
+ float y = (1.0f - (pointInPixels[1] / window_height())) * 2.0f - 1.0f;
+ return Point2(x,y);
+}
+
+Point2 GraphicsApp::NormalizedDeviceCoordsToPixels(const Point2 &pointInNDC) {
+ float x = 0.5f * (pointInNDC[0] + 1.0f) * window_width();
+ float y = (1.0f - (0.5f * (pointInNDC[1] + 1.0f))) * window_height();
+ return Point2(x,y);
+}
+
+Vector2 GraphicsApp::PixelsToNormalizedDeviceCoords(const Vector2 &vectorInPixels) {
+ float x = (2.0f/window_width()) * vectorInPixels[0];
+ float y = (-2.0f/window_height()) * vectorInPixels[1];
+ return Vector2(x,y);
+}
+
+Vector2 GraphicsApp::NormalizedDeviceCoordsToPixels(const Vector2 &vectorInNDC) {
+ float x = (window_width()/2.0f) * vectorInNDC[0];
+ float y = (-window_height()/2.0f) * vectorInNDC[1];
+ return Vector2(x,y);
+}
+
+float GraphicsApp::ReadZValueAtPixel(const Point2 &pointInPixels, unsigned int whichBuffer) {
+ // scale screen points to framebuffer size, since they are not the same on retina displays
+ float x01 = pointInPixels[0] / window_width();
+ float y01 = pointInPixels[1] / window_height();
+ y01 = 1.0f - y01;
+
+ float x = x01 * (float)framebuffer_width();
+ float y = y01 * (float)framebuffer_height();
+
+ float z;
+ glReadPixels((int)x, (int)y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z);
+ return z;
+}
+
+
+nanogui::Screen* GraphicsApp::screen() {
+ return screen_;
+}
+
+GLFWwindow* GraphicsApp::window() {
+ return window_;
+}
+
+
+void GraphicsApp::ResizeWindow(int new_width, int new_height) {
+ glfwSetWindowSize(window_, new_width, new_height);
+ width_ = new_width;
+ height_ = new_height;
+ OnWindowResize(new_width, new_height);
+}
+
+
+
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/graphics_app.h b/dev/MinGfx/src/graphics_app.h
new file mode 100644
index 0000000..c32be2c
--- /dev/null
+++ b/dev/MinGfx/src/graphics_app.h
@@ -0,0 +1,481 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2017, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+
+#ifndef SRC_GRAPHICS_APP_H_
+#define SRC_GRAPHICS_APP_H_
+
+// disable warnings for this 3rd party code
+#pragma warning ( push, 0 )
+#include <nanogui/nanogui.h>
+#pragma warning ( pop )
+
+#include <iostream>
+
+#include "point2.h"
+#include "vector2.h"
+
+/** Namespace for the MinGfx Toolkit */
+namespace mingfx {
+
+
+/** This is the main application base class for the MinGfx Toolkit.
+
+ _Create a Subclass:_
+
+ To create your own graphics application, you should create a subclass of GraphicsApp
+ and then override some key functions:
+
+ 1. User Input: To get input from the keyboard and mouse, override OnMouseMove() and/or the other On...() functions.
+
+ 2. Drawing Graphics: To draw graphics override one or more of the Draw*() functions.
+
+ - DrawUsingNanoVG() is the right place to make 2D drawing calls using the nanovg library.
+
+ - DrawUsingOpenGL() is the right place to make 2D or 3D drawing calls using OpenGL. This includes drawing using the Mesh, QuickShapes, DefaultShader, ShaderProgram, and all other MinGfx classes since these are all based on OpenGL.
+
+ - InitNanoGUI() is the right place to create nanogui windows to add a 2D user interface to your app.
+
+ - InitOpenGL() is the right place to load textures, meshes, shaders, and other graphics objects that can only be created after the OpenGL context exists.
+
+ 3. Physics, Animation, AI, etc.: Override the UpdateSimulation() function to do other non-graphics calculations required by your program. This is called automatically once per frame.
+
+ Keep in mind that internally the app uses a rendering loop that looks something like this:
+ ~~~
+ InitNanoGUI(); // your hook for initializing NanoGUI widgets
+ InitOpenGL(); // your hook for initializing OpenGL graphics
+ while (!program_ready_to_close) {
+ // user input
+ internal_get_input_events_from_operating_system();
+ OnMouseMove(); // your hook for processing input
+ On*(); // all other event callbacks -- your hook for processing input
+
+ // phyics, etc.
+ UpdateSimulation(); // your hook for physics, animation, AI, etc.
+
+ // draw graphics
+ internal_render_gui_elements_using_nanogui();
+ DrawUsingNanoVG(); // your hook for drawing 2D vector graphics
+ DrawUsingOpenGL(); // your hook for 2D/3D rendering with OpenGL
+ }
+ ~~~
+
+ _A Complete Example with GUI Widgets_
+
+ If you wish to add some buttons, sliders, etc. in your application, you can do this inside GraphicsApp by accessing the NanoGUI library. You will need to pass NanoGUI a nanogui::screen object, which you can get from the screen() function. NanoGui setup should be done in the constructor, like this:
+ ~~~
+ #include <mingfx.h>
+ using namespace mingfx;
+
+ class MyApp : public GraphcisApp {
+ public:
+ MyApp() : GraphicsApp(1024,768, "My Amazing App") {
+ }
+
+ virtual ~MyApp() {}
+
+ void InitNanoGUI() {
+ // Setup the GUI window
+ nanogui::Window *window = new nanogui::Window(screen(), "My GUI Panel");
+ window->setPosition(Eigen::Vector2i(10, 10));
+ window->setSize(Eigen::Vector2i(400,200));
+ window->setLayout(new nanogui::GroupLayout());
+
+ nanogui::Button pause_btn = new nanogui::Button(window, "Pause");
+ pause_btn->setCallback(std::bind(&MyApp::OnPauseBtnPressed, this));
+ pause_btn->setTooltip("Toggle playback.");
+
+ screen()->performLayout();
+ }
+
+ void InitOpenGL() {
+ glClearColor(0.0, 0.0, 0.0, 1);
+ }
+
+ // this callback is for the nanogui pause_btn defined above
+ void OnPauseBtnPressed() {
+ std::cout << "Pause pressed." << std::endl;
+ }
+
+ // this callback is built into the base GraphicsApp class
+ void OnMouseMove(const Point2 &pos, const Vector2 &delta) {
+ std::cout << "Mouse moved to " << pos << std::endl;
+ }
+
+ void DrawUsingOpenGL() {
+ Matrix4 model = Matrix4::Translation(Vector3(-1,0,0)) * Matrix4::Scale(Vector3(0.5, 0.5, 0.5));
+ Matrix4 view = Matrix4::LookAt(Point3(0,0,3), Point3(0,0,0), Vector3(0,1,0));
+ Matrix4 proj = Matrix4::Perspective(60.0, aspect_ratio(), 0.1, 10.0);
+ quick_shapes_.DrawCube(model, view, proj, Color(1,1,1));
+ }
+
+ private:
+ QuickShapes quick_shapes_;
+ };
+
+
+ int main(int argc, const char *argv[]) {
+ MyApp app;
+ app.Run();
+ return 0;
+ }
+ ~~~
+
+ */
+class GraphicsApp {
+public:
+
+ /** \brief Constructs a new app but does not yet run it.
+
+ \param width The width of the client area of the window in pixels.
+ \param height The height of the client area of the window in pixels.
+ \param caption The caption for the window's title bar.
+ */
+ GraphicsApp(int width, int height, const std::string &caption);
+
+
+ /// The destructor will shutdown the graphics system and window
+ virtual ~GraphicsApp();
+
+
+ // Callback methods -- override these and fill in to respond to user
+ // input events.
+
+ /** If the mouse has moved in the past frame and no mouse buttons are currently
+ pressed, then this callback function will be called to report the new position
+ of the mouse to you.
+
+ \param pos This is the current position of the mouse in pixels, where (0,0)
+ is at the top left corner of the screen and (window_width(), window_height())
+ is the bottom right corner.
+
+ \param delta This is the change in the position of the mouse in pixels since
+ the last frame.
+ */
+ virtual void OnMouseMove(const Point2 &pos, const Vector2 &delta) {}
+
+ /** If the mouse button was pressed down since the last frame, then this function
+ will be called to notify you.
+
+ \param pos This is the current position of the mouse in pixels, where (0,0)
+ is at the top left corner of the screen and (window_width(), window_height())
+ is the bottom right corner.
+ */
+ virtual void OnLeftMouseDown(const Point2 &pos) {}
+
+ /** If the mouse button is held down and the mouse has moved in the past frame
+ then this function will be called to tell you that a "dragging" operation is
+ happening.
+
+ \param pos This is the current position of the mouse in pixels, where (0,0)
+ is at the top left corner of the screen and (window_width(), window_height())
+ is the bottom right corner.
+
+ \param delta This is the change in the position of the mouse in pixels since
+ the last frame.
+ */
+ virtual void OnLeftMouseDrag(const Point2 &pos, const Vector2 &delta) {}
+
+ /** If the mouse button was released since the last frame, then this function
+ will be called to notify you.
+
+ \param pos This is the current position of the mouse in pixels, where (0,0)
+ is at the top left corner of the screen and (window_width()-1, window_height()-1)
+ is the bottom right corner.
+ */
+ virtual void OnLeftMouseUp(const Point2 &pos) {}
+
+
+ /// \copydoc GraphicsApp::OnLeftMouseDown(const Point2 &pos)
+ virtual void OnMiddleMouseDown(const Point2 &pos) {}
+
+ /// \copydoc GraphicsApp::OnLeftMouseDrag(const Point2 &pos, const Vector2 &delta)
+ virtual void OnMiddleMouseDrag(const Point2 &pos, const Vector2 &delta) {}
+
+ /// \copydoc GraphicsApp::OnLeftMouseUp(const Point2 &pos)
+ virtual void OnMiddleMouseUp(const Point2 &pos) {}
+
+
+ /// \copydoc GraphicsApp::OnLeftMouseDown(const Point2 &pos)
+ virtual void OnRightMouseDown(const Point2 &pos) {}
+
+ /// \copydoc GraphicsApp::OnLeftMouseDrag(const Point2 &pos, const Vector2 &delta)
+ virtual void OnRightMouseDrag(const Point2 &pos, const Vector2 &delta) {}
+
+ /// \copydoc GraphicsApp::OnLeftMouseUp(const Point2 &pos)
+ virtual void OnRightMouseUp(const Point2 &pos) {}
+
+
+ /** Transforms a keyboard down event into the actual character typed.
+ \param c The character for the key that was pressed.
+ \param modifiers If any modifiers (Alt, Ctrl, Shift, etc.) were held
+ at the same time, then these are encoded in this int. See the detailed
+ description here: http://www.glfw.org/docs/latest/group__mods.html
+ */
+ virtual void OnKeyDown(const char *c, int modifiers) {}
+
+ /** Transforms a keyboard repeat event into the actual character typed.
+ \param c The character for the key that was pressed.
+ \param modifiers If any modifiers (Alt, Ctrl, Shift, etc.) were held
+ at the same time, then these are encoded in this int. See the detailed
+ description here: http://www.glfw.org/docs/latest/group__mods.html
+ */
+ virtual void OnKeyRepeat(const char *c, int modifiers) {}
+
+ /** Transforms a keyboard up event into the actual character typed.
+ \param c The character for the key that was pressed.
+ \param modifiers If any modifiers (Alt, Ctrl, Shift, etc.) were held
+ at the same time, then these are encoded in this int. See the detailed
+ description here: http://www.glfw.org/docs/latest/group__mods.html
+ */
+ virtual void OnKeyUp(const char *c, int modifiers) {}
+
+
+
+ /// The values for key, scancode, and modifiers are documented here:
+ /// http://www.glfw.org/docs/latest/group__keys.html
+ virtual void OnSpecialKeyDown(int key, int scancode, int modifiers) {}
+
+ /// The values for key, scancode, and modifiers are documented here:
+ /// http://www.glfw.org/docs/latest/group__keys.html
+ virtual void OnSpecialKeyRepeat(int key, int scancode, int modifiers) {}
+
+ /// The values for key, scancode, and modifiers are documented here:
+ /// http://www.glfw.org/docs/latest/group__keys.html
+ virtual void OnSpecialKeyUp(int key, int scancode, int modifiers) {}
+
+
+ /// Override this to respond when the graphics window and/or framebuffer
+ /// are resized, either by the user dragging the window or through a call
+ /// to ResizeWindow().
+ virtual void OnWindowResize(int new_width, int new_height) {}
+
+
+ /** After creating a new GraphicsApp, call this to start the app's
+ mainloop. Each time through the mainloop the app will: 1. respond
+ any user input events by calling the On*() callback methods, 2. call
+ UpdateSimulation(), and 3. call the two Draw*() methods. Note that
+ Run() does not return until the user closes the app and the program
+ is ready to shutdown.
+ */
+ virtual void Run();
+
+
+ /** Called at the beginning of the Run() method. Override this to initialize
+ any NanoGUI graphics related properties including 2D windows, buttons,
+ sliders, etc...
+
+ IMPORTANT: Put any NanoGUI initialization code here, NOT in the constructors
+ of the classes that you create, or, create your classes from within this
+ function. The graphics calls will fail if the OpenGL context has not yet
+ been initialized, and it is not guaranteed to be initialized until this
+ function has been called.
+ */
+ virtual void InitNanoGUI() {}
+
+ /** Override this to initialize the OpenGL context with textures, vertex
+ buffers, etc. that you will use later inside DrawUsingOpenGL(). This
+ InitOpenGL() function is called once on program startup just after the
+ OpenGL drawing context is created.
+
+ IMPORTANT: Put any OpenGL initialization code here, NOT in the constructors
+ of the classes that you create, or, create your classes from within this
+ function. The graphics calls will fail if the OpenGL context has not yet
+ been initialized, and it is not guaranteed to be initialized until this
+ function has been called.
+ */
+ virtual void InitOpenGL() {}
+
+
+ /** Called once per frame. Override this and fill it in to update your
+ simulation code or any other updates you need to make to your model that
+ are timed rather than in response to user input.
+
+ \param dt is the elapsed time since the last call.
+ */
+ virtual void UpdateSimulation(double dt) {}
+
+
+ /// Override this to draw graphics using the nanovg vector graphics
+ /// library, which provides an easy way to draw 2D shapes to the screen.
+ virtual void DrawUsingNanoVG(NVGcontext *ctx) {}
+
+
+
+ /// Override this to draw graphics using raw OpenGL 2D or 3D graphics
+ /// calls.
+ virtual void DrawUsingOpenGL() {}
+
+
+ /// True if the specified is is currently held down. Uses the GLFW
+ /// key codes found here: http://www.glfw.org/docs/latest/group__keys.html
+ virtual bool IsKeyDown(int key);
+
+ /// True if the left mouse button is currently held down.
+ virtual bool IsLeftMouseDown();
+
+ /// True if the middle mouse button is currently held down.
+ virtual bool IsMiddleMouseDown();
+
+ /// True if the right mouse button is currently held down.
+ virtual bool IsRightMouseDown();
+
+ /// Returns the current width of the client area of the window in pixels
+ virtual int window_width();
+
+ /// Returns the current height of the client area of the window in pixels
+ virtual int window_height();
+
+ /** Returns the current width of the framebuffer in pixels. Note that on
+ some displays (e.g., Mac Retina) the framebuffer is larger than the
+ window.
+ */
+ virtual int framebuffer_width();
+
+ /** Returns the current height of the framebuffer in pixels. Note that on
+ some displays (e.g., Mac Retina) the framebuffer is larger than the
+ window.
+ */
+ virtual int framebuffer_height();
+
+ /// Returns width/height for the current shape of the window
+ virtual float aspect_ratio();
+
+
+ /** Transforms a point in viewport coordinates (pixels where top left = (0,0)
+ and bottom right = (window_width()-1, window_height()-1)) to normalized
+ device coordinates, (top left = (-1,1) bottom right (1,-1)).
+ */
+ virtual Point2 PixelsToNormalizedDeviceCoords(const Point2 &pointInPixels);
+
+ /** Transforms a point in normalized device coordinates (top left = (-1,1)
+ bottom right (1,-1)) to pixels (top left = (0,0), bottom right =
+ (window width-1, window height-1))
+ */
+ virtual Point2 NormalizedDeviceCoordsToPixels(const Point2 &pointInNDC);
+
+
+ /** Transforms a vector in viewport coordinates (pixels where top left = (0,0)
+ and bottom right = (window width-1, window height-1)) to normalized
+ device coordinates, (top left = (-1,1) bottom right (1,-1)).
+ */
+ virtual Vector2 PixelsToNormalizedDeviceCoords(const Vector2 &vectorInPixels);
+
+ /** Transforms a vector in normalized device coordinates (top left = (-1,1)
+ bottom right (1,-1)) to pixels (top left = (0,0), bottom right =
+ (window width-1, window height-1))
+ */
+ virtual Vector2 NormalizedDeviceCoordsToPixels(const Vector2 &pointInNDC);
+
+ /// Returns the z buffer value under the specified pixel. z will be 0 at
+ /// the near plane and +1 at the far plane.
+ virtual float ReadZValueAtPixel(const Point2 &pointInPixels, unsigned int whichBuffer = GL_BACK);
+
+ /// Access to the underlying NanoGUI Screen object
+ virtual nanogui::Screen* screen();
+
+ /// Access to the underlying GLFWwindow object
+ virtual GLFWwindow* window();
+
+
+ /// Cause the graphics windows to resize programmatically rather than by dragging
+ /// on the corner manually.
+ virtual void ResizeWindow(int new_width, int new_height);
+
+
+ /** Users cannot make any graphics calls (e.g., setting the clear color,
+ saving mesh data to the GPU) until the graphics context is initialized
+ by calling this method. It is called automatically by the Run() method
+ before calling the InitNanoGUI() and InitOpenGL() methods. So, users
+ should place all of their graphics initialization code inside one of
+ those two methods.
+ */
+ virtual void InitGraphicsContext();
+
+private:
+
+ bool cursor_pos_glfw_cb(double x, double y);
+ bool mouse_button_glfw_cb(int button, int action, int modifiers);
+ bool key_glfw_cb(int key, int scancode, int action, int mods);
+ bool char_glfw_cb(unsigned int codepoint);
+ bool drop_glfw_cb(int count, const char **filenames);
+ bool scroll_glfw_cb(double x, double y);
+ bool resize_glfw_cb(int width, int height);
+
+ virtual void mouse_move(const Point2 &pos, const Vector2 &delta) {
+ OnMouseMove(pos, delta);
+ }
+ virtual void left_mouse_down(const Point2 &pos) {
+ OnLeftMouseDown(pos);
+ }
+ virtual void left_mouse_drag(const Point2 &pos, const Vector2 &delta) {
+ OnLeftMouseDrag(pos, delta);
+ }
+ virtual void left_mouse_up(const Point2 &pos) {
+ OnLeftMouseUp(pos);
+ }
+ virtual void middle_mouse_down(const Point2 &pos) {
+ OnMiddleMouseDown(pos);
+ }
+ virtual void middle_mouse_drag(const Point2 &pos, const Vector2 &delta) {
+ OnMiddleMouseDrag(pos, delta);
+ }
+ virtual void middle_mouse_up(const Point2 &pos) {
+ OnMiddleMouseUp(pos);
+ }
+ virtual void right_mouse_down(const Point2 &pos) {
+ OnRightMouseDown(pos);
+ }
+ virtual void right_mouse_drag(const Point2 &pos, const Vector2 &delta) {
+ OnRightMouseDrag(pos, delta);
+ }
+ virtual void right_mouse_up(const Point2 &pos) {
+ OnRightMouseUp(pos);
+ }
+ virtual void key_down(const char *c, int modifiers) {
+ OnKeyDown(c, modifiers);
+ }
+ virtual void key_repeat(const char *c, int modifiers) {
+ OnKeyRepeat(c, modifiers);
+ }
+ virtual void key_up(const char *c, int modifiers) {
+ OnKeyUp(c, modifiers);
+ }
+ virtual void special_key_down(int key, int scancode, int modifiers) {
+ OnSpecialKeyDown(key, scancode, modifiers);
+ }
+ virtual void special_key_repeat(int key, int scancode, int modifiers) {
+ OnSpecialKeyRepeat(key, scancode, modifiers);
+ }
+ virtual void special_key_up(int key, int scancode, int modifiers) {
+ OnSpecialKeyUp(key, scancode, modifiers);
+ }
+
+ bool graphicsInitialized_;
+ int width_;
+ int height_;
+ const std::string caption_;
+ nanogui::Screen *screen_;
+ GLFWwindow* window_;
+ double lastDrawT_;
+ Point2 lastMouse_;
+ bool leftDown_;
+ bool middleDown_;
+ bool rightDown_;
+};
+
+
+} // end namespace
+
+#endif
+
diff --git a/dev/MinGfx/src/matrix4.cc b/dev/MinGfx/src/matrix4.cc
new file mode 100644
index 0000000..e38909c
--- /dev/null
+++ b/dev/MinGfx/src/matrix4.cc
@@ -0,0 +1,445 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "matrix4.h"
+
+#include "gfxmath.h"
+#include <string.h>
+
+namespace mingfx {
+
+
+Matrix4::Matrix4() {
+ m[0] = m[5] = m[10] = m[15] = 1.0;
+ m[1] = m[2] = m[3] = m[4] = 0.0;
+ m[6] = m[7] = m[8] = m[9] = 0.0;
+ m[11]= m[12] = m[13] = m[14] = 0.0;
+}
+
+
+Matrix4::Matrix4(const float* a) {
+ memcpy(m,a,16*sizeof(float));
+}
+
+Matrix4::Matrix4(const std::vector<float> &a) {
+ for (int i=0;i<16;i++) {
+ m[i] = a[i];
+ }
+}
+
+Matrix4::Matrix4(const Matrix4& m2) {
+ memcpy(m,m2.m,16*sizeof(float));
+}
+
+Matrix4::~Matrix4() {
+}
+
+
+bool Matrix4::operator==(const Matrix4& m2) const {
+ for (int i=0;i<16;i++) {
+ if (fabs(m2.m[i] - m[i]) > MINGFX_MATH_EPSILON) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool Matrix4::operator!=(const Matrix4& m2) const {
+ return !(*this == m2);
+}
+
+Matrix4& Matrix4::operator=(const Matrix4& m2) {
+ memcpy(m,m2.m,16*sizeof(float));
+ return *this;
+}
+
+const float * Matrix4::value_ptr() const {
+ return m;
+}
+
+float Matrix4::operator[](const int i) const {
+ return m[i];
+}
+
+float& Matrix4::operator[](const int i) {
+ return m[i];
+}
+
+float Matrix4::operator()(const int r, const int c) const {
+ return m[c*4+r];
+}
+
+float& Matrix4::operator()(const int r, const int c) {
+ return m[c*4+r];
+}
+
+std::vector<float> Matrix4::ToVector() const {
+ std::vector<float> v;
+ for (int i=0;i<16;i++) {
+ v.push_back(m[i]);
+ }
+ return v;
+}
+
+
+
+Matrix4 Matrix4::Scale(const Vector3& v) {
+ return Matrix4::FromRowMajorElements(
+ v[0], 0, 0, 0,
+ 0, v[1], 0, 0,
+ 0, 0, v[2], 0,
+ 0, 0, 0, 1
+ );
+}
+
+
+Matrix4 Matrix4::Translation(const Vector3& v) {
+ return Matrix4::FromRowMajorElements(
+ 1, 0, 0, v[0],
+ 0, 1, 0, v[1],
+ 0, 0, 1, v[2],
+ 0, 0, 0, 1
+ );
+}
+
+
+Matrix4 Matrix4::RotationX(const float radians) {
+ const float cosTheta = cos(radians);
+ const float sinTheta = sin(radians);
+ return Matrix4::FromRowMajorElements(
+ 1, 0, 0, 0,
+ 0, cosTheta, -sinTheta, 0,
+ 0, sinTheta, cosTheta, 0,
+ 0, 0, 0, 1
+ );
+}
+
+
+Matrix4 Matrix4::RotationY(const float radians) {
+ const float cosTheta = cos(radians);
+ const float sinTheta = sin(radians);
+ return Matrix4::FromRowMajorElements(
+ cosTheta, 0, sinTheta, 0,
+ 0, 1, 0, 0,
+ -sinTheta, 0, cosTheta, 0,
+ 0, 0, 0, 1
+ );
+}
+
+
+Matrix4 Matrix4::RotationZ(const float radians) {
+ const float cosTheta = cos(radians);
+ const float sinTheta = sin(radians);
+ return Matrix4::FromRowMajorElements(
+ cosTheta, -sinTheta, 0, 0,
+ sinTheta, cosTheta, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1
+ );
+}
+
+
+Matrix4 Matrix4::Rotation(const Point3& p, const Vector3& v, const float a) {
+ const float vZ = v[2];
+ const float vX = v[0];
+ const float theta = atan2(vZ, vX);
+ const float phi = -atan2((float)v[1], (float)sqrt(vX * vX + vZ * vZ));
+
+ const Matrix4 transToOrigin = Matrix4::Translation(-1.0*Vector3(p[0], p[1], p[2]));
+ const Matrix4 A = Matrix4::RotationY(theta);
+ const Matrix4 B = Matrix4::RotationZ(phi);
+ const Matrix4 C = Matrix4::RotationX(a);
+ const Matrix4 invA = Matrix4::RotationY(-theta);
+ const Matrix4 invB = Matrix4::RotationZ(-phi);
+ const Matrix4 transBack = Matrix4::Translation(Vector3(p[0], p[1], p[2]));
+
+ return transBack * invA * invB * C * B * A * transToOrigin;
+}
+
+
+Matrix4 Matrix4::Align(const Point3 &a_p, const Vector3 &a_v1, const Vector3 &a_v2,
+ const Point3 &b_p, const Vector3 &b_v1, const Vector3 &b_v2)
+{
+ Vector3 ax = a_v1.ToUnit();
+ Vector3 ay = a_v2.ToUnit();
+ Vector3 az = ax.Cross(ay).ToUnit();
+ ay = az.Cross(ax);
+ Matrix4 A = Matrix4::FromRowMajorElements(ax[0], ay[0], az[0], a_p[0],
+ ax[1], ay[1], az[1], a_p[1],
+ ax[2], ay[2], az[2], a_p[2],
+ 0, 0, 0, 1);
+
+ Vector3 bx = b_v1.ToUnit();
+ Vector3 by = b_v2.ToUnit();
+ Vector3 bz = bx.Cross(by).ToUnit();
+ by = bz.Cross(bx);
+ Matrix4 B = Matrix4::FromRowMajorElements(bx[0], by[0], bz[0], b_p[0],
+ bx[1], by[1], bz[1], b_p[1],
+ bx[2], by[2], bz[2], b_p[2],
+ 0, 0, 0, 1);
+ return B * A.Inverse();
+}
+
+
+
+Matrix4 Matrix4::LookAt(Point3 eye, Point3 target, Vector3 up) {
+ Vector3 lookDir = (target - eye).ToUnit();
+
+ // desired x,y,z for the camera itself
+ Vector3 z = -lookDir;
+ Vector3 x = up.Cross(z).ToUnit();
+ Vector3 y = z.Cross(x);
+
+ // for the view matrix rotation, we want the inverse of the rotation for the
+ // camera, and the inverse of a rotation matrix is its transpose, so the
+ // x,y,z colums become x,y,z rows.
+ Matrix4 R = Matrix4::FromRowMajorElements(
+ x[0], x[1], x[2], 0,
+ y[0], y[1], y[2], 0,
+ z[0], z[1], z[2], 0,
+ 0, 0, 0, 1
+ );
+
+ // also need to translate by -eye
+ Matrix4 T = Matrix4::Translation(Point3(0,0,0) - eye);
+
+ return R * T;
+}
+
+Matrix4 Matrix4::Perspective(float fovyInDegrees, float aspectRatio,
+ float nearVal, float farVal)
+{
+ // https://www.khronos.org/opengl/wiki/GluPerspective_code
+ float ymax, xmax;
+ ymax = nearVal * tanf(fovyInDegrees * GfxMath::PI / 360.0f);
+ // ymin = -ymax;
+ // xmin = -ymax * aspectRatio;
+ xmax = ymax * aspectRatio;
+ return Matrix4::Frustum(-xmax, xmax, -ymax, ymax, nearVal, farVal);
+}
+
+
+Matrix4 Matrix4::Frustum(float left, float right,
+ float bottom, float top,
+ float nearVal, float farVal)
+{
+ return Matrix4::FromRowMajorElements(
+ 2.0f*nearVal/(right-left), 0.0f, (right+left)/(right-left), 0.0f,
+ 0.0f, 2.0f*nearVal/(top-bottom), (top+bottom)/(top-bottom), 0.0f,
+ 0.0f, 0.0f, -(farVal+nearVal)/(farVal-nearVal), -2.0f*farVal*nearVal/(farVal-nearVal),
+ 0.0f, 0.0f, -1.0f, 0.0
+ );
+}
+
+
+Matrix4 Matrix4::FromRowMajorElements(
+ const float r1c1, const float r1c2, const float r1c3, const float r1c4,
+ const float r2c1, const float r2c2, const float r2c3, const float r2c4,
+ const float r3c1, const float r3c2, const float r3c3, const float r3c4,
+ const float r4c1, const float r4c2, const float r4c3, const float r4c4)
+{
+ float m[16];
+ m[0]=r1c1; m[4]=r1c2; m[8]=r1c3; m[12]=r1c4;
+ m[1]=r2c1; m[5]=r2c2; m[9]=r2c3; m[13]=r2c4;
+ m[2]=r3c1; m[6]=r3c2; m[10]=r3c3; m[14]=r3c4;
+ m[3]=r4c1; m[7]=r4c2; m[11]=r4c3; m[15]=r4c4;
+ return Matrix4(m);
+}
+
+
+
+
+Matrix4 Matrix4::Orthonormal() const {
+ Vector3 x = ColumnToVector3(0).ToUnit();
+ Vector3 y = ColumnToVector3(1);
+ y = (y - y.Dot(x)*x).ToUnit();
+ Vector3 z = x.Cross(y).ToUnit();
+ return Matrix4::FromRowMajorElements(
+ x[0], y[0], z[0], m[12],
+ x[1], y[1], z[1], m[13],
+ x[2], y[2], z[2], m[14],
+ m[3], m[7], m[11], m[15]
+ );
+}
+
+
+Matrix4 Matrix4::Transpose() const {
+ return Matrix4::FromRowMajorElements(
+ m[0], m[1], m[2], m[3],
+ m[4], m[5], m[6], m[7],
+ m[8], m[9], m[10], m[11],
+ m[12], m[13], m[14], m[15]
+ );
+}
+
+
+
+
+// Returns the determinant of the 3x3 matrix formed by excluding the specified row and column
+// from the 4x4 matrix. The formula for the determinant of a 3x3 is discussed on
+// page 705 of Hill & Kelley, but note that there is a typo within the m_ij indices in the
+// equation in the book that corresponds to the cofactor02 line in the code below.
+float Matrix4::SubDeterminant(int excludeRow, int excludeCol) const {
+ // Compute non-excluded row and column indices
+ int row[3];
+ int col[3];
+
+ int r=0;
+ int c=0;
+ for (int i=0; i<4; i++) {
+ if (i != excludeRow) {
+ row[r] = i;
+ r++;
+ }
+ if (i != excludeCol) {
+ col[c] = i;
+ c++;
+ }
+ }
+
+ // Compute the cofactors of each element in the first row
+ float cofactor00 = (*this)(row[1],col[1]) * (*this)(row[2],col[2]) - (*this)(row[1],col[2]) * (*this)(row[2],col[1]);
+ float cofactor01 = - ((*this)(row[1],col[0]) * (*this)(row[2],col[2]) - (*this)(row[1],col[2]) * (*this)(row[2],col[0]));
+ float cofactor02 = (*this)(row[1],col[0]) * (*this)(row[2],col[1]) - (*this)(row[1],col[1]) * (*this)(row[2],col[0]);
+
+ // The determinant is then the dot product of the first row and the cofactors of the first row
+ return (*this)(row[0],col[0])*cofactor00 + (*this)(row[0],col[1])*cofactor01 + (*this)(row[0],col[2])*cofactor02;
+}
+
+// Returns the cofactor matrix. The cofactor matrix is a matrix where each element c_ij is the cofactor
+// of the corresponding element m_ij in M. The cofactor of each element m_ij is defined as (-1)^(i+j) times
+// the determinant of the "submatrix" formed by deleting the i-th row and j-th column from M.
+// See the definition in section A2.1.4 (page 705) in Hill & Kelley.
+Matrix4 Matrix4::Cofactor() const {
+ Matrix4 out;
+ // We'll use i to incrementally compute -1^(r+c)
+ int i = 1;
+ for (int r = 0; r < 4; ++r) {
+ for (int c = 0; c < 4; ++c) {
+ // Compute the determinant of the 3x3 submatrix
+ float det = SubDeterminant(r, c);
+ out(r,c) = i * det;
+ i = -i;
+ }
+ i = -i;
+ }
+ return out;
+}
+
+// Returns the determinant of the 4x4 matrix
+// See the hint in step 2 in Appendix A2.1.5 (page 706) in Hill & Kelley to learn how to compute this
+float Matrix4::Determinant() const {
+ // The determinant is the dot product of any row of C (the cofactor matrix of m) with the corresponding row of m
+ Matrix4 C = Cofactor();
+ return C(0,0)*(*this)(0,0) + C(0,1)*(*this)(0,1) + C(0,2)*(*this)(0,2) + C(0,3)*(*this)(0,3);
+}
+
+// Returns the inverse of the 4x4 matrix if it is nonsingular. If it is singular, then returns the
+// identity matrix.
+Matrix4 Matrix4::Inverse() const {
+ // Check for singular matrix
+ float det = Determinant();
+ if (fabs(det) < 1e-8) {
+ return Matrix4();
+ }
+
+ // m in nonsingular, so compute inverse using the 4-step procedure outlined in Appendix A2.1.5
+ // (page 706) in Hill & Kelley
+ // 1. Find cofactor matrix C
+ Matrix4 C = Cofactor();
+ // 2. Find the determinant of M as the dot prod of any row of C with the corresponding row of M.
+ // det = determinant(m);
+ // 3. Transpose C to get Ctrans
+ Matrix4 Ctrans = C.Transpose();
+ // 4. Scale each element of Ctrans by (1/det)
+ return Ctrans * (1.0f / det);
+}
+
+
+Vector3 Matrix4::ColumnToVector3(int c) const {
+ return Vector3(m[c*4], m[c*4+1], m[c*4+2]);
+}
+
+Point3 Matrix4::ColumnToPoint3(int c) const {
+ return Point3(m[c*4], m[c*4+1], m[c*4+2]);
+}
+
+
+
+
+Matrix4 operator*(const Matrix4& m, const float& s) {
+ Matrix4 result;
+ for (int r = 0; r < 4; r++) {
+ for (int c = 0; c < 4; c++) {
+ result(r,c) = m(r,c) * s;
+ }
+ }
+ return result;
+}
+
+Matrix4 operator*(const float& s, const Matrix4& m) {
+ return m*s;
+}
+
+
+Point3 operator*(const Matrix4& m, const Point3& p) {
+ // For our points, p[3]=1 and we don't even bother storing p[3], so need to homogenize
+ // by dividing by w before returning the new point.
+ const float winv = 1.0f / (p[0] * m(3,0) + p[1] * m(3,1) + p[2] * m(3,2) + 1.0f * m(3,3));
+ return Point3(winv * (p[0] * m(0,0) + p[1] * m(0,1) + p[2] * m(0,2) + 1.0f * m(0,3)),
+ winv * (p[0] * m(1,0) + p[1] * m(1,1) + p[2] * m(1,2) + 1.0f * m(1,3)),
+ winv * (p[0] * m(2,0) + p[1] * m(2,1) + p[2] * m(2,2) + 1.0f * m(2,3)));
+
+}
+
+
+Vector3 operator*(const Matrix4& m, const Vector3& v) {
+ // For a vector v[3]=0
+ return Vector3(v[0] * m(0,0) + v[1] * m(0,1) + v[2] * m(0,2),
+ v[0] * m(1,0) + v[1] * m(1,1) + v[2] * m(1,2),
+ v[0] * m(2,0) + v[1] * m(2,1) + v[2] * m(2,2));
+
+}
+
+
+
+Matrix4 operator*(const Matrix4& m1, const Matrix4& m2) {
+ Matrix4 m = Matrix4::FromRowMajorElements(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0);
+ for (int r = 0; r < 4; r++) {
+ for (int c = 0; c < 4; c++) {
+ for (int i = 0; i < 4; i++) {
+ m(r,c) += m1(r,i) * m2(i,c);
+ }
+ }
+ }
+ return m;
+}
+
+Ray operator*(const Matrix4& m, const Ray& r) {
+ Point3 p = m * r.origin();
+ Vector3 d = m * r.direction();
+ return Ray(p, d);
+}
+
+
+std::ostream & operator<< ( std::ostream &os, const Matrix4 &m) {
+ // format: [[r1c1, r1c2, r1c3, r1c4], [r2c1, r2c2, r2c3, r2c4], etc.. ]
+ return os << "[[" << m(0,0) << ", " << m(0,1) << ", " << m(0,2) << ", " << m(0,3) << "], "
+ << "[" << m(1,0) << ", " << m(1,1) << ", " << m(1,2) << ", " << m(1,3) << "], "
+ << "[" << m(2,0) << ", " << m(2,1) << ", " << m(2,2) << ", " << m(2,3) << "], "
+ << "[" << m(3,0) << ", " << m(3,1) << ", " << m(3,2) << ", " << m(3,3) << "]]";
+}
+
+std::istream & operator>> ( std::istream &is, Matrix4 &m) {
+ // format: [[r1c1, r1c2, r1c3, r1c4], [r2c1, r2c2, r2c3, r2c4], etc.. ]
+ char c;
+ return is >> c >> c >> m(0,0) >> c >> m(0,1) >> c >> m(0,2) >> c >> m(0,3) >> c >> c
+ >> c >> m(1,0) >> c >> m(1,1) >> c >> m(1,2) >> c >> m(1,3) >> c >> c
+ >> c >> m(2,0) >> c >> m(2,1) >> c >> m(2,2) >> c >> m(2,3) >> c >> c
+ >> c >> m(3,0) >> c >> m(3,1) >> c >> m(3,2) >> c >> m(3,3) >> c >> c;
+}
+
+} // end namespace
diff --git a/dev/MinGfx/src/matrix4.h b/dev/MinGfx/src/matrix4.h
new file mode 100644
index 0000000..4abf29f
--- /dev/null
+++ b/dev/MinGfx/src/matrix4.h
@@ -0,0 +1,260 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2017, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_MATRIX4_H_
+#define SRC_MATRIX4_H_
+
+#include <iostream>
+
+#include "point3.h"
+#include "vector3.h"
+#include "ray.h"
+
+
+namespace mingfx {
+
+
+/** A 4x4 transformation matrix stored internally as an array of floats in
+ column-major order so as to be compatible with OpenGL. Examples:
+ ~~~
+ // constructing various matrices:
+ Matrix4 T = Matrix4::Translation(Vector3(1,0,0));
+ Matrix4 S = Matrix4::Scale(Vector3(2,2,2));
+ Matrix4 R = Matrix4::RotateX(GfxMath::toRadians(45.0));
+
+ // compose matrices together by multiplication
+ Matrix4 M = T * R * S;
+ Matrix4 Minv = M.Inverse();
+
+ // transforming points, vectors, etc.
+ Point3 p1(1,1,1);
+ Point3 p2 = M * p1;
+
+ Vector3 v1(1,1,1);
+ Vector3 v2 = M * v1;
+
+ Ray r1(p1, v1);
+ Ray r2 = M * r1;
+ ~~~
+ */
+class Matrix4 {
+public:
+
+ /// The default constructor creates an identity matrix:
+ Matrix4();
+
+ /// Constructs a matrix given from an array of 16 floats in OpenGL matrix format
+ /// (i.e., column major).
+ Matrix4(const float* a);
+
+ /// Constructs a matrix given from a vector of 16 floats in OpenGL matrix format
+ /// (i.e., column major).
+ Matrix4(const std::vector<float> &a);
+
+ /// Copy constructor
+ Matrix4(const Matrix4& m2);
+
+ /// Destructor
+ virtual ~Matrix4();
+
+ /// Check for "equality", taking floating point imprecision into account
+ bool operator==(const Matrix4& m2) const;
+
+ /// Check for "inequality", taking floating point imprecision into account
+ bool operator!=(const Matrix4& m2) const;
+
+ /// Matrix assignment operator
+ Matrix4& operator=(const Matrix4& m2);
+
+
+ /// Returns a pointer to the raw data array used to store the matrix. This
+ /// is a 1D array of 16-elements stored in column-major order.
+ const float * value_ptr() const;
+
+ /// Accesses the ith element of the raw data array used to store the matrix.
+ /// This is a 1D array of 16-elements stored in column-major order.
+ float operator[](const int i) const;
+
+ /// Accesses the ith element of the raw data array used to store the matrix.
+ /// This is a 1D array of 16-elements stored in column-major order.
+ float& operator[](const int i);
+
+ /// Access an individual element of the array using the syntax:
+ /// Matrix4 mat; float row1col2 = mat(1,2);
+ float operator()(const int row, const int col) const;
+
+ /// Access an individual element of the array using the syntax:
+ /// Matrix4 mat; mat(1,2) = 1.0;
+ float& operator()(const int row, const int col);
+
+
+ /// Returns the c-th column of the matrix as a Vector type, e.g.,:
+ /// Vector3 xAxis = mat.getColumnAsVector3(0);
+ /// Vector3 yAxis = mat.getColumnAsVector3(1);
+ /// Vector3 zAxis = mat.getColumnAsVector3(2);
+ Vector3 ColumnToVector3(int c) const;
+
+ /// Returns the c-th column of the matrix as a Vector type, e.g.,:
+ /// Point3 pos = mat.getColumnAsPoint3(3);
+ Point3 ColumnToPoint3(int c) const;
+
+ std::vector<float> ToVector() const;
+
+
+ // --- Static Constructors for Special Matrices ---
+
+ /** Returns a matrix constructed from individual elements passed in row major
+ order so that the matrix looks "correct" on the screen as you write this
+ constructor on 4 lines of code as below. Note the that internally the
+ matrix constructed will be stored in a 16 element column major array to
+ be consistent with OpenGL.
+ */
+ static Matrix4 FromRowMajorElements(
+ const float r1c1, const float r1c2, const float r1c3, const float r1c4,
+ const float r2c1, const float r2c2, const float r2c3, const float r2c4,
+ const float r3c1, const float r3c2, const float r3c3, const float r3c4,
+ const float r4c1, const float r4c2, const float r4c3, const float r4c4
+ );
+
+ // --- Model Transformations ---
+
+ /// Returns the scale matrix described by the vector
+ static Matrix4 Scale(const Vector3 &v);
+
+ /// Returns the translation matrix described by the vector
+ static Matrix4 Translation(const Vector3 &v);
+
+ /// Returns the rotation matrix about the x axis by the specified angle
+ static Matrix4 RotationX(const float radians);
+
+ /// Returns the rotation matrix about the y axis by the specified angle
+ static Matrix4 RotationY(const float radians);
+
+ /// Returns the rotation matrix about the z axis by the specified angle
+ static Matrix4 RotationZ(const float radians);
+
+ /// Returns the rotation matrix around the vector v placed at point p, rotate by angle a
+ static Matrix4 Rotation(const Point3 &p, const Vector3 &v, const float a);
+
+ /// Creates a transformation matrix that maps a coordinate space, *a*, defined
+ /// one point, *a_p*, and two vectors, *a_v1* and *a_v2*, to a new coordinate
+ /// space, *b*, also defined by one point, *b_p*, and two vectors, *b_v1* and
+ /// *b_v2*. The transformation will thus include both some rotation and some
+ /// translation. Pseudocode example of aligning a billboard defined in the
+ /// XY plane with a normal in the +Z direction and that rotates around the Y
+ /// axis with a camera:
+ /// ~~~
+ /// // define a coordiante space for a canonical billboard geometry defined
+ /// // right at the origin.
+ /// Point3 a_p = Point3(0,0,0); // billboard's initial base position
+ /// Vector3 a_v1 = Vector3(0,1,0); // billboard's initial up direction
+ /// Vector3 a_v2 = Vector3(0,0,1); // billboard's initial normal direction
+ ///
+ /// // define a coordinate space for where we want this billboard to go and
+ /// // the direction it should be facing
+ /// Point3 b_p = desired_base_pos; // new position for the billboard
+ /// Vector3 b_v1 = Vector3(0,1,0); // +Y is still up, doesn't change
+ /// Vector3 b_v2 = (camera.eye() - desired_base_pos); // the normal should point toward the camera
+ /// b_v2[1] = 0.0; // with 0 change in Y so the billboard does not tilt
+ /// b_v2.Normalize(); // convert to a unit vector
+ ///
+ /// Matrix4 billboard_model_matrix = Matrix4::Align(a_p, a_v1, a_v2, b_p, b_v1, b_v2);
+ /// ~~~
+ static Matrix4 Align(const Point3 &a_p, const Vector3 &a_v1, const Vector3 &a_v2,
+ const Point3 &b_p, const Vector3 &b_v1, const Vector3 &b_v2);
+
+
+ // --- View Matrices ---
+
+ /** Returns a view matrix that centers the camera at the 'eye' position and
+ orients it to look at the desired 'target' point with the top of the
+ screen pointed as closely as possible in the direction of the 'up' vector.
+ */
+ static Matrix4 LookAt(Point3 eye, Point3 target, Vector3 up);
+
+ // --- Projection Matrices ---
+
+ /// Returns a perspective projection matrix equivalent to the one gluPerspective
+ /// creates.
+ static Matrix4 Perspective(float fov_y_in_degrees, float aspect_ratio, float near_plane_dist, float far_plane_dist);
+
+ /// Returns a projection matrix equivalent the one glFrustum creates
+ static Matrix4 Frustum(float left, float right, float bottom, float top, float near_plane_dist, float far_plane_dist);
+
+ // --- Inverse, Transposeand Other General Matrix Functions ---
+
+ /// Returns the inverse of the 4x4 matrix if it is nonsingular. If it is
+ /// singular, then returns the identity matrix.
+ Matrix4 Inverse() const;
+
+ /** Returns an orthonormal version of the matrix, i.e., guarantees that the
+ rotational component of the matrix is built from column vectors that are
+ all unit vectors and orthogonal to each other.
+ */
+ Matrix4 Orthonormal() const;
+
+ /// Returns the transpose of the matrix
+ Matrix4 Transpose() const;
+
+ /// Returns the determinant of the 3x3 matrix formed by excluding the specified
+ /// row and column from the 4x4 matrix.
+ float SubDeterminant(int exclude_row, int exclude_col) const;
+
+ /// Returns the cofactor matrix.
+ Matrix4 Cofactor() const;
+
+ /// Returns the determinant of the 4x4 matrix
+ float Determinant() const;
+
+
+
+private:
+ float m[16];
+};
+
+
+
+// ---------- Operator Overloads for Working with Points, Vectors, & Matrices ----------
+
+
+// --- Matrix multiplication for Points, Vectors, & Matrices ---
+
+/// Multiply matrix and scalar, returns the new matrix
+Matrix4 operator*(const Matrix4& m, const float& s);
+
+/// Multiply matrix and scalar, returns the new matrix
+Matrix4 operator*(const float& s, const Matrix4& m);
+
+/// Multiply matrix and point, returns the new point
+Point3 operator*(const Matrix4& m, const Point3& p);
+
+/// Multiply matrix and vector, returns the new vector
+Vector3 operator*(const Matrix4& m, const Vector3& v);
+
+/// Multiply two matrices, returns the result
+Matrix4 operator*(const Matrix4& m1, const Matrix4& m2);
+
+
+
+/// Multiply matrix and the point and vector portions of the ray, returns the new ray
+Ray operator*(const Matrix4& m, const Ray& r);
+
+// --- Stream operators ---
+
+std::ostream & operator<< ( std::ostream &os, const Matrix4 &m);
+std::istream & operator>> ( std::istream &is, Matrix4 &m);
+
+
+} // end namespace
+
+#endif
diff --git a/dev/MinGfx/src/mesh.cc b/dev/MinGfx/src/mesh.cc
new file mode 100644
index 0000000..dd967fa
--- /dev/null
+++ b/dev/MinGfx/src/mesh.cc
@@ -0,0 +1,651 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "mesh.h"
+
+#include "matrix4.h"
+#include "opengl_headers.h"
+
+#include <sstream>
+#include <fstream>
+
+namespace mingfx {
+
+#define MAX_TEX_ATTRIBS 5
+
+
+Mesh::Mesh() : gpu_dirty_(true), vertex_buffer_(0), vertex_array_(0), element_buffer_(0), bvh_dirty_(true) {
+}
+
+Mesh::Mesh(const Mesh &other) {
+ verts_ = other.verts_;
+ norms_ = other.norms_;
+ colors_ = other.colors_;
+ tex_coords_ = other.tex_coords_;
+ indices_ = other.indices_;
+ gpu_dirty_ = true;
+ bvh_dirty_ = true;
+}
+
+Mesh::~Mesh() {
+}
+
+int Mesh::AddTriangle(Point3 v1, Point3 v2, Point3 v3) {
+ gpu_dirty_ = true;
+ bvh_dirty_ = true;
+
+ verts_.push_back(v1[0]);
+ verts_.push_back(v1[1]);
+ verts_.push_back(v1[2]);
+
+ verts_.push_back(v2[0]);
+ verts_.push_back(v2[1]);
+ verts_.push_back(v2[2]);
+
+ verts_.push_back(v3[0]);
+ verts_.push_back(v3[1]);
+ verts_.push_back(v3[2]);
+
+ return num_triangles()-1;
+}
+
+void Mesh::UpdateTriangle(int triangle_id, Point3 v1, Point3 v2, Point3 v3) {
+ gpu_dirty_ = true;
+ bvh_dirty_ = true;
+
+ int index = triangle_id * 9;
+ verts_[(size_t)index + 0] = v1[0];
+ verts_[(size_t)index + 1] = v1[1];
+ verts_[(size_t)index + 2] = v1[2];
+
+ verts_[(size_t)index + 3] = v2[0];
+ verts_[(size_t)index + 4] = v2[1];
+ verts_[(size_t)index + 5] = v2[2];
+
+ verts_[(size_t)index + 6] = v3[0];
+ verts_[(size_t)index + 7] = v3[1];
+ verts_[(size_t)index + 8] = v3[2];
+}
+
+
+void Mesh::SetNormals(int triangle_id, Vector3 n1, Vector3 n2, Vector3 n3) {
+ gpu_dirty_ = true;
+
+ if (triangle_id >= num_triangles()) {
+ std::cerr << "Mesh::SetNormals() -- warning: cannot set normals for non-existant triangle with ID=" << triangle_id << ". Make sure the triangle has been added first." << std::endl;
+ return;
+ }
+
+ int requiredSize = (triangle_id+1)*9;
+ if (norms_.size() < requiredSize) {
+ norms_.resize(requiredSize);
+ }
+ int index = triangle_id * 9;
+ norms_[(size_t)index + 0] = n1[0];
+ norms_[(size_t)index + 1] = n1[1];
+ norms_[(size_t)index + 2] = n1[2];
+
+ norms_[(size_t)index + 3] = n2[0];
+ norms_[(size_t)index + 4] = n2[1];
+ norms_[(size_t)index + 5] = n2[2];
+
+ norms_[(size_t)index + 6] = n3[0];
+ norms_[(size_t)index + 7] = n3[1];
+ norms_[(size_t)index + 8] = n3[2];
+}
+
+void Mesh::SetColors(int triangle_id, Color c1, Color c2, Color c3) {
+ gpu_dirty_ = true;
+
+ if (triangle_id >= num_triangles()) {
+ std::cerr << "Mesh::SetColors() -- warning: cannot set colors for non-existant triangle with ID=" << triangle_id << ". Make sure the triangle has been added first." << std::endl;
+ return;
+ }
+
+ int requiredSize = (triangle_id+1)*12;
+ if (colors_.size() < requiredSize) {
+ colors_.resize(requiredSize);
+ }
+ int index = triangle_id * 12;
+ colors_[(size_t)index + 0] = c1[0];
+ colors_[(size_t)index + 1] = c1[1];
+ colors_[(size_t)index + 2] = c1[2];
+ colors_[(size_t)index + 3] = c1[3];
+
+ colors_[(size_t)index + 4] = c2[0];
+ colors_[(size_t)index + 5] = c2[1];
+ colors_[(size_t)index + 6] = c2[2];
+ colors_[(size_t)index + 7] = c2[3];
+
+ colors_[(size_t)index + 8] = c3[0];
+ colors_[(size_t)index + 9] = c3[1];
+ colors_[(size_t)index + 10] = c3[2];
+ colors_[(size_t)index + 11] = c3[3];
+}
+
+void Mesh::SetTexCoords(int triangle_id, int textureUnit, Point2 uv1, Point2 uv2, Point2 uv3) {
+ gpu_dirty_ = true;
+
+ if (triangle_id >= num_triangles()) {
+ std::cerr << "Mesh::SetTexCoords() -- warning: cannot set texture coordinates for non-existant triangle with ID=" << triangle_id << ". Make sure the triangle has been added first." << std::endl;
+ return;
+ }
+
+ // resize as needed based on the number of textureUnits used
+ if (tex_coords_.size() < (size_t)textureUnit+1) {
+ tex_coords_.resize((size_t)textureUnit+1);
+ }
+
+ // resize the textureUnit-specific array based on the number of triangles
+ int requiredSize = (triangle_id+1)*6;
+ if (tex_coords_[textureUnit].size() < requiredSize) {
+ tex_coords_[textureUnit].resize(requiredSize);
+ }
+ int index = triangle_id * 6;
+ tex_coords_[textureUnit][(size_t)index + 0] = uv1[0];
+ tex_coords_[textureUnit][(size_t)index + 1] = uv1[1];
+
+ tex_coords_[textureUnit][(size_t)index + 2] = uv2[0];
+ tex_coords_[textureUnit][(size_t)index + 3] = uv2[1];
+
+ tex_coords_[textureUnit][(size_t)index + 4] = uv3[0];
+ tex_coords_[textureUnit][(size_t)index + 5] = uv3[1];
+}
+
+
+void Mesh::SetVertices(const std::vector<Point3> &verts) {
+ gpu_dirty_ = true;
+ bvh_dirty_ = true;
+
+ verts_.clear();
+ for (int i=0; i<verts.size(); i++) {
+ verts_.push_back(verts[i][0]);
+ verts_.push_back(verts[i][1]);
+ verts_.push_back(verts[i][2]);
+ }
+}
+
+void Mesh::SetNormals(const std::vector<Vector3> &norms) {
+ gpu_dirty_ = true;
+ norms_.clear();
+ for (int i=0; i<norms.size(); i++) {
+ norms_.push_back(norms[i][0]);
+ norms_.push_back(norms[i][1]);
+ norms_.push_back(norms[i][2]);
+ }
+}
+
+void Mesh::SetColors(const std::vector<Color> &colors) {
+ gpu_dirty_ = true;
+ colors_.clear();
+ for (int i=0; i<colors.size(); i++) {
+ colors_.push_back(colors[i][0]);
+ colors_.push_back(colors[i][1]);
+ colors_.push_back(colors[i][2]);
+ colors_.push_back(colors[i][3]);
+ }
+}
+
+void Mesh::SetTexCoords(int texture_unit, const std::vector<Point2> &tex_coords) {
+ gpu_dirty_ = true;
+ // resize as needed based on the number of textureUnits used
+ if (tex_coords_.size() < (size_t)texture_unit+1) {
+ tex_coords_.resize((size_t)texture_unit+1);
+ }
+ tex_coords_[texture_unit].clear();
+ for (int i=0; i<tex_coords.size(); i++) {
+ tex_coords_[texture_unit].push_back(tex_coords[i][0]);
+ tex_coords_[texture_unit].push_back(tex_coords[i][1]);
+ }
+}
+
+
+void Mesh::SetIndices(const std::vector<unsigned int> indices) {
+ gpu_dirty_ = true;
+ bvh_dirty_ = true;
+
+ indices_.clear();
+ for (int i=0; i<indices.size(); i++) {
+ indices_.push_back(indices[i]);
+ }
+}
+
+
+void Mesh::SetInstanceTransforms(const std::vector<Matrix4> &xforms) {
+ gpu_dirty_ = true;
+ instance_xforms_.clear();
+ for (int i=0; i<xforms.size(); i++) {
+ for (int j=0; j<16; j++) {
+ std::cout << xforms[i][j] << std::endl;
+ instance_xforms_.push_back(xforms[i][j]);
+ }
+ }
+}
+
+
+void Mesh::SetVertices(float *vertsArray, int numVerts) {
+ gpu_dirty_ = true;
+ bvh_dirty_ = true;
+
+ verts_.clear();
+ int numFloats = numVerts * 3;
+ for (int i=0; i<numFloats; i++) {
+ verts_.push_back(vertsArray[i]);
+ }
+}
+
+void Mesh::SetNormals(float *normsArray, int numNorms) {
+ gpu_dirty_ = true;
+ norms_.clear();
+ int numFloats = numNorms * 3;
+ for (int i=0; i<numFloats; i++) {
+ norms_.push_back(normsArray[i]);
+ }
+}
+
+void Mesh::SetColors(float *colorsArray, int numColors) {
+ gpu_dirty_ = true;
+ colors_.clear();
+ int numFloats = numColors * 4;
+ for (int i=0; i<numFloats; i++) {
+ colors_.push_back(colorsArray[i]);
+ }
+}
+
+void Mesh::SetTexCoords(int textureUnit, float *texCoordsArray, int numTexCoords) {
+ gpu_dirty_ = true;
+ // resize as needed based on the number of textureUnits used
+ if (tex_coords_.size() < (size_t)textureUnit+1) {
+ tex_coords_.resize((size_t)textureUnit+1);
+ }
+ tex_coords_[textureUnit].clear();
+ int numFloats = numTexCoords * 2;
+ for (int i=0; i<numFloats; i++) {
+ tex_coords_[textureUnit].push_back(texCoordsArray[i]);
+ }
+}
+
+void Mesh::SetIndices(unsigned int *indexArray, int numIndices) {
+ gpu_dirty_ = true;
+ bvh_dirty_ = true;
+
+ indices_.clear();
+ for (int i=0; i<numIndices; i++) {
+ indices_.push_back(indexArray[i]);
+ }
+}
+
+
+
+
+
+
+void Mesh::UpdateGPUMemory() {
+ if (gpu_dirty_) {
+ // sanity check -- for each attribute that is added (normals, colors, texcoords)
+ // make sure the number of triangles is equal to the number of tris in the verts
+ // array.
+ if ((norms_.size() != 0) && (norms_.size() / 3 != num_vertices())) {
+ std::cerr << "Mesh::UpdateGPUMemory() -- warning: the number of per vertex normals in the mesh is not equal to the number vertices in the mesh. (N = " << norms_.size() / 3 << ", V = " << num_vertices() << ")" << std::endl;
+ }
+ if ((colors_.size() != 0) && (colors_.size() / 4 != num_vertices())) {
+ std::cerr << "Mesh::UpdateGPUMemory() -- warning: the number of per vertex colors in the mesh is not equal to the number vertices in the mesh. (C = " << colors_.size() / 4 << ", V = " << num_vertices() << ")" << std::endl;
+ }
+ for (int i = 0; i < tex_coords_.size(); i++) {
+ if ((tex_coords_[i].size() != 0) && (tex_coords_[i].size() / 2 != num_vertices())) {
+ std::cerr << "Mesh::UpdateGPUMemory() -- warning: the number of per vertex texture coordinates (for texture unit #" << i << ") is not equal to the number vertices in the mesh. (UVs = " << tex_coords_[i].size() / 2 << ", V = " << num_vertices() << ")" << std::endl;
+ }
+ }
+
+ GLsizeiptr totalMemSize = 0;
+
+ GLsizeiptr vertsMemSize = verts_.size() * sizeof(float);
+ GLsizeiptr vertsMemOffset = 0;
+ totalMemSize += vertsMemSize;
+
+ GLsizeiptr normsMemSize = norms_.size() * sizeof(float);
+ GLsizeiptr normsMemOffset = totalMemSize;
+ totalMemSize += normsMemSize;
+
+ GLsizeiptr colorsMemSize = colors_.size() * sizeof(float);
+ GLsizeiptr colorsMemOffset = totalMemSize;
+ totalMemSize += colorsMemSize;
+
+ std::vector<GLsizeiptr> texCoordsMemSize;
+ std::vector<GLsizeiptr> texCoordsMemOffset;
+ for (int i = 0; i < std::min((int)tex_coords_.size(),(int)MAX_TEX_ATTRIBS); i++) {
+ texCoordsMemSize.push_back(tex_coords_[i].size() * sizeof(float));
+ texCoordsMemOffset.push_back(totalMemSize);
+ totalMemSize += texCoordsMemSize[i];
+ }
+
+ GLsizeiptr instanceXformsMemSize = instance_xforms_.size() * sizeof(float);
+ GLsizeiptr instanceXformsMemOffset = totalMemSize;
+ totalMemSize += instanceXformsMemSize;
+
+
+ glGenBuffers(1, &vertex_buffer_);
+ glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
+ glBufferData(GL_ARRAY_BUFFER, totalMemSize, NULL, GL_STATIC_DRAW);
+
+ glBufferSubData(GL_ARRAY_BUFFER, vertsMemOffset, vertsMemSize, &verts_[0]);
+ if (norms_.size() > 0) {
+ glBufferSubData(GL_ARRAY_BUFFER, normsMemOffset, normsMemSize, &norms_[0]);
+ }
+ if (colors_.size() > 0) {
+ glBufferSubData(GL_ARRAY_BUFFER, colorsMemOffset, colorsMemSize, &colors_[0]);
+ }
+ for (int i=0; i<tex_coords_.size(); i++) {
+ glBufferSubData(GL_ARRAY_BUFFER, texCoordsMemOffset[i], texCoordsMemSize[i], &(tex_coords_[i][0]));
+ }
+ if (instance_xforms_.size() > 0) {
+ glBufferSubData(GL_ARRAY_BUFFER, instanceXformsMemOffset, instanceXformsMemSize, &instance_xforms_[0]);
+ }
+ glGenVertexArrays(1, &vertex_array_);
+ glBindVertexArray(vertex_array_);
+ glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
+
+ // attribute 0 = vertices (required)
+ int attribID = 0;
+ int nComponents = 3;
+ glEnableVertexAttribArray(attribID);
+ glVertexAttribPointer(attribID, nComponents, GL_FLOAT, GL_FALSE, nComponents*sizeof(GLfloat), (char*)0 + vertsMemOffset);
+
+ // attribute 1 = normals (optional)
+ attribID = 1;
+ if (norms_.size()) {
+ nComponents = 3;
+ glEnableVertexAttribArray(attribID);
+ glVertexAttribPointer(attribID, nComponents, GL_FLOAT, GL_TRUE, nComponents*sizeof(GLfloat), (char*)0 + normsMemOffset);
+ }
+ else {
+ glDisableVertexAttribArray(attribID);
+ }
+
+ // attribute 2 = colors (optional)
+ attribID = 2;
+ if (colors_.size()) {
+ nComponents = 4;
+ glEnableVertexAttribArray(attribID);
+ glVertexAttribPointer(attribID, nComponents, GL_FLOAT, GL_TRUE, nComponents*sizeof(GLfloat), (char*)0 + colorsMemOffset);
+ }
+ else {
+ glDisableVertexAttribArray(attribID);
+ }
+
+ // attribute(s) 3 to 7 = texture coordinates (optional)
+ nComponents = 2;
+ for (int i=0; i<std::min((int)tex_coords_.size(),(int)MAX_TEX_ATTRIBS); i++) {
+ attribID = 3+i;
+ if (tex_coords_[i].size()) {
+ glEnableVertexAttribArray(attribID);
+ glVertexAttribPointer(attribID, nComponents, GL_FLOAT, GL_FALSE, nComponents*sizeof(GLfloat), (char*)0 + texCoordsMemOffset[i]);
+ }
+ else {
+ glDisableVertexAttribArray(attribID);
+ }
+ }
+
+ // attribute 8-11 (takes 4 vec4 attribs to represent a single mat4) = instance transform matrices (optional)
+ attribID = 8;
+ if (instance_xforms_.size()) {
+ glEnableVertexAttribArray(8);
+ glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, 16*sizeof(GLfloat), (char*)0 + instanceXformsMemOffset);
+ glVertexAttribDivisor(8, 1);
+ glEnableVertexAttribArray(9);
+ glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, 16*sizeof(GLfloat), (char*)0 + instanceXformsMemOffset + 4*sizeof(GLfloat));
+ glVertexAttribDivisor(9, 1);
+ glEnableVertexAttribArray(10);
+ glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, 16*sizeof(GLfloat), (char*)0 + instanceXformsMemOffset + 8*sizeof(GLfloat));
+ glVertexAttribDivisor(10, 1);
+ glEnableVertexAttribArray(11);
+ glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, 16*sizeof(GLfloat), (char*)0 + instanceXformsMemOffset + 12*sizeof(GLfloat));
+ glVertexAttribDivisor(11, 1);
+ }
+ else {
+ glDisableVertexAttribArray(8);
+ glDisableVertexAttribArray(9);
+ glDisableVertexAttribArray(10);
+ glDisableVertexAttribArray(11);
+ }
+
+ glBindVertexArray(0);
+
+ if (indices_.size()) {
+ glGenBuffers(1, &element_buffer_);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buffer_);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices_.size() * sizeof(unsigned int), &indices_[0], GL_STATIC_DRAW);
+ }
+
+
+ gpu_dirty_ = false;
+ }
+}
+
+
+void Mesh::BuildBVH() {
+ bvh_.CreateFromMesh(*this);
+ bvh_dirty_ = false;
+}
+
+
+BVH* Mesh::bvh_ptr() {
+ if (bvh_dirty_) {
+ BuildBVH();
+ }
+ return &bvh_;
+}
+
+
+void Mesh::Draw() {
+ if (gpu_dirty_) {
+ UpdateGPUMemory();
+ }
+
+ // set defaults to pass to shaders any for optional attribs
+ glVertexAttrib3f(1, 0.0, 0.0, 1.0); // normal = +Z
+ glVertexAttrib4f(2, 1.0, 1.0, 1.0, 1.0); // color = opaque white
+ glVertexAttrib2f(3, 0.0, 0.0); // uv = 0,0 for texture unit 0
+ glVertexAttrib2f(4, 0.0, 0.0); // uv = 0,0 for texture unit 1
+ glVertexAttrib2f(5, 0.0, 0.0); // uv = 0,0 for texture unit 2
+ glVertexAttrib2f(6, 0.0, 0.0); // uv = 0,0 for texture unit 3
+ glVertexAttrib2f(7, 0.0, 0.0); // uv = 0,0 for texture unit 4
+ glVertexAttrib4f(8, 1.0, 0.0, 0.0, 0.0); // instance transform col 1
+ glVertexAttrib4f(9, 0.0, 1.0, 0.0, 0.0); // instance transform col 2
+ glVertexAttrib4f(10, 0.0, 0.0, 1.0, 0.0); // instance transform col 3
+ glVertexAttrib4f(11, 0.0, 0.0, 0.0, 1.0); // instance transform col 4
+
+
+ glBindVertexArray(vertex_array_);
+
+ if (instance_xforms_.size()) {
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buffer_);
+ glDrawElementsInstanced(GL_TRIANGLES, (GLsizei)indices_.size(), GL_UNSIGNED_INT, (void*)0, (GLsizei)instance_xforms_.size()/16);
+ }
+ else if (indices_.size()) {
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buffer_);
+ glDrawElements(GL_TRIANGLES, (GLsizei)indices_.size(), GL_UNSIGNED_INT, (void*)0);
+ }
+ else {
+ glDrawArrays(GL_TRIANGLES, 0, num_vertices());
+ }
+
+ glBindVertexArray(0);
+}
+
+
+int Mesh::num_vertices() const {
+ return (int)verts_.size()/3;
+}
+
+int Mesh::num_triangles() const {
+ if (indices_.size()) {
+ return (int)indices_.size()/3;
+ }
+ else {
+ return (int)verts_.size()/9;
+ }
+}
+
+
+
+void Mesh::LoadFromOBJ(const std::string &filename) {
+ std::fstream file(filename.c_str(), std::ios::in);
+ if (!file) {
+ std::cerr << "Failed to load " + filename << std::endl;
+ exit(1);
+ }
+
+ // tmp arrays
+ std::vector<Point3> vertices;
+ std::vector<Vector3> normals;
+ std::vector<Point2> texCoords;
+
+ while (file) {
+ std::string line;
+ do
+ getline(file, line);
+ while (file && (line.length() == 0 || line[0] == '#'));
+ std::stringstream linestream(line);
+ std::string keyword;
+ linestream >> keyword;
+ if (keyword == "v") {
+ Point3 vertex;
+ linestream >> vertex[0] >> vertex[1] >> vertex[2];
+ vertices.push_back(vertex);
+ } else if (keyword == "vn") {
+ Vector3 normal;
+ linestream >> normal[0] >> normal[1] >> normal[2];
+ normals.push_back(normal);
+ } else if (keyword == "vt") {
+ Point2 texCoord;
+ linestream >> texCoord[0] >> texCoord[1];
+ texCoords.push_back(texCoord);
+ } else if (keyword == "f") {
+ std::vector<int> polygon;
+ std::string word;
+ while (linestream >> word) {
+ std::stringstream wstream(word);
+ int v;
+ wstream >> v;
+ polygon.push_back(v-1); // In OBJ files, indices start from 1
+ }
+ for (int i = 2; i < polygon.size(); i++) {
+ //triangles.push_back(ivec3(polygon[0], polygon[i-1], polygon[i]));
+ int i1 = polygon[0];
+ int i2 = polygon[(size_t)i-1];
+ int i3 = polygon[i];
+ //int t = AddTriangle(vertices[i1], vertices[i2], vertices[i3]);
+ //if (normals.size()) {
+ // SetNormals(t, normals[i1], normals[i2], normals[i3]);
+ //}
+ //if (texCoords.size()) {
+ // SetTexCoords(t, 0, texCoords[i1], texCoords[i2], texCoords[i3]);
+ //}
+
+ indices_.push_back(i1);
+ indices_.push_back(i2);
+ indices_.push_back(i3);
+ }
+ }
+ }
+
+ gpu_dirty_ = true;
+ std::vector<float> verts, norms, uvs;
+ for (int i=0;i<vertices.size();i++) {
+ verts_.push_back(vertices[i][0]);
+ verts_.push_back(vertices[i][1]);
+ verts_.push_back(vertices[i][2]);
+ if (normals.size()) {
+ norms_.push_back(normals[i][0]);
+ norms_.push_back(normals[i][1]);
+ norms_.push_back(normals[i][2]);
+ }
+ if (texCoords.size()) {
+ uvs.push_back(texCoords[i][0]);
+ uvs.push_back(texCoords[i][1]);
+ }
+ }
+ if (uvs.size()) {
+ tex_coords_.push_back(uvs);
+ }
+}
+
+
+
+Point3 Mesh::read_vertex_data(int i) const {
+ return Point3(verts_[(size_t)3*i], verts_[(size_t)3*i+1], verts_[(size_t)3*i+2]);
+}
+
+Vector3 Mesh::read_normal_data(int i) const {
+ return Vector3(norms_[(size_t)3*i], norms_[(size_t)3*i+1], norms_[(size_t)3*i+2]);
+}
+
+Color Mesh::read_color_data(int i) const {
+ return Color(colors_[(size_t)4*i], colors_[(size_t)4*i+1], colors_[(size_t)4*i+2], colors_[(size_t)4*i+3]);
+}
+
+Point2 Mesh::read_tex_coords_data(int textureUnit, int i) const {
+ return Point2(tex_coords_[textureUnit][(size_t)2*i], tex_coords_[textureUnit][(size_t)2*i+1]);
+}
+
+std::vector<unsigned int> Mesh::read_triangle_indices_data(int triangle_id) const {
+ std::vector<unsigned int> tri;
+ int i = 3*triangle_id;
+ if (indices_.size()) {
+ // indexed faces mode
+ tri.push_back(indices_[(size_t)i+0]);
+ tri.push_back(indices_[(size_t)i+1]);
+ tri.push_back(indices_[(size_t)i+2]);
+ }
+ else {
+ // ordered faces mode
+ tri.push_back(i);
+ tri.push_back(i+1);
+ tri.push_back(i+2);
+ }
+ return tri;
+}
+
+
+void Mesh::CalcPerFaceNormals() {
+ std::vector<Vector3> norms(num_vertices());
+ for (int i=0; i<num_triangles(); i++) {
+ std::vector<unsigned int> indices = read_triangle_indices_data(i);
+ Point3 a = read_vertex_data(indices[0]);
+ Point3 b = read_vertex_data(indices[1]);
+ Point3 c = read_vertex_data(indices[2]);
+ Vector3 n = Vector3::Cross(b-a, c-a).ToUnit();
+ norms[indices[0]] = n;
+ norms[indices[1]] = n;
+ norms[indices[2]] = n;
+ }
+ SetNormals(norms);
+}
+
+
+void Mesh::CalcPerVertexNormals() {
+ std::vector<Vector3> norms(num_vertices());
+ for (int i=0; i<num_triangles(); i++) {
+ std::vector<unsigned int> indices = read_triangle_indices_data(i);
+ Point3 a = read_vertex_data(indices[0]);
+ Point3 b = read_vertex_data(indices[1]);
+ Point3 c = read_vertex_data(indices[2]);
+ Vector3 n = Vector3::Cross(b-a, c-a);
+ norms[indices[0]] = norms[indices[0]] + n;
+ norms[indices[1]] = norms[indices[1]] + n;
+ norms[indices[2]] = norms[indices[2]] + n;
+ }
+
+ for (int i=0; i<norms.size(); i++) {
+ norms[i] = norms[i].ToUnit();
+ }
+
+ SetNormals(norms);
+}
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/mesh.h b/dev/MinGfx/src/mesh.h
new file mode 100644
index 0000000..74f2a2f
--- /dev/null
+++ b/dev/MinGfx/src/mesh.h
@@ -0,0 +1,337 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_MESH_H_
+#define SRC_MESH_H_
+
+
+
+#include "bvh.h"
+#include "color.h"
+#include "opengl_headers.h"
+#include "point2.h"
+#include "point3.h"
+#include "vector3.h"
+
+#include <vector>
+
+
+namespace mingfx {
+
+class Matrix4;
+
+/** A triangle mesh data structure that can be rendered with a ShaderProgram
+ like DefaultShader. The mesh can be created algorithmically by adding triangles
+ one at a time or it can be loaded from an .obj file.
+
+ Vertices are required -- you cannot have a mesh without vertices, but other
+ attributes (normals, colors, texture coordinates) are optional. When Draw()
+ is called the mesh will automatically set these other attributes if available.
+
+ Example of loading from a file:
+ ~~~
+ // during initialization
+ Mesh m;
+ m.LoadFromOBJ(Platform::FindMinGfxDataFile("teapot.obj"));
+ // also create a shader to draw it.
+ DefaultShader s;
+
+
+ // later to draw
+ Matrix4 M;
+ Matrix4 V = Matrix4::LookAt(Point3(0,0,3), Point3(0,0,0), Vector3(0,1,0));
+ Matrix4 P = Matrix4::Perspective(60.0, aspect_ratio(), 0.1, 10.0);
+ s.Draw(M, V, P, m, DefaultShader::MaterialProperties());
+ ~~~
+
+ Example of creating a mesh algorithmically:
+ ~~~
+ Mesh mesh1;
+ int tri_id;
+ // add a first triangle
+ tri_id = mesh1.AddTriangle(Point3(0,0,0), Point3(1,0,0), Point3(1,1,0));
+ // set attributes for the vertices
+ mesh1.SetNormals(tri_id, Vector3(0,0,1), Vector3(0,0,1), Vector3(0,0,1));
+ mesh1.SetTexCoords(tri_id, 0, Point2(0,1), Point2(1,1), Point2(1,0));
+
+ // add a second triangle and attributes
+ tri_id = mesh1.AddTriangle(Point3(0,0,0), Point3(1,1,0), Point3(0,1,0));
+ mesh1.SetNormals(tri_id, Vector3(0,0,1), Vector3(0,0,1), Vector3(0,0,1));
+ mesh1.SetTexCoords(tri_id, 0, Point2(0,1), Point2(1,0), Point2(0,0));
+
+ // call this when done to save to the GPU
+ mesh1.UpdateGPUMemory();
+
+ // then you can draw the same way as in the previous example.
+ ~~~
+ In the mode used above where you add one triangle at a time there is no way to
+ reuse vertices in multiple triangles. If you need to do this for efficiency
+ or other reasons, then you can use an indexed faces mode where you set the
+ mesh data structures directly.
+
+ Example of creating a mesh that renders in an indexed faces mode:
+ ~~~
+ std::vector<unsigned int> indices;
+ std::vector<Point3> vertices;
+ std::vector<Vector3> normals;
+ std::vector<Point2> texcoords;
+
+ // four vertices, each requires 3 floats: (x,y,z)
+ vertices.push_back(Point3(0,0,0));
+ vertices.push_back(Point3(1,0,0));
+ vertices.push_back(Point3(1,1,0));
+ vertices.push_back(Point3(0,1,0));
+
+ // four normals, each requires 3 floats: (x,y,z)
+ normals.push_back(Vector3(0,0,1));
+ normals.push_back(Vector3(0,0,1));
+ normals.push_back(Vector3(0,0,1));
+ normals.push_back(Vector3(0,0,1));
+
+ // four texture coords, each requires 2 floats: (u,v)
+ texcoords.push_back(Point2(0,1));
+ texcoords.push_back(Point2(1,1));
+ texcoords.push_back(Point2(1,0));
+ texcoords.push_back(Point2(0,0));
+
+ // indices into the arrays above for the first triangle
+ indices.push_back(0);
+ indices.push_back(1);
+ indices.push_back(2);
+
+ // indices for the second triangle, note some are reused
+ indices.push_back(0);
+ indices.push_back(2);
+ indices.push_back(3);
+
+ Mesh mesh1;
+ mesh1.SetVertices(vertices);
+ mesh1.SetNormals(normals);
+ mesh1.SetTexCoords(0, texcoords);
+ mesh1.SetIndices(indices);
+ mesh1.UpdateGPUMemory();
+
+ // then you can draw the same way as in the previous example.
+ ~~~
+ */
+class Mesh {
+public:
+ /// Creates an empty mesh.
+ Mesh();
+
+ /// Copies all data and sets GPU dirty bit for the new mesh.
+ Mesh(const Mesh &other);
+
+ virtual ~Mesh();
+
+
+ /** This reads a mesh stored in the common Wavefront Obj file format. The
+ loader here is simplistic and not guaranteed to work on all valid .obj
+ files, but it should work on many simple ones. UpdateGPUMemory() is
+ called automatically after the model is loaded. */
+ void LoadFromOBJ(const std::string &filename);
+
+
+
+ // ---- TRIANGLE LIST MODE ----
+ // No indices are stored, each set of 3 vertices forms a triangle, and if the
+ // triangles share vertices, those vertices need to be repeated.
+
+ /** Adds a triangle to the mesh datastructure and returns a triangle ID.
+ The ID should then be used as the first argument for follow-on calls to
+ SetNormals(), SetColors(), and SetTexCoords(). The vertices must be
+ specified in counter-clockwise order so that the normal of the triangle
+ can be determined following the right-hand rule. */
+ int AddTriangle(Point3 v1, Point3 v2, Point3 v3);
+
+ /** Updates the vertex positions for a triangle that has already been added
+ to the mesh. */
+ void UpdateTriangle(int triangle_id, Point3 v1, Point3 v2, Point3 v3);
+
+ /** Sets the normals for the three vertices of a triangle that has already
+ been added to the mesh */
+ void SetNormals(int triangle_id, Vector3 n1, Vector3 n2, Vector3 n3);
+
+ /** Sets per-vertex colors for the three vertices of a triangle that has already
+ been added to the mesh */
+ void SetColors(int triangle_id, Color c1, Color c2, Color c3);
+
+ /** Sets the texture coordinates for the three vertices of a triangle that
+ has already been added to the mesh. The first textureUnit is 0, and you
+ should always use 0 for this parameter unless you are doing multi-texturing. */
+ void SetTexCoords(int triangle_id, int texture_unit, Point2 uv1, Point2 uv2, Point2 uv3);
+
+
+
+ // ---- INDEXED TRIANGLES MODE ----
+ // Vertices are stored in an array and indices are stored in a separate array
+ // each set of 3 indices into the vertex array defines one triangle. Here,
+ // you cannot add one triangle at a time to the mesh. Instead you must set
+ // the arrays of indices, vertices, and other attributes for the mesh at
+ // once.
+
+ /// Sets the vertex array for the mesh directly.
+ void SetVertices(const std::vector<Point3> &verts);
+
+ /// Sets the normal array for the mesh directly.
+ void SetNormals(const std::vector<Vector3> &norms);
+
+ /// Sets the per-vertex colors array for the mesh directly.
+ void SetColors(const std::vector<Color> &colors);
+
+ /// Sets a texture coordinates array for the mesh directly.
+ void SetTexCoords(int texture_unit, const std::vector<Point2> &tex_coords);
+
+ /// Sets the indices into the vertex array to use to create the triangles.
+ /// Each consecutive set of 3 indices forms one triangle:
+ /// (v1,v2,v3), (v1,v2,v3), (v1,v2,v3), ...
+ void SetIndices(const std::vector<unsigned int> index_array);
+
+
+ void SetInstanceTransforms(const std::vector<Matrix4> &xforms);
+
+
+ // ---- These functions can be used instead of the above if you are working with
+ // regular C-style arrays and floats rather than the higher level types like
+ // Point3 and Vector3. ----
+
+ /// Sets the vertex array for the mesh directly. Vertices are stored as
+ /// (x,y,z), (x,y,z), (x,y,z), ...
+ /// This version of the function accepts a C-style array rather than std::vector<>
+ void SetVertices(float *verts_array, int num_verts);
+
+ /// Sets the normal array for the mesh directly. Normals are stored as
+ /// (x,y,z), (x,y,z), (x,y,z), ... following the same ordering as was used
+ /// for SetVertices().
+ /// This version of the function accepts a C-style array rather than std::vector<>
+ void SetNormals(float *norms_array, int num_norms);
+
+ /// Sets the per-vertex colors array for the mesh directly. Colors are stored as
+ /// (r,g,b,a), (r,g,b,a), (r,g,b,a), ... following the same ordering as was used
+ /// for SetVertices().
+ /// This version of the function accepts a C-style array rather than std::vector<>
+ void SetColors(float *colors_array, int num_colors);
+
+ /// Sets a texture coordinates array for the mesh directly. Tex coords are stored as
+ /// (u,v), (u,v), (u,v), ... following the same ordering as was used
+ /// for SetVertices().
+ /// This version of the function accepts a C-style array rather than std::vector<>
+ void SetTexCoords(int texture_unit, float *tex_coords_array, int num_tex_coords);
+
+ /// Sets the indices into the vertex array to use to create the triangles.
+ /// Each consecutive set of 3 indices forms one triangle:
+ /// (v1,v2,v3), (v1,v2,v3), (v1,v2,v3), ...
+ /// This version of the function accepts a C-style array rather than std::vector<>
+ void SetIndices(unsigned int *index_array, int num_indices);
+
+
+
+ /** This copies the entire mesh data structure to a vertex array in GPU memory,
+ which must happen before you can draw the mesh. For large meshes, this can
+ take some time, so you may want to call this during initialization immediately
+ after generating the mesh. If you do not, it will be called automatically
+ for you the first time Draw() is called. If the mesh contains normals, per-
+ vertex colors and/or texture coordinates these are added as attributes within
+ the vertex array. */
+ void UpdateGPUMemory();
+
+ /** This sends the mesh vertices and attributes down the graphics pipe using
+ glDrawArrays() for the non-indexed mode and glDrawElements() for the indexed
+ mode. This is just the geometry -- for anything to show up on the screen,
+ you must already have a ShaderProgram enabled before calling this function. */
+ void Draw();
+
+
+
+ /** This (re)calculates the normals for the mesh and stores them with the mesh
+ data structure. It assumes a faceted mesh, like a cube, where each triangle
+ has separate vertices. The normal is calculated for each triangle face and
+ then the result is associated with each vertex that makes up the triangle.
+ If you have a smooth mesh where vertices are shared between multiple faces
+ then use CalcPerVertexNormals() instead. */
+ void CalcPerFaceNormals();
+
+ /** This (re)calculates the normals for the mesh and stores them with the mesh
+ data structure. It assumes a smooth mesh, like a sphere, where each vertex
+ belongs to one or more triangles. Each vertex normal is calculated as a
+ weighted sum of the face normals for adjacent faces. The weighting is based
+ upon the relative areas of the neighboring faces (i.e., a large neighboring
+ triangle contributes more to the vertex normal than a small one). */
+ void CalcPerVertexNormals();
+
+
+ /** This (re)calculates a Bounding Volume Hierarchy for the mesh, which can
+ be used together with Ray::FastIntersectMesh() to do faster ray-mesh
+ intersection testing. */
+ void BuildBVH();
+
+ /** Returns a pointer to the underlying BVH data structure. If the data
+ struture has not yet been build or needs to be updated due to a change in
+ the geometry of the mesh, then the BVH is recalculated before returning
+ the pointer. */
+ BVH* bvh_ptr();
+
+ // Access to properties indexed by vertex number
+
+ /// The total number of vertices in the mesh.
+ int num_vertices() const;
+
+ /// Read only access to the vertex position data. Data are returned as a Point3. Indexed by vertex number. Also see num_vertices().
+ /// Use the SetVertices() function to set (or edit) vertex data.
+ Point3 read_vertex_data(int vertex_id) const;
+
+ /// Read only access to per-vertex normal data. Data are returned as a Vector3. Indexed by vertex number. Also see num_vertices().
+ /// Use the SetNormals() function to set (or edit) per-vertex normal data.
+ Vector3 read_normal_data(int vertex_id) const;
+
+ /// Read only access to per-vertex color data. Data are returned as a Color. Indexed by vertex number. Also see num_vertices().
+ /// Use the SetColors() function to set (or edit) per-vertex color data.
+ Color read_color_data(int vertex_id) const;
+
+ /// Read only access to per-vertex texture coordinates data. Data are returned as a Point2. Indexed by vertex number. Also see num_vertices().
+ /// Use the SetTexCoords() function to set (or edit) per-vertex tex coords.
+ Point2 read_tex_coords_data(int texture_unit, int vertex_id) const;
+
+
+ // Access to triangles
+
+ /// The total number of triangles in the mesh.
+ int num_triangles() const;
+
+ /// Read only access to the indices that make up a particular triangle. Data are returned as a 3-element array
+ // of unsigned ints. Use the SetIndices() function to set (or edit) the indices for the mesh.
+ std::vector<unsigned int> read_triangle_indices_data(int triangle_id) const;
+
+
+private:
+ std::vector<float> verts_;
+ std::vector<float> norms_;
+ std::vector<float> colors_;
+ std::vector< std::vector<float> > tex_coords_;
+ std::vector<unsigned int> indices_;
+ std::vector<float> instance_xforms_;
+
+ bool gpu_dirty_;
+ GLuint vertex_buffer_;
+ GLuint vertex_array_;
+ GLuint element_buffer_;
+
+ bool bvh_dirty_;
+ BVH bvh_;
+};
+
+
+} // end namespace
+
+
+#endif
diff --git a/dev/MinGfx/src/mingfx.h b/dev/MinGfx/src/mingfx.h
new file mode 100644
index 0000000..51ea0f8
--- /dev/null
+++ b/dev/MinGfx/src/mingfx.h
@@ -0,0 +1,46 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+
+/// \file mingfx.h Includes the entire MinGfx library and calls using namespace mingfx
+
+#ifndef SRC_MINGFX_H_
+#define SRC_MINGFX_H_
+
+#include "aabb.h"
+#include "bvh.h"
+#include "color.h"
+#include "craft_cam.h"
+#include "default_shader.h"
+#include "gfxmath.h"
+#include "graphics_app.h"
+#include "matrix4.h"
+#include "mesh.h"
+#include "mingfx_config.h"
+#include "opengl_headers.h"
+#include "platform.h"
+#include "point2.h"
+#include "point3.h"
+#include "quaternion.h"
+#include "quick_shapes.h"
+#include "ray.h"
+#include "shader_program.h"
+#include "text_shader.h"
+#include "texture2d.h"
+#include "unicam.h"
+#include "vector2.h"
+#include "vector3.h"
+
+//using namespace mingfx;
+
+#endif
diff --git a/dev/MinGfx/src/mingfx_config.h.in b/dev/MinGfx/src/mingfx_config.h.in
new file mode 100644
index 0000000..eeaf230
--- /dev/null
+++ b/dev/MinGfx/src/mingfx_config.h.in
@@ -0,0 +1,25 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+// The file config.h.in is processed by cmake to produce config.h. This
+// replaces strings of the form "at"CMAKE_VARIABLE_NAME"at" with the value
+// of the corresponding cmake variable, allowing us to pass directory paths
+// and other information configured with cmake into our C++ code.
+
+
+#define MINGFX_DATA_DIR_BUILD "@CMAKE_CURRENT_SOURCE_DIR@/data"
+#define MINGFX_DATA_DIR_INSTALL "@CMAKE_INSTALL_PREFIX@/@INSTALL_DATA_DEST@"
+
+#define MINGFX_SHADERS_DIR_BUILD "@CMAKE_CURRENT_SOURCE_DIR@/src/shaders"
+#define MINGFX_SHADERS_DIR_INSTALL "@CMAKE_INSTALL_PREFIX@/@INSTALL_SHADERS_DEST@"
+
diff --git a/dev/MinGfx/src/opengl_headers.h b/dev/MinGfx/src/opengl_headers.h
new file mode 100644
index 0000000..a220277
--- /dev/null
+++ b/dev/MinGfx/src/opengl_headers.h
@@ -0,0 +1,48 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+// We often use the code that is commented out below to load opengl headers in a cross-platform way,
+// but since nanogui uses glad internally, we will just use their approach to load opengl headers
+// so that everything is consistent.
+
+// disable warnings for this 3rd party code
+#pragma warning ( push, 0 )
+#include <nanogui/opengl.h>
+#pragma warning ( pop )
+
+
+/*** Our typical (non-nanogui) appraoch:
+
+// GLEW is needed on Windows and Linux
+#ifdef _WIN32
+#include "GL/glew.h"
+#include "GL/wglew.h"
+#elif (!defined(__APPLE__))
+#include "GL/glxew.h"
+#endif
+
+// OpenGL Headers
+#if defined(WIN32)
+#define NOMINMAX
+#include <windows.h>
+#include <GL/gl.h>
+#elif defined(__APPLE__)
+#define GL_GLEXT_PROTOTYPES
+#include <OpenGL/gl3.h>
+#include <OpenGL/glext.h>
+#else
+#define GL_GLEXT_PROTOTYPES
+#include <GL/gl.h>
+#endif
+
+***/ \ No newline at end of file
diff --git a/dev/MinGfx/src/platform.cc b/dev/MinGfx/src/platform.cc
new file mode 100644
index 0000000..5d941b6
--- /dev/null
+++ b/dev/MinGfx/src/platform.cc
@@ -0,0 +1,78 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "platform.h"
+
+#include "mingfx_config.h"
+
+#include <vector>
+#include <sstream>
+
+#ifdef WIN32
+ #include <windows.h>
+#else
+ #include <sys/stat.h>
+#endif
+
+
+namespace mingfx {
+
+bool Platform::FileExists(const std::string &filename) {
+#ifdef WIN32
+ LPCTSTR szPath = (LPCTSTR)filename.c_str();
+ DWORD dwAttrib = GetFileAttributes(szPath);
+ return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
+ !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
+#else
+ struct stat buf;
+ return (stat(filename.c_str(), &buf) == 0);
+#endif
+}
+
+
+std::string Platform::FindFile(const std::string &basename, const std::vector<std::string> &searchpath) {
+ for (int i=0; i<searchpath.size(); i++) {
+ std::string fname = searchpath[i] + "/" + basename;
+ if (Platform::FileExists(fname)) {
+ return fname;
+ }
+ }
+ return basename;
+}
+
+std::string Platform::FindFile(const std::string &basename, const std::string &searchpath) {
+ std::vector<std::string> paths;
+ std::stringstream ss(searchpath);
+ std::string path;
+ while (ss >> path) {
+ paths.push_back(path);
+ if (ss.peek() == ';')
+ ss.ignore();
+ }
+ return FindFile(basename, paths);
+}
+
+
+std::string Platform::FindMinGfxDataFile(const std::string &basename) {
+ std::vector<std::string> searchpath;
+ searchpath.push_back(".");
+ searchpath.push_back("data");
+ searchpath.push_back(MINGFX_DATA_DIR_INSTALL);
+ searchpath.push_back(MINGFX_DATA_DIR_BUILD);
+ return FindFile(basename, searchpath);
+}
+
+std::string Platform::FindMinGfxShaderFile(const std::string &basename) {
+ std::vector<std::string> searchpath;
+ searchpath.push_back(".");
+ searchpath.push_back("shaders");
+ searchpath.push_back(MINGFX_SHADERS_DIR_INSTALL);
+ searchpath.push_back(MINGFX_SHADERS_DIR_BUILD);
+ return FindFile(basename, searchpath);
+}
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/platform.h b/dev/MinGfx/src/platform.h
new file mode 100644
index 0000000..e609756
--- /dev/null
+++ b/dev/MinGfx/src/platform.h
@@ -0,0 +1,83 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_PLATFORM_H_
+#define SRC_PLATFORM_H_
+
+#include <string>
+#include <vector>
+
+namespace mingfx {
+
+
+/** Provides access to the underlying file system and other platform-specific
+ routines.
+ */
+class Platform {
+public:
+
+ /// True if filename is found and can be opened for reading on the system
+ static bool FileExists(const std::string &filename);
+
+ /* Looks for a file named basename in each of the paths specified. If found,
+ the full path to the file is returned. If not found, then basename is returned.
+ Example:
+ ~~~
+ std::vector<std::string> search_path;
+ search_path.push_back(".");
+ search_path.push_back("./data");
+ search_path.push_back("./shaders");
+ search_path.push_back("/usr/local/share/blah/blah/data");
+
+ std::string file = Platform::findFile("mydata.csv", search_path);
+ ~~~
+ */
+ static std::string FindFile(const std::string &basename, const std::vector<std::string> &searchpath);
+
+ /* Looks for a file named basename in each of the paths specified in a semi-colon
+ separated list. If found, the full path to the file is returned. If not found,
+ then basename is returned. Example:
+ ~~~
+ std::string search_path = ".;./data;./shaders;/usr/local/share/blah/blah/data";
+ std::string file = Platform::findFile("mydata.csv", search_path);
+ ~~~
+ */
+ static std::string FindFile(const std::string &basename, const std::string &searchpath);
+
+ /** Searches for a data file that ships with MinGfx. This will look in the
+ following locations in order:
+ 1. the current working directory.
+ 2. a subdirectory called data within the current working directory.
+ 3. the installed data directory INSTALL_PREFIX/share/MinGfx-1.0/data.
+ 4. the data directory in the MinGfx build tree.
+ If the file is found, the full path is returned, else basename is returned.
+ */
+ static std::string FindMinGfxDataFile(const std::string &basename);
+
+ /** Searches for a shader file that ships with MinGfx. This will look in the
+ following locations in order:
+ 1. the current working directory.
+ 2. a subdirectory called shaders within the current working directory.
+ 3. the installed shaders directory INSTALL_PREFIX/share/MinGfx-1.0/shaders.
+ 4. the shaders directory in the MinGfx build tree.
+ If the file is found, the full path is returned, else basename is returned.
+ */
+ static std::string FindMinGfxShaderFile(const std::string &basename);
+
+private:
+};
+
+
+} // end namespace
+
+#endif
diff --git a/dev/MinGfx/src/point2.cc b/dev/MinGfx/src/point2.cc
new file mode 100644
index 0000000..9d98777
--- /dev/null
+++ b/dev/MinGfx/src/point2.cc
@@ -0,0 +1,104 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "point2.h"
+
+#include <math.h>
+
+namespace mingfx {
+
+static const Point2 s_zerop2d = Point2(0,0);
+static const Point2 s_onep2d = Point2(1,1);
+
+const Point2& Point2::Origin() { return s_zerop2d; }
+const Point2& Point2::Zero() { return s_zerop2d; }
+const Point2& Point2::One() { return s_onep2d; }
+
+
+Point2::Point2() {
+ p[0] = 0.0;
+ p[1] = 0.0;
+}
+
+Point2::Point2(float x, float y) {
+ p[0] = x;
+ p[1] = y;
+}
+
+Point2::Point2(float *ptr) {
+ p[0] = ptr[0];
+ p[1] = ptr[1];
+}
+
+Point2::Point2(const Point2& other) {
+ p[0] = other[0];
+ p[1] = other[1];
+}
+
+Point2::~Point2() {
+}
+
+bool Point2::operator==(const Point2& other) const {
+ return (fabs(other[0] - p[0]) < MINGFX_MATH_EPSILON &&
+ fabs(other[1] - p[1]) < MINGFX_MATH_EPSILON);
+}
+
+bool Point2::operator!=(const Point2& other) const {
+ return (fabs(other[0] - p[0]) >= MINGFX_MATH_EPSILON ||
+ fabs(other[1] - p[1]) >= MINGFX_MATH_EPSILON);
+}
+
+Point2& Point2::operator=(const Point2& other) {
+ p[0] = other[0];
+ p[1] = other[1];
+ return *this;
+}
+
+float Point2::operator[](const int i) const {
+ if ((i>=0) && (i<=1)) {
+ return p[i];
+ }
+ else {
+ // w component of a point is 1 so return the constant 1.0
+ return 1.0;
+ }
+}
+
+float& Point2::operator[](const int i) {
+ return p[i];
+}
+
+
+Point2 Point2::Lerp(const Point2 &b, float alpha) const {
+ float x = (1.0f-alpha)*(*this)[0] + alpha*b[0];
+ float y = (1.0f-alpha)*(*this)[1] + alpha*b[1];
+ return Point2(x,y);
+}
+
+Point2 Point2::Lerp(const Point2 &a, const Point2 &b, float alpha) {
+ float x = (1.0f-alpha)*a[0] + alpha*b[0];
+ float y = (1.0f-alpha)*a[1] + alpha*b[1];
+ return Point2(x,y);
+}
+
+
+const float * Point2::value_ptr() const {
+ return p;
+}
+
+
+std::ostream & operator<< ( std::ostream &os, const Point2 &p) {
+ return os << "(" << p[0] << ", " << p[1] << ")";
+}
+
+std::istream & operator>> ( std::istream &is, Point2 &p) {
+ // format: (x, y)
+ char dummy;
+ return is >> dummy >> p[0] >> dummy >> p[1] >> dummy;
+}
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/point2.h b/dev/MinGfx/src/point2.h
new file mode 100644
index 0000000..954f313
--- /dev/null
+++ b/dev/MinGfx/src/point2.h
@@ -0,0 +1,112 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_POINT2_H_
+#define SRC_POINT2_H_
+
+#include <iostream>
+
+namespace mingfx {
+
+/// Epsilon value used for == and != comparisons within MinGfx
+#define MINGFX_MATH_EPSILON 1e-8
+
+
+/** A 2D Point with floating point coordinates, used for storing 2D texture
+ coordinates, screen-space graphics, and mouse input.
+ */
+class Point2 {
+public:
+ /// Default point at the origin
+ Point2();
+
+ /// Constructs a point given (x,y,1), where the 1 comes from the use of
+ /// homogeneous coordinates in computer graphics.
+ Point2(float x, float y);
+
+ /// Constructs a point given a pointer to x,y data
+ Point2(float *p);
+
+ /// Copy constructor for point
+ Point2(const Point2& p);
+
+ /// Point destructor
+ virtual ~Point2();
+
+ /// Check for "equality", taking floating point imprecision into account
+ bool operator==(const Point2& p) const;
+
+ /// Check for "inequality", taking floating point imprecision into account
+ bool operator!=(const Point2& p) const;
+
+ /// Assignment operator
+ Point2& operator=(const Point2& p);
+
+ /// Read only access to the ith coordinate of the point.
+ float operator[](const int i) const;
+
+ /// Returns a reference to the ith coordinate of the point. Use this
+ /// accessor if you wish to set the coordinate rather than just request
+ /// its value. Example:
+ /// ~~~
+ /// Point2 a;
+ /// a[0] = 5.0; // set the x-coordinate of the point
+ /// ~~~
+ float& operator[](const int i);
+
+ /// Read only access to the x coordinate. Can also use my_point[0]. Use
+ /// the my_point[0] = 1.0; form if you need to set the value.
+ float x() const { return p[0]; }
+
+ /// Read only access to the y coordinate. Can also use my_point[1]. Use
+ /// the my_point[1] = 1.0; form if you need to set the value.
+ float y() const { return p[1]; }
+
+ /// In homogeneous coordinates, the w coordinate for all points is 1.0.
+ float w() const { return 1.0; }
+
+
+ /// Returns a const pointer to the raw data array
+ const float * value_ptr() const;
+
+ /// Linear interpolation between this point and another. Alpha=0.0 returns
+ /// this point, and alpha=1.0 returns the other point, other values blend
+ /// between the two.
+ Point2 Lerp(const Point2 &b, float alpha) const;
+
+
+ /// (0,0) - a shortcut for a special point that is frequently needed
+ static const Point2& Origin();
+
+ /// (0,0) - a shortcut for a special point that is frequently needed
+ static const Point2& Zero();
+
+ /// (1,1) - a shortcut for a special point that is frequently needed
+ static const Point2& One();
+
+ /// Linear interpolation between two points. Alpha=0.0 returns 'a' and
+ /// alpha=1.0 returns 'b', other values blend between the two.
+ static Point2 Lerp(const Point2 &a, const Point2 &b, float alpha);
+
+private:
+ float p[2];
+};
+
+
+std::ostream & operator<< ( std::ostream &os, const Point2 &p);
+std::istream & operator>> ( std::istream &is, Point2 &p);
+
+
+} // namespace
+
+#endif
diff --git a/dev/MinGfx/src/point3.cc b/dev/MinGfx/src/point3.cc
new file mode 100644
index 0000000..c75a18e
--- /dev/null
+++ b/dev/MinGfx/src/point3.cc
@@ -0,0 +1,144 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "point3.h"
+#include "vector3.h"
+
+#include <math.h>
+
+namespace mingfx {
+
+static const Point3 s_zerop3d = Point3(0,0,0);
+static const Point3 s_onep3d = Point3(1,1,1);
+
+const Point3& Point3::Origin() { return s_zerop3d; }
+const Point3& Point3::Zero() { return s_zerop3d; }
+const Point3& Point3::One() { return s_onep3d; }
+
+
+Point3::Point3() {
+ p[0] = 0.0;
+ p[1] = 0.0;
+ p[2] = 0.0;
+}
+
+Point3::Point3(float x, float y, float z) {
+ p[0] = x;
+ p[1] = y;
+ p[2] = z;
+}
+
+Point3::Point3(float *ptr) {
+ p[0] = ptr[0];
+ p[1] = ptr[1];
+ p[2] = ptr[2];
+}
+
+Point3::Point3(const Point3& other) {
+ p[0] = other[0];
+ p[1] = other[1];
+ p[2] = other[2];
+}
+
+Point3::~Point3() {
+}
+
+bool Point3::operator==(const Point3& other) const {
+ return (fabs(other[0] - p[0]) < MINGFX_MATH_EPSILON &&
+ fabs(other[1] - p[1]) < MINGFX_MATH_EPSILON &&
+ fabs(other[2] - p[2]) < MINGFX_MATH_EPSILON);
+}
+
+bool Point3::operator!=(const Point3& other) const {
+ return (fabs(other[0] - p[0]) >= MINGFX_MATH_EPSILON ||
+ fabs(other[1] - p[1]) >= MINGFX_MATH_EPSILON ||
+ fabs(other[2] - p[2]) >= MINGFX_MATH_EPSILON);
+}
+
+Point3& Point3::operator=(const Point3& other) {
+ p[0] = other[0];
+ p[1] = other[1];
+ p[2] = other[2];
+ return *this;
+}
+
+float Point3::operator[](const int i) const {
+ if ((i>=0) && (i<=2)) {
+ return p[i];
+ }
+ else {
+ // w component of a point is 1 so return the constant 1.0
+ return 1.0;
+ }
+}
+
+float& Point3::operator[](const int i) {
+ return p[i];
+}
+
+
+const float * Point3::value_ptr() const {
+ return p;
+}
+
+Point3 Point3::Lerp(const Point3 &b, float alpha) const {
+ float x = (1.0f-alpha)*(*this)[0] + alpha*b[0];
+ float y = (1.0f-alpha)*(*this)[1] + alpha*b[1];
+ float z = (1.0f-alpha)*(*this)[2] + alpha*b[2];
+ return Point3(x,y,z);
+}
+
+Point3 Point3::Lerp(const Point3 &a, const Point3 &b, float alpha) {
+ float x = (1.0f-alpha)*a[0] + alpha*b[0];
+ float y = (1.0f-alpha)*a[1] + alpha*b[1];
+ float z = (1.0f-alpha)*a[2] + alpha*b[2];
+ return Point3(x,y,z);
+}
+
+
+float Point3::DistanceToPlane(const Point3 &plane_origin, const Vector3 &plane_normal) {
+ return ((*this) - ClosestPointOnPlane(plane_origin, plane_normal)).Length();
+}
+
+
+Point3 Point3::ClosestPointOnPlane(const Point3 &plane_origin, const Vector3 &plane_normal) {
+ Vector3 to_plane_origin = plane_origin - (*this);
+ Vector3 inv_n = -plane_normal;
+ if (to_plane_origin.Dot(inv_n) < 0.0) {
+ inv_n = -inv_n;
+ }
+
+ Vector3 to_plane = inv_n * to_plane_origin.Dot(inv_n);
+ return (*this) + to_plane;
+}
+
+Point3 Point3::ClosestPoint(const std::vector<Point3> &point_list) {
+ int closest_id = 0;
+ float closest_dist = (point_list[0] - *this).Length();
+ for (int i=1; i<point_list.size(); i++) {
+ float d = (point_list[i] - *this).Length();
+ if (d < closest_dist) {
+ closest_id = i;
+ closest_dist = d;
+ }
+ }
+ return point_list[closest_id];
+}
+
+
+
+std::ostream & operator<< ( std::ostream &os, const Point3 &p) {
+ return os << "(" << p[0] << ", " << p[1] << ", " << p[2] << ")";
+}
+
+std::istream & operator>> ( std::istream &is, Point3 &p) {
+ // format: (x, y, z)
+ char dummy;
+ return is >> dummy >> p[0] >> dummy >> p[1] >> dummy >> p[2] >> dummy;
+}
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/point3.h b/dev/MinGfx/src/point3.h
new file mode 100644
index 0000000..50783f0
--- /dev/null
+++ b/dev/MinGfx/src/point3.h
@@ -0,0 +1,154 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_POINT3_H_
+#define SRC_POINT3_H_
+
+#include <iostream>
+#include <vector>
+
+namespace mingfx {
+
+/// Epsilon value used for == and != comparisons within MinGfx
+#define MINGFX_MATH_EPSILON 1e-8
+
+// forward declaration
+class Vector3;
+
+
+/** A 3D Point with floating point coordinates, used for storing vertices and
+ all sorts of other 3D graphics operations. Point3s can be transformed by a
+ Matrix4. Example:
+ ~~~
+ Point3 a(0,0,1);
+ std::cout << a << std::endl;
+
+ Matrix4 M = Matrix4::Translation(Vector3(0,0,-1));
+ Point3 b = M * a;
+ std::cout << b << std::endl;
+
+ // you can access the individual components of the point in two ways:
+ Point3 p(1,2,3);
+ float option1 = p.x();
+ float option2 = p[0];
+
+ // to set an individual component of the point use the [] operator:
+ Point3 p2;
+ p2[0] = 0.4;
+ p2[1] = 1.2;
+ p2[2] = 3.1;
+ ~~~
+ */
+class Point3 {
+public:
+ /// Default point at the origin
+ Point3();
+
+ /// Constructs a point given (x,y,z,1), where the 1 comes from the use of
+ /// homogeneous coordinates in computer graphics.
+ Point3(float x, float y, float z);
+
+ /// Constructs a point given a pointer to x,y,z data
+ Point3(float *p);
+
+ /// Copy constructor for point
+ Point3(const Point3& p);
+
+ /// Point destructor
+ virtual ~Point3();
+
+ /// Check for "equality", taking floating point imprecision into account
+ bool operator==(const Point3& p) const;
+
+ /// Check for "inequality", taking floating point imprecision into account
+ bool operator!=(const Point3& p) const;
+
+ /// Assignment operator
+ Point3& operator=(const Point3& p);
+
+ /// Read only access to the ith coordinate of the point.
+ float operator[](const int i) const;
+
+ /// Returns a reference to the ith coordinate of the point. Use this
+ /// accessor if you wish to set the coordinate rather than just request
+ /// its value. Example:
+ /// ~~~
+ /// Point3 a;
+ /// a[0] = 5.0; // set the x-coordinate of the point
+ /// ~~~
+ float& operator[](const int i);
+
+ /// Read only access to the x coordinate. Can also use my_point[0]. Use
+ /// the my_point[0] = 1.0; form if you need to set the value.
+ float x() const { return p[0]; }
+
+ /// Read only access to the y coordinate. Can also use my_point[1]. Use
+ /// the my_point[1] = 1.0; form if you need to set the value.
+ float y() const { return p[1]; }
+
+ /// Read only access to the z coordinate. Can also use my_point[2]. Use
+ /// the my_point[2] = 1.0; form if you need to set the value.
+ float z() const { return p[2]; }
+
+ /// In homogeneous coordinates, the w coordinate for all points is 1.0.
+ float w() const { return 1.0; }
+
+ /// Returns a const pointer to the raw data array
+ const float * value_ptr() const;
+
+
+ /// Linear interpolation between this point and another. Alpha=0.0 returns
+ /// this point, and alpha=1.0 returns the other point, other values blend
+ /// between the two.
+ Point3 Lerp(const Point3 &b, float alpha) const;
+
+ /// Returns the shortest (i.e., perpendicular) distance from this point to
+ /// a plane defined by a point and a normal.
+ float DistanceToPlane(const Point3 &plane_origin, const Vector3 &plane_normal);
+
+ /// Returns the perpendicular projection of this point onto a plane defined
+ /// by a point and a normal.
+ Point3 ClosestPointOnPlane(const Point3 &plane_origin, const Vector3 &plane_normal);
+
+ /// Given a list of points, returns the closest in the last to the current point.
+ Point3 ClosestPoint(const std::vector<Point3> &point_list);
+
+
+
+ /// (0,0,0) - a shortcut for a special point that is frequently needed
+ static const Point3& Origin();
+
+ /// (0,0,0) - a shortcut for a special point that is frequently needed
+ static const Point3& Zero();
+
+ /// (1,1,1) - a shortcut for a special point that is frequently needed
+ static const Point3& One();
+
+ /// Linear interpolation between two points. Alpha=0.0 returns 'a' and
+ /// alpha=1.0 returns 'b', other values blend between the two.
+ static Point3 Lerp(const Point3 &a, const Point3 &b, float alpha);
+
+
+
+private:
+ float p[3];
+};
+
+
+std::ostream & operator<< ( std::ostream &os, const Point3 &p);
+std::istream & operator>> ( std::istream &is, Point3 &p);
+
+
+} // namespace
+
+#endif
diff --git a/dev/MinGfx/src/quaternion.cc b/dev/MinGfx/src/quaternion.cc
new file mode 100644
index 0000000..4f2998f
--- /dev/null
+++ b/dev/MinGfx/src/quaternion.cc
@@ -0,0 +1,260 @@
+/*
+Copyright (c) 2017,2018 Regents of the University of Minnesota.
+All Rights Reserved.
+See corresponding header file for details.
+*/
+
+#define _USE_MATH_DEFINES
+#include "quaternion.h"
+
+#include "gfxmath.h"
+
+namespace mingfx {
+
+
+Quaternion::Quaternion() {
+ q[0] = 0.0;
+ q[1] = 0.0;
+ q[2] = 0.0;
+ q[3] = 1.0;
+}
+
+Quaternion::Quaternion(float qx, float qy, float qz, float qw) {
+ q[0] = qx;
+ q[1] = qy;
+ q[2] = qz;
+ q[3] = qw;
+}
+
+Quaternion::Quaternion(float *ptr) {
+ q[0] = ptr[0];
+ q[1] = ptr[1];
+ q[2] = ptr[2];
+ q[3] = ptr[3];
+}
+
+Quaternion::Quaternion(const Quaternion& other) {
+ q[0] = other[0];
+ q[1] = other[1];
+ q[2] = other[2];
+ q[3] = other[3];
+}
+
+Quaternion::~Quaternion() {
+}
+
+bool Quaternion::operator==(const Quaternion& other) const {
+ return (fabs(other[0] - q[0]) < MINGFX_MATH_EPSILON &&
+ fabs(other[1] - q[1]) < MINGFX_MATH_EPSILON &&
+ fabs(other[2] - q[2]) < MINGFX_MATH_EPSILON &&
+ fabs(other[3] - q[3]) < MINGFX_MATH_EPSILON);
+}
+
+bool Quaternion::operator!=(const Quaternion& other) const {
+ return (fabs(other[0] - q[0]) >= MINGFX_MATH_EPSILON ||
+ fabs(other[1] - q[1]) >= MINGFX_MATH_EPSILON ||
+ fabs(other[2] - q[2]) >= MINGFX_MATH_EPSILON ||
+ fabs(other[3] - q[3]) >= MINGFX_MATH_EPSILON);
+}
+
+Quaternion& Quaternion::operator=(const Quaternion& other) {
+ q[0] = other[0];
+ q[1] = other[1];
+ q[2] = other[2];
+ q[3] = other[3];
+ return *this;
+}
+
+float Quaternion::operator[](const int i) const {
+ if ((i>=0) && (i<=3)) {
+ return q[i];
+ }
+ else {
+ // this is an error!
+ return 0.0;
+ }
+}
+
+float& Quaternion::operator[](const int i) {
+ return q[i];
+}
+
+
+const float * Quaternion::value_ptr() const {
+ return q;
+}
+
+Quaternion Quaternion::Slerp(const Quaternion &other, float alpha) const {
+ // https://en.wikipedia.org/wiki/Slerp
+
+ Quaternion v0 = *this;
+ Quaternion v1 = other;
+
+ // Only unit quaternions are valid rotations.
+ // Normalize to avoid undefined behavior.
+ v0.Normalize();
+ v1.Normalize();
+
+ // Compute the cosine of the angle between the two vectors.
+ float dot = v0.Dot(v1);
+
+ // If the dot product is negative, the quaternions
+ // have opposite handed-ness and slerp won't take
+ // the shorter path. Fix by reversing one quaternion.
+ if (dot < 0.0f) {
+ v1 = -v1;
+ dot = -dot;
+ }
+
+ const double DOT_THRESHOLD = 0.9995;
+ if (dot > DOT_THRESHOLD) {
+ // If the inputs are too close for comfort, linearly interpolate
+ // and normalize the result.
+
+ Quaternion result = v0 + alpha*(v1 - v0);
+ result.Normalize();
+ return result;
+ }
+
+ GfxMath::Clamp(dot, -1, 1); // Robustness: Stay within domain of acos()
+ float theta_0 = acos(dot); // theta_0 = angle between input vectors
+ float theta = theta_0 * alpha; // theta = angle between v0 and result
+
+ float s0 = cos(theta) - dot * sin(theta) / sin(theta_0); // == sin(theta_0 - theta) / sin(theta_0)
+ float s1 = sin(theta) / sin(theta_0);
+
+ return (s0 * v0) + (s1 * v1);
+}
+
+Quaternion Quaternion::Slerp(const Quaternion &a, const Quaternion &b, float alpha) {
+ return a.Slerp(b, alpha);
+}
+
+
+std::ostream & operator<< ( std::ostream &os, const Quaternion &q) {
+ return os << "<" << q[0] << ", " << q[1] << ", " << q[2] << ", " << q[3] << ")";
+}
+
+std::istream & operator>> ( std::istream &is, Quaternion &q) {
+ // format: <qx, qy, qz, qw>
+ char dummy;
+ return is >> dummy >> q[0] >> dummy >> q[1] >> dummy >> q[2] >> dummy >> q[3] >> dummy;
+}
+
+
+float Quaternion::Dot(const Quaternion& other) const {
+ return q[0]*other[0] + q[1]*other[1] + q[2]*other[2] + q[3]*other[3];
+
+}
+
+float Quaternion::Length() const {
+ return sqrt(q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]);
+}
+
+void Quaternion::Normalize() {
+ float sizeSq = + q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3];
+ if (sizeSq < MINGFX_MATH_EPSILON) {
+ return; // do nothing to zero quats
+ }
+ float scaleFactor = (float)1.0/(float)sqrt(sizeSq);
+ q[0] *= scaleFactor;
+ q[1] *= scaleFactor;
+ q[2] *= scaleFactor;
+ q[3] *= scaleFactor;
+}
+
+Quaternion Quaternion::ToUnit() const {
+ Quaternion qtmp(*this);
+ qtmp.Normalize();
+ return qtmp;
+}
+
+/// Returns the conjugate of the quaternion.
+Quaternion Quaternion::Conjugate() const {
+ return Quaternion(-q[0], -q[1], -q[2], q[3]);
+}
+
+
+Quaternion Quaternion::FromAxisAngle(const Vector3 &axis, float angle) {
+ // [qx, qy, qz, qw] = [sin(a/2) * vx, sin(a/2)* vy, sin(a/2) * vz, cos(a/2)]
+ float x = sin(angle/2.0f) * axis[0];
+ float y = sin(angle/2.0f) * axis[1];
+ float z = sin(angle/2.0f) * axis[2];
+ float w = cos(angle/2.0f);
+ return Quaternion(x,y,z,w);
+}
+
+
+Quaternion Quaternion::FromEulerAnglesZYX(const Vector3 &angles) {
+ Quaternion rot_x = Quaternion::FromAxisAngle(Vector3::UnitX(), angles[0]);
+ Quaternion rot_y = Quaternion::FromAxisAngle(Vector3::UnitY(), angles[1]);
+ Quaternion rot_z = Quaternion::FromAxisAngle(Vector3::UnitZ(), angles[2]);
+ return rot_z * rot_y * rot_x;
+}
+
+Vector3 Quaternion::ToEulerAnglesZYX() const {
+ // https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
+
+ Vector3 angles;
+
+ // roll (x-axis rotation)
+ float sinr = +2.0f * (w() * x() + y() * z());
+ float cosr = +1.0f - 2.0f * (x() * x() + y() * y());
+ angles[0] = std::atan2(sinr, cosr);
+
+ // pitch (y-axis rotation)
+ float sinp = +2.0f * (w() * y() - z() * x());
+ if (std::fabs(sinp) >= 1.f)
+ angles[1] = std::copysign(GfxMath::HALF_PI, sinp); // use 90 degrees if out of range
+ else
+ angles[1] = std::asin(sinp);
+
+ // yaw (z-axis rotation)
+ float siny = +2.0f * (w() * z() + x() * y());
+ float cosy = +1.0f - 2.0f * (y() * y() + z() * z());
+ angles[2] = std::atan2(siny, cosy);
+
+ return angles;
+}
+
+
+Quaternion operator*(const Quaternion& q1, const Quaternion& q2) {
+ float real1 = q1[3];
+ Vector3 imag1 = Vector3(q1[0], q1[1], q1[2]);
+
+ float real2 = q2[3];
+ Vector3 imag2 = Vector3(q2[0], q2[1], q2[2]);
+
+ float real = real1*real2 - imag1.Dot(imag2);
+ Vector3 imag = real1*imag2 + real2*imag1 + imag1.Cross(imag2);
+
+ return Quaternion(imag[0], imag[1], imag[2], real);
+}
+
+
+Quaternion operator/(const Quaternion& q, const float s) {
+ const float invS = 1.0f / s;
+ return Quaternion(q[0]*invS, q[1]*invS, q[2]*invS, q[3]*invS);
+}
+
+Quaternion operator*(const float s, const Quaternion& q) {
+ return Quaternion(q[0]*s, q[1]*s, q[2]*s, q[3]*s);
+}
+
+Quaternion operator*(const Quaternion& q, const float s) {
+ return Quaternion(q[0]*s, q[1]*s, q[2]*s, q[3]*s);
+}
+
+Quaternion operator-(const Quaternion& q) {
+ return Quaternion(-q[0], -q[1], -q[2], -q[3]);
+}
+
+Quaternion operator+(const Quaternion& q1, const Quaternion& q2) {
+ return Quaternion(q1[0] + q2[0], q1[1] + q2[1], q1[2] + q2[2], q1[3] + q2[3]);
+}
+
+Quaternion operator-(const Quaternion& q1, const Quaternion& q2) {
+ return Quaternion(q1[0] - q2[0], q1[1] - q2[1], q1[2] - q2[2], q1[3] - q2[3]);
+}
+
+} // end namespace
diff --git a/dev/MinGfx/src/quaternion.h b/dev/MinGfx/src/quaternion.h
new file mode 100644
index 0000000..fc69ba7
--- /dev/null
+++ b/dev/MinGfx/src/quaternion.h
@@ -0,0 +1,142 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_QUATERNION_H_
+#define SRC_QUATERNION_H_
+
+#include <iostream>
+
+#include "vector3.h"
+
+namespace mingfx {
+
+/** A quaternion to represent rotations in 3D space. The main use of quaternions
+ within the library is to support smooth interpolation between rotations, since
+ this is not possible using Euler angles or rotation matrices. The class includes
+ a Slerp routine for spherical interpolation between rotations. Example use:
+ ~~~
+ // find a rotation 1/2 way between r1 and r2, both originally expressed in Euler angles
+
+ Vector3 euler1 = GfxMath::ToRadians(Vector3(0,0,60));
+ Vector3 euler2 = GfxMath::ToRadians(Vector3(45,45,60));
+
+ Quaternion q1 = Quaternion::FromEulerAnglesZYX(euler1);
+ Quaternion q2 = Quaternion::FromEulerAnglesZYX(euler2);
+
+ float alpha = 0.5;
+ Quaternion q_half_way = q1.Slerp(q2, alpha);
+ Vector3 new_euler_angles = GfxMath::ToDegrees(q_half_way.ToEulerAnglesZYX());
+ ~~~
+ */
+class Quaternion {
+public:
+ /// Creates a quat with the identity rotation
+ Quaternion();
+
+ /// Creates a quat from the 4 parameters
+ Quaternion(float qx, float qy, float qz, float qw);
+
+ /// Creates a quate from a pointer to 4 floating point numbers in the order
+ /// qx, qy, qz, qw.
+ Quaternion(float *ptr);
+
+ /// Copy constructor
+ Quaternion(const Quaternion& other);
+
+ virtual ~Quaternion();
+
+ /// Check for "equality", taking floating point imprecision into account
+ bool operator==(const Quaternion& q) const;
+
+ /// Check for "inequality", taking floating point imprecision into account
+ bool operator!=(const Quaternion& q) const;
+
+ /// Assignment operator
+ Quaternion& operator=(const Quaternion& q);
+
+ /// Read only access to the ith coordinate of the quaternion (qx, qy, qz, qw).
+ float operator[](const int i) const;
+
+ /// Writable access the ith coordinate of the quaternion (qx, qy, qz, qw).
+ float& operator[](const int i);
+
+ /// Read only access to the x coordinate of the imaginary part of the quaternion.
+ float x() const { return q[0]; }
+
+ /// Read only access to the y coordinate of the imaginary part of the quaternion.
+ float y() const { return q[1]; }
+
+ /// Read only access to the z coordinate of the imaginary part of the quaternion.
+ float z() const { return q[2]; }
+
+ /// Read only access to the w, real part, of the quaternion.
+ float w() const { return q[3]; }
+
+ /// Returns a const pointer to the raw data array, stored in the order qx, qy, qz, qw.
+ const float * value_ptr() const;
+
+ /// Returns the dot product of this quaternion with another.
+ float Dot(const Quaternion& q) const;
+
+ /// Returns the length of the quaternion.
+ float Length() const;
+
+ /// Normalizes the quat by making it unit length.
+ void Normalize();
+
+ /// Returns a normalized (i.e., unit length) version of the quaternion without
+ /// modifying the original.
+ Quaternion ToUnit() const;
+
+ /// Returns the conjugate of the quaternion.
+ Quaternion Conjugate() const;
+
+ /// Converts the rotation specified by the quaternion into Euler angles.
+ Vector3 ToEulerAnglesZYX() const;
+
+ /// Uses spherical interpolation to interpoloate between the rotation stored
+ /// in this quaternion and the rotation stored in another.
+ Quaternion Slerp(const Quaternion &other, float alpha) const;
+
+ /// Creates a new quaternion that describes a rotation by angle radians about
+ // the specified axis.
+ static Quaternion FromAxisAngle(const Vector3 &axis, float angle);
+
+ /// Creates a new quaternion from a rotation defined in Euler angles.
+ static Quaternion FromEulerAnglesZYX(const Vector3 &angles);
+
+ /// Uses spherical interpolation to interpoloate between the rotations
+ /// specified by two quaternions.
+ static Quaternion Slerp(const Quaternion &a, const Quaternion &b, float alpha);
+
+private:
+ float q[4];
+};
+
+
+Quaternion operator*(const Quaternion& q1, const Quaternion& q2);
+Quaternion operator/(const Quaternion& q, const float s);
+Quaternion operator*(const float s, const Quaternion& q);
+Quaternion operator*(const Quaternion& q, const float s);
+Quaternion operator-(const Quaternion& q);
+Quaternion operator+(const Quaternion& q1, const Quaternion& q2);
+Quaternion operator-(const Quaternion& q1, const Quaternion& q2);
+
+std::ostream & operator<< ( std::ostream &os, const Quaternion &q);
+std::istream & operator>> ( std::istream &is, Quaternion &q);
+
+
+} // end namespace
+
+
+#endif
diff --git a/dev/MinGfx/src/quick_shapes.cc b/dev/MinGfx/src/quick_shapes.cc
new file mode 100644
index 0000000..388aa3d
--- /dev/null
+++ b/dev/MinGfx/src/quick_shapes.cc
@@ -0,0 +1,727 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "quick_shapes.h"
+#include "platform.h"
+
+#include <cmath>
+#include <iostream>
+#include <string>
+
+
+namespace mingfx {
+
+
+
+#define PI 3.14159265359f
+#define TWOPI 6.28318530718f
+
+
+
+// Helper datastructure for building shapes algorithmically
+class Vertex {
+public:
+ Vertex(GLfloat xx, GLfloat yy, GLfloat zz, GLfloat nnx, GLfloat nny, GLfloat nnz) :
+ x(xx), y(yy), z(zz), nx(nnx), ny(nny), nz(nnz) {}
+
+ GLfloat x;
+ GLfloat y;
+ GLfloat z;
+ GLfloat nx;
+ GLfloat ny;
+ GLfloat nz;
+};
+
+
+
+
+QuickShapes::QuickShapes() {
+}
+
+QuickShapes::~QuickShapes() {
+}
+
+
+
+
+// ------------ CUBE ------------
+
+
+void QuickShapes::initCube() {
+ GLfloat vertices[] = {
+ 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f,-1.0f, 1.0f, // v0-v1-v2 (front)
+ -1.0f,-1.0f, 1.0f, 1.0f,-1.0f, 1.0f, 1.0f, 1.0f, 1.0f, // v2-v3-v0
+
+ 1.0f, 1.0f, 1.0f, 1.0f,-1.0f, 1.0f, 1.0f,-1.0f,-1.0f, // v0-v3-v4 (right)
+ 1.0f,-1.0f,-1.0f, 1.0f, 1.0f,-1.0f, 1.0f, 1.0f, 1.0f, // v4-v5-v0
+
+ 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,-1.0f, -1.0f, 1.0f,-1.0f, // v0-v5-v6 (top)
+ -1.0f, 1.0f,-1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, // v6-v1-v0
+
+ -1.0f, 1.0f, 1.0f, -1.0f, 1.0f,-1.0f, -1.0f,-1.0f,-1.0f, // v1-v6-v7 (left)
+ -1.0f,-1.0f,-1.0f, -1.0f,-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, // v7-v2-v1.0
+
+ -1.0f,-1.0f,-1.0f, 1.0f,-1.0f,-1.0f, 1.0f,-1.0f, 1.0f, // v7-v4-v3 (bottom)
+ 1.0f,-1.0f, 1.0f, -1.0f,-1.0f, 1.0f, -1.0f,-1.0f,-1.0f, // v3-v2-v7
+
+ 1.0f,-1.0f,-1.0f, -1.0f,-1.0f,-1.0f, -1.0f, 1.0f,-1.0f, // v4-v7-v6 (back)
+ -1.0f, 1.0f,-1.0f, 1.0f, 1.0f,-1.0f, 1.0f,-1.0f,-1.0f // v6-v5-v4
+ };
+
+ GLfloat normals[] = {
+ 0, 0, 1, 0, 0, 1, 0, 0, 1, // v0-v1-v2 (front)
+ 0, 0, 1, 0, 0, 1, 0, 0, 1, // v2-v3-v0
+
+ 1, 0, 0, 1, 0, 0, 1, 0, 0, // v0-v3-v4 (right)
+ 1, 0, 0, 1, 0, 0, 1, 0, 0, // v4-v5-v0
+
+ 0, 1, 0, 0, 1, 0, 0, 1, 0, // v0-v5-v6 (top)
+ 0, 1, 0, 0, 1, 0, 0, 1, 0, // v6-v1-v0
+
+ -1, 0, 0, -1, 0, 0, -1, 0, 0, // v1-v6-v7 (left)
+ -1, 0, 0, -1, 0, 0, -1, 0, 0, // v7-v2-v1
+
+ 0,-1, 0, 0,-1, 0, 0,-1, 0, // v7-v4-v3 (bottom)
+ 0,-1, 0, 0,-1, 0, 0,-1, 0, // v3-v2-v7
+
+ 0, 0,-1, 0, 0,-1, 0, 0,-1, // v4-v7-v6 (back)
+ 0, 0,-1, 0, 0,-1, 0, 0,-1 // v6-v5-v4
+ };
+
+ cubeMesh_.SetVertices(vertices, 36);
+ cubeMesh_.SetNormals(normals, 36);
+ cubeMesh_.UpdateGPUMemory();
+}
+
+
+void QuickShapes::DrawCube(const Matrix4 &modelMatrix, const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix, const Color &color)
+{
+ if (cubeMesh_.num_vertices() == 0) {
+ initCube();
+ }
+ defaultMaterial_.ambient_reflectance = color;
+ defaultMaterial_.diffuse_reflectance = color;
+ defaultMaterial_.surface_texture = emptyTex_;
+ defaultShader_.Draw(modelMatrix, viewMatrix, projectionMatrix, &cubeMesh_, defaultMaterial_);
+}
+
+
+
+
+// ------------ SQUARE ------------
+
+
+void QuickShapes::initSquare() {
+ GLfloat vertices[] = {
+ 1.0f, 0.0f, 1.0f, 1.0f, 0.0f,-1.0f, -1.0f, 0.0f,-1.0f, // v0-v5-v6 (top)
+ -1.0f, 0.0f,-1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f // v6-v1-v0
+ };
+
+ GLfloat normals[] = {
+ 0, 1, 0, 0, 1, 0, 0, 1, 0,
+ 0, 1, 0, 0, 1, 0, 0, 1, 0
+ };
+
+ GLfloat texcoords[] = {
+ 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f
+ };
+
+ squareMesh_.SetVertices(vertices, 6);
+ squareMesh_.SetNormals(normals, 6);
+ squareMesh_.SetTexCoords(0, texcoords, 6);
+ squareMesh_.UpdateGPUMemory();
+}
+
+
+void QuickShapes::DrawSquare(const Matrix4 &modelMatrix, const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix, const Color &color)
+{
+ if (squareMesh_.num_vertices() == 0) {
+ initSquare();
+ }
+ defaultMaterial_.ambient_reflectance = color;
+ defaultMaterial_.diffuse_reflectance = color;
+ defaultMaterial_.surface_texture = emptyTex_;
+ defaultShader_.Draw(modelMatrix, viewMatrix, projectionMatrix, &squareMesh_, defaultMaterial_);
+}
+
+
+void QuickShapes::DrawSquare(const Matrix4 &modelMatrix, const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix, const Color &color,
+ const Texture2D &tex)
+{
+ if (squareMesh_.num_vertices() == 0) {
+ initSquare();
+ }
+ defaultMaterial_.ambient_reflectance = color;
+ defaultMaterial_.diffuse_reflectance = color;
+ defaultMaterial_.surface_texture = tex;
+ defaultShader_.Draw(modelMatrix, viewMatrix, projectionMatrix, &squareMesh_, defaultMaterial_);
+}
+
+
+
+
+
+// ------------ CYLINDER ------------
+
+
+void QuickShapes::initCyl() {
+
+ std::vector<Vertex> verts;
+
+ Vertex top(0,1,0, 0,1,0);
+ Vertex bot(0,-1,0, 0,-1,0);
+
+ const int nslices = 20;
+ for (int s=1; s<nslices+1; s++) {
+ int slast = s - 1;
+ GLfloat xlast = std::cosf(-TWOPI * (float)slast / (float)nslices);
+ GLfloat zlast = std::sinf(-TWOPI * (float)slast/(float)nslices);
+ GLfloat xnew = std::cosf(-TWOPI * (float)(s)/(float)nslices);
+ GLfloat znew = std::sinf(-TWOPI * (float)(s)/(float)nslices);
+
+ // one triangle on the top
+ verts.push_back(top);
+ verts.push_back(Vertex(xlast,1,zlast, 0,1,0));
+ verts.push_back(Vertex(xnew,1,znew, 0,1,0));
+
+ // two triangles to create a rect on the side
+ verts.push_back(Vertex(xlast,1,zlast, xlast,0,zlast));
+ verts.push_back(Vertex(xlast,-1,zlast, xlast,0,zlast));
+ verts.push_back(Vertex(xnew,1,znew, xnew,0,znew));
+
+ verts.push_back(Vertex(xnew,-1,znew, xnew,0,znew));
+ verts.push_back(Vertex(xnew,1,znew, xnew,0,znew));
+ verts.push_back(Vertex(xlast,-1,zlast, xlast,0,zlast));
+
+ // one triangle on the bottom
+ verts.push_back(bot);
+ verts.push_back(Vertex(xnew,-1,znew, 0,-1,0));
+ verts.push_back(Vertex(xlast,-1,zlast, 0,-1,0));
+ }
+
+ std::vector<Point3> vertices;
+ std::vector<Vector3> normals;
+ for (int i=0; i<verts.size(); i++) {
+ vertices.push_back(Point3(verts[i].x, verts[i].y, verts[i].z));
+ normals.push_back(Vector3(verts[i].nx, verts[i].ny, verts[i].nz));
+ }
+ cylMesh_.SetVertices(vertices);
+ cylMesh_.SetNormals(normals);
+ cylMesh_.UpdateGPUMemory();
+}
+
+
+void QuickShapes::DrawCylinder(const Matrix4 &modelMatrix, const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix, const Color &color)
+{
+ if (cylMesh_.num_vertices() == 0) {
+ initCyl();
+ }
+ defaultMaterial_.ambient_reflectance = color;
+ defaultMaterial_.diffuse_reflectance = color;
+ defaultMaterial_.surface_texture = emptyTex_;
+ defaultShader_.Draw(modelMatrix, viewMatrix, projectionMatrix, &cylMesh_, defaultMaterial_);
+}
+
+
+
+
+// ------------ CONE ------------
+
+
+void QuickShapes::initCone() {
+
+ std::vector<Vertex> verts;
+
+ Vertex top(0,1,0, 0,1,0);
+ Vertex bot(0,-1,0, 0,-1,0);
+
+ const int nslices = 20;
+ for (int s=1; s<nslices+1; s++) {
+ int slast = s - 1;
+ GLfloat xlast = std::cosf(-TWOPI * (float)slast/(float)nslices);
+ GLfloat zlast = std::sinf(-TWOPI * (float)slast/(float)nslices);
+ GLfloat xnew = std::cosf(-TWOPI * (float)(s)/(float)nslices);
+ GLfloat znew = std::sinf(-TWOPI * (float)(s)/(float)nslices);
+
+ // one triangle on the side
+ // normals are a bit more complex than for other shapes...
+ Vector3 nlast = Vector3(xlast, 2, zlast).ToUnit();
+ Vector3 nnew = Vector3(xnew, 2, znew).ToUnit();
+ Vector3 ntop = 0.5*(nlast + nnew);
+
+ verts.push_back(Vertex(top.x, top.y, top.z, ntop[0], ntop[1], ntop[2]));
+ verts.push_back(Vertex(xlast,-1,zlast, nlast[0], nlast[1], nlast[2]));
+ verts.push_back(Vertex(xnew,-1,znew, nnew[0], nnew[1], nnew[2]));
+
+ // one triangle on the bottom
+ verts.push_back(bot);
+ verts.push_back(Vertex(xnew,-1,znew, 0,-1,0));
+ verts.push_back(Vertex(xlast,-1,zlast, 0,-1,0));
+ }
+
+ std::vector<Point3> vertices;
+ std::vector<Vector3> normals;
+ for (int i = 0; i < verts.size(); i++) {
+ vertices.push_back(Point3(verts[i].x, verts[i].y, verts[i].z));
+ normals.push_back(Vector3(verts[i].nx, verts[i].ny, verts[i].nz));
+ }
+
+ coneMesh_.SetVertices(vertices);
+ coneMesh_.SetNormals(normals);
+ coneMesh_.UpdateGPUMemory();
+}
+
+
+void QuickShapes::DrawCone(const Matrix4 &modelMatrix, const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix, const Color &color)
+{
+ if (coneMesh_.num_vertices() == 0) {
+ initCone();
+ }
+ defaultMaterial_.ambient_reflectance = color;
+ defaultMaterial_.diffuse_reflectance = color;
+ defaultMaterial_.surface_texture = emptyTex_;
+ defaultShader_.Draw(modelMatrix, viewMatrix, projectionMatrix, &coneMesh_, defaultMaterial_);
+}
+
+
+
+
+
+// ------------ SPHERE ------------
+
+
+void QuickShapes::initSph() {
+
+ std::vector<Vertex> verts;
+
+ Vertex top(0,1,0, 0,1,0);
+ Vertex bot(0,-1,0, 0,-1,0);
+
+ const int nslices = 40;
+ const int nstacks = 40;
+ for (int s=1; s<nslices+1; s++) {
+ int slast = s - 1;
+ GLfloat xlast = std::cosf(-TWOPI * (float)slast/(float)nslices);
+ GLfloat zlast = std::sinf(-TWOPI * (float)slast/(float)nslices);
+ GLfloat xnew = std::cosf(-TWOPI * (float)(s)/(float)nslices);
+ GLfloat znew = std::sinf(-TWOPI * (float)(s)/(float)nslices);
+
+ float stackstep = PI/(float)nstacks;
+
+ // one triangle on the top
+ verts.push_back(top);
+ verts.push_back(Vertex(std::sinf(stackstep)*xlast,std::cosf(stackstep),std::sinf(stackstep)*zlast,
+ std::sinf(stackstep)*xlast,std::cosf(stackstep),std::sinf(stackstep)*zlast));
+ verts.push_back(Vertex(std::sinf(stackstep)*xnew,std::cosf(stackstep),std::sinf(stackstep)*znew,
+ std::sinf(stackstep)*xnew,std::cosf(stackstep),std::sinf(stackstep)*znew));
+
+ for (int t=2; t<nstacks; t++) {
+ int tlast = t - 1;
+ GLfloat ylast = std::cosf(PI*(float)(tlast)/(float)nstacks);
+ GLfloat ynew = std::cosf(PI*(float)(t)/(float)nstacks);
+
+ GLfloat rlast = std::sinf(PI * (float)(tlast)/(float)nstacks);
+ GLfloat rnew = std::sinf(PI * (float)(t)/(float)nstacks);
+
+ // two triangles to create a rect on the side
+ verts.push_back(Vertex(rlast*xlast,ylast,rlast*zlast, rlast*xlast,ylast,rlast*zlast));
+ verts.push_back(Vertex(rnew*xlast,ynew,rnew*zlast, rnew*xlast,ynew,rnew*zlast));
+ verts.push_back(Vertex(rnew*xnew,ynew,rnew*znew, rnew*xnew,ynew,rnew*znew));
+
+ verts.push_back(Vertex(rnew*xnew,ynew,rnew*znew, rnew*xnew,ynew,rnew*znew));
+ verts.push_back(Vertex(rlast*xnew,ylast,rlast*znew, rlast*xnew,ylast,rlast*znew));
+ verts.push_back(Vertex(rlast*xlast,ylast,rlast*zlast, rlast*xlast,ylast,rlast*zlast));
+ }
+
+ // one triangle on the bottom
+ verts.push_back(bot);
+ verts.push_back(Vertex(std::sinf(stackstep)*xnew,std::cosf(PI-stackstep),std::sinf(stackstep)*znew,
+ std::sinf(stackstep)*xnew,std::cosf(PI-stackstep),std::sinf(stackstep)*znew));
+ verts.push_back(Vertex(std::sinf(stackstep)*xlast,std::cosf(PI-stackstep),std::sinf(stackstep)*zlast,
+ std::sinf(stackstep)*xlast,std::cosf(PI-stackstep),std::sinf(stackstep)*zlast));
+ }
+
+ std::vector<Point3> vertices;
+ std::vector<Vector3> normals;
+ for (int i = 0; i < verts.size(); i++) {
+ vertices.push_back(Point3(verts[i].x, verts[i].y, verts[i].z));
+ normals.push_back(Vector3(verts[i].nx, verts[i].ny, verts[i].nz));
+ }
+ sphereMesh_.SetVertices(vertices);
+ sphereMesh_.SetNormals(normals);
+ sphereMesh_.UpdateGPUMemory();
+}
+
+
+void QuickShapes::DrawSphere(const Matrix4 &modelMatrix, const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix, const Color &color)
+{
+ if (sphereMesh_.num_vertices() == 0) {
+ initSph();
+ }
+ defaultMaterial_.ambient_reflectance = color;
+ defaultMaterial_.diffuse_reflectance = color;
+ defaultMaterial_.surface_texture = emptyTex_;
+ defaultShader_.Draw(modelMatrix, viewMatrix, projectionMatrix, &sphereMesh_, defaultMaterial_);
+}
+
+
+
+
+// ------------ BRUSH ------------
+
+
+void QuickShapes::initBrush() {
+
+ // Raw vertices -- points that make up the brush geometry
+ const GLfloat v[19][3] = {
+ { 0.5f, 0.0f, 0.0f}, // 0
+ {-0.5f, 0.0f, 0.0f}, // 1
+
+ { 0.5f, 0.1f, 0.25f}, // 2
+ {-0.5f, 0.1f, 0.25f}, // 3
+ { 0.5f, 0.1f, 0.75f}, // 4
+ {-0.5f, 0.1f, 0.75f}, // 5
+ { 0.1f, 0.06f, 1.0f}, // 6
+ {-0.1f, 0.06f, 1.0f}, // 7
+ { 0.15f, 0.1f, 1.75f}, // 8
+ {-0.15f, 0.1f, 1.75f}, // 9
+
+ { 0.0f, 0.0f, 1.85f}, // 10
+
+ { 0.5f, -0.1f, 0.25f}, // 11
+ {-0.5f, -0.1f, 0.25f}, // 12
+ { 0.5f, -0.1f, 0.75f}, // 13
+ {-0.5f, -0.1f, 0.75f}, // 14
+ { 0.1f, -0.06f, 1.0f}, // 15
+ {-0.1f, -0.06f, 1.0f}, // 16
+ { 0.15f, -0.1f, 1.75f}, // 17
+ {-0.15f, -0.1f, 1.75f} // 18
+ };
+
+
+ // Vertices arranged into triangles
+ const GLfloat verts[34][3][3] = {
+ // top
+ {{v[0][0], v[0][1], v[0][2]}, {v[1][0], v[1][1], v[1][2]}, {v[2][0], v[2][1], v[2][2]}},
+ {{v[1][0], v[1][1], v[1][2]}, {v[3][0], v[3][1], v[3][2]}, {v[2][0], v[2][1], v[2][2]}},
+
+ {{v[2][0], v[2][1], v[2][2]}, {v[3][0], v[3][1], v[3][2]}, {v[4][0], v[4][1], v[4][2]}},
+ {{v[3][0], v[3][1], v[3][2]}, {v[5][0], v[5][1], v[5][2]}, {v[4][0], v[4][1], v[4][2]}},
+
+ {{v[4][0], v[4][1], v[4][2]}, {v[5][0], v[5][1], v[5][2]}, {v[6][0], v[6][1], v[6][2]}},
+ {{v[5][0], v[5][1], v[5][2]}, {v[7][0], v[7][1], v[7][2]}, {v[6][0], v[6][1], v[6][2]}},
+
+ {{v[6][0], v[6][1], v[6][2]}, {v[7][0], v[7][1], v[7][2]}, {v[8][0], v[8][1], v[8][2]}},
+ {{v[7][0], v[7][1], v[7][2]}, {v[9][0], v[9][1], v[9][2]}, {v[8][0], v[8][1], v[8][2]}},
+
+ {{v[8][0], v[8][1], v[8][2]}, {v[9][0], v[9][1], v[9][2]}, {v[10][0], v[10][1], v[10][2]}},
+
+ // bottom
+ {{v[0][0], v[0][1], v[0][2]}, {v[12][0], v[12][1], v[12][2]}, {v[1][0], v[1][1], v[1][2]}},
+ {{v[11][0], v[11][1], v[11][2]}, {v[12][0], v[12][1], v[12][2]}, {v[0][0], v[0][1], v[0][2]}},
+
+ {{v[11][0], v[11][1], v[11][2]}, {v[14][0], v[14][1], v[14][2]}, {v[12][0], v[12][1], v[12][2]}},
+ {{v[13][0], v[13][1], v[13][2]}, {v[14][0], v[14][1], v[14][2]}, {v[11][0], v[11][1], v[11][2]}},
+
+ {{v[13][0], v[13][1], v[13][2]}, {v[16][0], v[16][1], v[16][2]}, {v[14][0], v[14][1], v[14][2]}},
+ {{v[15][0], v[15][1], v[15][2]}, {v[16][0], v[16][1], v[16][2]}, {v[13][0], v[13][1], v[13][2]}},
+
+ {{v[15][0], v[15][1], v[15][2]}, {v[18][0], v[18][1], v[18][2]}, {v[16][0], v[16][1], v[16][2]}},
+ {{v[17][0], v[17][1], v[17][2]}, {v[18][0], v[18][1], v[18][2]}, {v[15][0], v[15][1], v[15][2]}},
+
+ {{v[18][0], v[18][1], v[18][2]}, {v[17][0], v[17][1], v[17][2]}, {v[10][0], v[10][1], v[10][2]}},
+
+ // one side
+ {{v[11][0], v[11][1], v[11][2]}, {v[0][0], v[0][1], v[0][2]}, {v[2][0], v[2][1], v[2][2]}},
+
+ {{v[11][0], v[11][1], v[11][2]}, {v[2][0], v[2][1], v[2][2]}, {v[4][0], v[4][1], v[4][2]}},
+ {{v[4][0], v[4][1], v[4][2]}, {v[13][0], v[13][1], v[13][2]}, {v[11][0], v[11][1], v[11][2]}},
+
+ {{v[13][0], v[13][1], v[13][2]}, {v[4][0], v[4][1], v[4][2]}, {v[6][0], v[6][1], v[6][2]}},
+ {{v[6][0], v[6][1], v[6][2]}, {v[15][0], v[15][1], v[15][2]}, {v[13][0], v[13][1], v[13][2]}},
+
+ {{v[15][0], v[15][1], v[15][2]}, {v[6][0], v[6][1], v[6][2]}, {v[8][0], v[8][1], v[8][2]}},
+ {{v[8][0], v[8][1], v[8][2]}, {v[17][0], v[17][1], v[17][2]}, {v[15][0], v[15][1], v[15][2]}},
+
+ {{v[17][0], v[17][1], v[17][2]}, {v[8][0], v[8][1], v[8][2]}, {v[10][0], v[10][1], v[10][2]}},
+
+ // other side
+ {{v[3][0], v[3][1], v[3][2]}, {v[1][0], v[1][1], v[1][2]}, {v[12][0], v[12][1], v[12][2]}},
+
+ {{v[3][0], v[3][1], v[3][2]}, {v[12][0], v[12][1], v[12][2]}, {v[14][0], v[14][1], v[14][2]}},
+ {{v[14][0], v[14][1], v[14][2]}, {v[5][0], v[5][1], v[5][2]}, {v[3][0], v[3][1], v[3][2]}},
+
+ {{v[5][0], v[5][1], v[5][2]}, {v[14][0], v[14][1], v[14][2]}, {v[16][0], v[16][1], v[16][2]}},
+ {{v[16][0], v[16][1], v[16][2]}, {v[7][0], v[7][1], v[7][2]}, {v[5][0], v[5][1], v[5][2]}},
+
+ {{v[7][0], v[7][1], v[7][2]}, {v[16][0], v[16][1], v[16][2]}, {v[18][0], v[18][1], v[18][2]}},
+ {{v[18][0], v[18][1], v[18][2]}, {v[9][0], v[9][1], v[9][2]}, {v[7][0], v[7][1], v[7][2]}},
+
+ {{v[9][0], v[9][1], v[9][2]}, {v[18][0], v[18][1], v[18][2]}, {v[10][0], v[10][1], v[10][2]}}
+
+ };
+
+
+ // Normals defined so as to make each face of the brush a flat surface
+ const GLfloat norms[34][3][3] = {
+ // top
+ {{0.0f, 0.93f, -0.37f}, {0.0f, 0.93f, -0.37f}, {0.0f, 0.93f, -0.37f}},
+ {{0.0f, 0.93f, -0.37f}, {0.0f, 0.93f, -0.37f}, {0.0f, 0.93f, -0.37f}},
+
+ {{0.0f, 1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}},
+ {{0.0f, 1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}},
+
+ {{0.0f, 0.988f, 0.158f}, {0.0f, 0.988f, 0.158f}, {0.0f, 0.988f, 0.158f}},
+ {{0.0f, 0.988f, 0.158f}, {0.0f, 0.988f, 0.158f}, {0.0f, 0.988f, 0.158f}},
+
+ {{0.0f, 0.999f, -0.0533f}, {0.0f, 0.999f, -0.0533f}, {0.0f, 0.999f, -0.0533f}},
+ {{0.0f, 0.999f, -0.0533f}, {0.0f, 0.999f, -0.0533f}, {0.0f, 0.999f, -0.0533f}},
+
+ {{0.0f, 0.709f, 0.709f}, {0.0f, 0.709f, 0.709f}, {0.0f, 0.709f, 0.709f}},
+
+ // bottom
+ {{0.0f, -0.93f, -0.37f}, {0.0f, -0.93f, -0.37f}, {0.0f, -0.93f, -0.37f}},
+ {{0.0f, -0.93f, -0.37f}, {0.0f, -0.93f, -0.37f}, {0.0f, -0.93f, -0.37f}},
+
+ {{0.0f, -1.0f, 0.0f}, {0.0f, -1.0f, 0.0f}, {0.0f, -1.0f, 0.0f}},
+ {{0.0f, -1.0f, 0.0f}, {0.0f, -1.0f, 0.0f}, {0.0f, -1.0f, 0.0f}},
+
+ {{0.0f, -0.988f, 0.158f}, {0.0f, -0.988f, 0.158f}, {0.0f, -0.988f, 0.158f}},
+ {{0.0f, -0.988f, 0.158f}, {0.0f, -0.988f, 0.158f}, {0.0f, -0.988f, 0.158f}},
+
+ {{0.0f, -0.999f, -0.0533f}, {0.0f, -0.999f, -0.0533f}, {0.0f, -0.999f, -0.0533f}},
+ {{0.0f, -0.999f, -0.0533f}, {0.0f, -0.999f, -0.0533f}, {0.0f, -0.999f, -0.0533f}},
+
+ {{0.0f, -0.709f, 0.709f}, {0.0f, -0.709f, 0.709f}, {0.0f, -0.709f, 0.709f}},
+
+ // one side
+ {{1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f}},
+
+ {{1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f}},
+ {{1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f}},
+
+ {{0.848f, 0.0f, 0.530f}, {0.848f, 0.0f, 0.530f}, {0.848f, 0.0f, 0.530f}},
+ {{0.848f, 0.0f, 0.530f}, {0.848f, 0.0f, 0.530f}, {0.848f, 0.0f, 0.530f}},
+
+ {{1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f}},
+ {{1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f}},
+
+ {{0.709f, 0.0f, 0.709f}, {0.709f, 0.0f, 0.709f}, {0.709f, 0.0f, 0.709f}},
+
+ // other side
+ {{-1.0f, 0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}},
+
+ {{-1.0f, 0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}},
+ {{-1.0f, 0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}},
+
+ {{-0.848f, 0.0f, 0.530f}, {-0.848f, 0.0f, 0.530f}, {-0.848f, 0.0f, 0.530f}},
+ {{-0.848f, 0.0f, 0.530f}, {-0.848f, 0.0f, 0.530f}, {-0.848f, 0.0f, 0.530f}},
+
+ {{-1.0f, 0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}},
+ {{-1.0f, 0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}},
+
+ {{-0.709f, 0.0f, 0.709f}, {-0.709f, 0.0f, 0.709f}, {-0.709f, 0.0f, 0.709f}}
+ };
+
+ brushMesh_.SetVertices((float*)verts, 102);
+ brushMesh_.SetNormals((float*)norms, 102);
+ brushMesh_.UpdateGPUMemory();
+}
+
+
+void QuickShapes::DrawBrush(const Matrix4 &modelMatrix, const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix, const Color &color)
+{
+ if (brushMesh_.num_vertices() == 0) {
+ initBrush();
+ }
+ defaultMaterial_.ambient_reflectance = color;
+ defaultMaterial_.diffuse_reflectance = color;
+ defaultMaterial_.surface_texture = emptyTex_;
+ defaultShader_.Draw(modelMatrix, viewMatrix, projectionMatrix, &brushMesh_, defaultMaterial_);
+}
+
+
+
+// ----------------
+
+
+void QuickShapes::DrawLineSegment(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix,
+ const Color &color,
+ const Point3 &p1,
+ const Point3 &p2,
+ float radius)
+{
+ Matrix4 S = Matrix4::Scale(Vector3(radius, 0.5f*(p2-p1).Length(), radius));
+ Vector3 y = (p2-p1).ToUnit();
+ Vector3 z = Vector3(1,0,0).Cross(y).ToUnit();
+ if (z == Vector3(0,0,0)) {
+ z = Vector3(0,0,1).Cross(y).ToUnit();
+ }
+ Vector3 x = y.Cross(z);
+ Matrix4 R = Matrix4::FromRowMajorElements(
+ x[0], y[0], z[0], 0,
+ x[1], y[1], z[1], 0,
+ x[2], y[2], z[2], 0,
+ 0, 0, 0, 1
+ );
+ Matrix4 T = Matrix4::Translation(0.5 * Vector3(p1[0]+p2[0], p1[1]+p2[1], p1[2]+p2[2]));
+
+ Matrix4 M = T * R * S;
+
+ DrawCylinder(modelMatrix * M, viewMatrix, projectionMatrix, color);
+}
+
+
+
+void QuickShapes::DrawLines(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix,
+ const Color &color,
+ const std::vector<Point3> &points,
+ LinesType ltype,
+ float radius)
+{
+ if (ltype == LinesType::LINES) {
+ for (size_t i=0; i<points.size(); i+=2) {
+ DrawLineSegment(modelMatrix, viewMatrix, projectionMatrix, color, points[i], points[i+1], radius);
+ }
+ }
+ else {
+ for (size_t i=0; i<points.size()-1; i++) {
+ DrawLineSegment(modelMatrix, viewMatrix, projectionMatrix, color, points[i], points[i+1], radius);
+ }
+ if (ltype == LinesType::LINE_LOOP) {
+ DrawLineSegment(modelMatrix, viewMatrix, projectionMatrix, color, points[points.size()-1], points[0], radius);
+ }
+ }
+}
+
+
+
+void QuickShapes::DrawArrow(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix,
+ const Color &color,
+ Point3 p, Vector3 dir, float radius)
+{
+ float d = dir.Length() - 8.0f*radius;
+ DrawLineSegment(modelMatrix, viewMatrix, projectionMatrix, color, p, p + d*dir.ToUnit(), radius);
+
+ Matrix4 S = Matrix4::Scale(Vector3(radius*3.0f, radius*4.0f, radius*3.0f));
+ Vector3 y = dir.ToUnit();
+ Vector3 z = Vector3(1,0,0).Cross(y).ToUnit();
+ if (z == Vector3(0,0,0)) {
+ z = Vector3(0,0,1).Cross(y).ToUnit();
+ }
+ Vector3 x = y.Cross(z);
+ Matrix4 R = Matrix4::FromRowMajorElements(
+ x[0], y[0], z[0], 0,
+ x[1], y[1], z[1], 0,
+ x[2], y[2], z[2], 0,
+ 0, 0, 0, 1
+ );
+ Matrix4 T = Matrix4::Translation((p + d*dir.ToUnit()) - Point3::Origin());
+
+ Matrix4 M = T * R * S * Matrix4::Translation(Vector3(0,1,0));
+
+ DrawCone(modelMatrix * M, viewMatrix, projectionMatrix, color);
+}
+
+
+void QuickShapes::DrawAxes(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix)
+{
+ DrawArrow(modelMatrix, viewMatrix, projectionMatrix, Color(1.0f, 0.6f, 0.6f), Point3::Origin(), Vector3::UnitX(), 0.02f);
+ DrawArrow(modelMatrix, viewMatrix, projectionMatrix, Color(0.6f, 1.0f, 0.6f), Point3::Origin(), Vector3::UnitY(), 0.02f);
+ DrawArrow(modelMatrix, viewMatrix, projectionMatrix, Color(0.6f, 0.6f, 1.0f), Point3::Origin(), Vector3::UnitZ(), 0.02f);
+
+}
+
+
+void QuickShapes::initFull() {
+ GLfloat vertices[] = {
+ -1, -1, 0, 1, -1, 0, 1, 1, 0,
+ -1, -1, 0, 1, 1, 0, -1, 1, 0
+ };
+
+ GLfloat normals[] = {
+ 0, 0, 1, 0, 0, 1, 0, 0, 1,
+ 0, 0, 1, 0, 0, 1, 0, 0, 1
+ };
+
+ GLfloat texcoords[] = {
+ 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f
+ };
+
+ fullMesh_.SetVertices(vertices, 6);
+ fullMesh_.SetNormals(normals, 6);
+ fullMesh_.SetTexCoords(0, texcoords, 6);
+ fullMesh_.UpdateGPUMemory();
+}
+
+
+void QuickShapes::DrawFullscreenTexture(const Color &color, const Texture2D &tex) {
+ if (fullMesh_.num_vertices() == 0) {
+ initFull();
+ }
+ DrawWithFullscreen(color, &fullMesh_, tex);
+}
+
+
+
+
+
+void QuickShapes::DrawWithFullscreen(const Color &color, Mesh *mesh, const Texture2D &tex) {
+ if (!fullscreenShader_.initialized()) {
+ fullscreenShader_.AddVertexShaderFromFile(Platform::FindMinGfxShaderFile("fullscreen.vert"));
+ fullscreenShader_.AddFragmentShaderFromFile(Platform::FindMinGfxShaderFile("fullscreen.frag"));
+ fullscreenShader_.LinkProgram();
+ }
+
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+
+ // Activate the shader program
+ fullscreenShader_.UseProgram();
+
+ // Pass uniforms and textures from C++ to the GPU Shader Program
+ fullscreenShader_.SetUniform("TintColor", color);
+ fullscreenShader_.BindTexture("SurfaceTexture", tex);
+
+ // Draw the mesh using the shader program
+ mesh->Draw();
+
+ // Deactivate the shader program
+ fullscreenShader_.StopProgram();
+
+ glEnable(GL_DEPTH_TEST);
+ glDepthMask(GL_TRUE);
+}
+
+
+DefaultShader* QuickShapes::default_shader() {
+ return &defaultShader_;
+}
+
+
+DefaultShader::MaterialProperties* QuickShapes::material() {
+ return &defaultMaterial_;
+}
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/quick_shapes.h b/dev/MinGfx/src/quick_shapes.h
new file mode 100644
index 0000000..c38ac52
--- /dev/null
+++ b/dev/MinGfx/src/quick_shapes.h
@@ -0,0 +1,254 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2017, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_QUICK_SHAPES_H_
+#define SRC_QUICK_SHAPES_H_
+
+#include "color.h"
+#include "default_shader.h"
+#include "mesh.h"
+#include "point3.h"
+#include "shader_program.h"
+#include "texture2d.h"
+#include "vector3.h"
+#include "matrix4.h"
+
+#include <vector>
+
+
+
+namespace mingfx {
+
+/** This class provides a quick way to draw shapes for use in debugging or
+ simple scenes. You can specify the color for each shape as part of the
+ Draw...() call. Other lighting parameters (the intensity of the light,
+ advanced material properties) are pre-set to reasonable defaults that apply
+ to all of the shapes drawn. You can edit these if you wish, but note that
+ the intent of this class is just to provide a quick way to draw shapes --
+ this is not the right tool to use if you wish to do quality renderings and
+ use multiple types of materials.
+
+ Example usage:
+ ~~~
+ // define a new QuickShapes object during initialization, or as a class
+ // member variable
+ QuickShapes quick_shapes;
+
+
+ void DrawUsingOpenGL() {
+ // later, in your draw routine, use it to draw shapes
+ Matrix4 view = Matrix4::LookAt(Point3(0,0,3), Point3(0,0,0), Vector3(0,1,0));
+ Matrix4 proj = Matrix4::Perspective(60.0, aspect_ratio(), 0.1, 10.0);
+
+ Matrix4 m_cube = Matrix4::Translation(Vector3(-2.5,0,0)) * Matrix4::Scale(Vector3(0.5, 0.5, 0.5));
+ quick_shapes.DrawCube(m_cube, view, proj, Color(1,1,1));
+
+ Matrix4 m_sphere = Matrix4::Scale(Vector3(2.5, 2.5, 2.5));
+ quick_shapes.DrawSphere(m_sphere, view, proj, Color(1,1,1));
+
+ Matrix4 m_loop;
+ std::vector<Point3> loop;
+ loop.push_back(Point3( 4.0, 4.0, -4.0));
+ loop.push_back(Point3(-4.0, 4.0, -4.0));
+ loop.push_back(Point3(-4.0, 4.0, 4.0));
+ loop.push_back(Point3( 4.0, 4.0, 4.0));
+ quick_shapes.DrawLines(m_loop, view, proj, Color(1,1,1), loop, QuickShapes::LinesType::LINE_LOOP, 0.1);
+ }
+ ~~~
+ */
+class QuickShapes {
+public:
+
+ QuickShapes();
+ virtual ~QuickShapes();
+
+
+ // -------- 3D PRIMITIVES --------
+
+ /** Draws a cube with extents -1 to 1 given the model, view, and projection
+ matrices provided and using the supplied color as a material property.
+ */
+ void DrawCube(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix,
+ const Color &color);
+
+ /** Draws a cylinder with radius 1 and height y=-1 to 1 given the model,
+ view, and projection matrices provided and using the supplied color as a
+ material property.
+ */
+ void DrawCylinder(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix,
+ const Color &color);
+
+ /** Draws a cone with radius 1 and height y=-1 to 1 given the model,
+ view, and projection matrices provided and using the supplied color as a
+ material property.
+ */
+ void DrawCone(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix,
+ const Color &color);
+
+ /** Draws a sphere with radius 1 given the model, view, and projection
+ matrices provided and using the supplied color as a material property.
+ */
+ void DrawSphere(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix,
+ const Color &color);
+
+ /** Draws the classic 3D paintbrush cursor from the 2001 Keefe et al.
+ CavePainting paper. The tip of the brush is at (0,0,0), the front
+ flat edge runs along the X axis, and the handle runs in the +Z direction.
+ */
+ void DrawBrush(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix,
+ const Color &color);
+
+
+ // -------- 3D COMPOSITE SHAPES --------
+
+ /** Draws a cylinder between the two points.
+ */
+ void DrawLineSegment(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix,
+ const Color &color,
+ const Point3 &p1,
+ const Point3 &p2,
+ float radius);
+
+ enum class LinesType {
+ LINES,
+ LINE_STRIP,
+ LINE_LOOP
+ };
+
+ /** Draws a series of line segments. Using linesType=LINES connects each
+ consecutive pair of points in the points array with a line. A linesType=LINE_STRIP
+ will connect each point to the next. And, a linesType=LINE_LOOP will connect
+ each point to the next and in addition connect the last to the first. Example:
+ ~~~
+ Matrix4 model;
+ Matrix4 view = Matrix4::LookAt(Point3(0,0,3), Point3(0,0,0), Vector3(0,1,0));
+ Matrix4 proj = Matrix4::Perspective(60.0, aspect_ratio(), 0.1, 10.0);
+ std::vector<Point3> loop;
+ loop.push_back(Point3( 4.0, 4.0, -4.0));
+ loop.push_back(Point3(-4.0, 4.0, -4.0));
+ loop.push_back(Point3(-4.0, 4.0, 4.0));
+ loop.push_back(Point3( 4.0, 4.0, 4.0));
+ quick_shapes.DrawLines(model, view, proj, Color(1,1,1), loop, QuickShapes::LinesType::LINE_LOOP, 0.1);
+ ~~~
+ */
+ void DrawLines(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix,
+ const Color &color,
+ const std::vector<Point3> &points,
+ LinesType linesType,
+ float radius);
+
+ /** Draws an arrow originating at point p and extending in the direction and
+ length specified by dir. radius is the radius of the cylinder used to
+ draw the shaft of the arrow.
+ */
+ void DrawArrow(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix,
+ const Color &color,
+ Point3 p, Vector3 dir, float radius);
+
+ /** Draws a right handed set of axes at the coordinate frame specified by
+ the modelMatrix. The arrows are 1 unit in length and colored based
+ on the axis: X=red, Y=green, Z=blue.
+ */
+ void DrawAxes(const Matrix4 &modelMatrix,
+ const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix);
+
+
+ // -------- 2D PRIMITIVES --------
+
+ /** Draws a square in the X-Y plane with extents -1 to 1 and normal in the
+ +Y direction. Uses the model, view, and projection matrices provided
+ and the supplied color as a material property.
+ */
+ void DrawSquare(const Matrix4 &modelMatrix, const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix, const Color &color);
+
+ /** Draws a square, which you can deform into some other shape by adjusting
+ the model matrix, and applies a texture to it. The texture must already
+ be bound to the OpenGL textureID provided. The square lies in the X-Y
+ plane with extents -1 to 1 and normal in the +Y direction. No lighting
+ is applied.
+ */
+ void DrawSquare(const Matrix4 &modelMatrix, const Matrix4 &viewMatrix,
+ const Matrix4 &projectionMatrix, const Color &color,
+ const Texture2D &texture);
+
+ /** Draws a background texture across the whole screen. Typically, you will
+ want to do this before any other draw calls.
+ */
+ void DrawFullscreenTexture(const Color &color, const Texture2D &texture);
+
+
+ /** Returns a pointer to the default shader used internally by the Draw class
+ so that you may change the default lighting properties if you wish.
+ */
+ DefaultShader* default_shader();
+
+ /** Returns a pointer to the default material properties for the shapes so
+ that you may adjust the reflectance properties used by all the shapes
+ if needed.
+ */
+ DefaultShader::MaterialProperties* material();
+
+
+private:
+
+ void DrawWithFullscreen(const Color &color, Mesh *mesh, const Texture2D &tex);
+
+ Mesh cubeMesh_;
+ void initCube();
+
+ Mesh squareMesh_;
+ void initSquare();
+
+ Mesh fullMesh_;
+ void initFull();
+
+ Mesh cylMesh_;
+ void initCyl();
+
+ Mesh coneMesh_;
+ void initCone();
+
+ Mesh sphereMesh_;
+ void initSph();
+
+ Mesh brushMesh_;
+ void initBrush();
+
+ DefaultShader defaultShader_;
+ DefaultShader::MaterialProperties defaultMaterial_;
+ Texture2D emptyTex_;
+
+ ShaderProgram fullscreenShader_;
+};
+
+} // end namespace
+
+#endif \ No newline at end of file
diff --git a/dev/MinGfx/src/ray.cc b/dev/MinGfx/src/ray.cc
new file mode 100644
index 0000000..5d406ef
--- /dev/null
+++ b/dev/MinGfx/src/ray.cc
@@ -0,0 +1,313 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "ray.h"
+
+namespace mingfx {
+
+ Ray::Ray() : p_(Point3::Origin()), d_(-Vector3::UnitZ()) {
+ }
+
+ Ray::Ray(const Point3 &origin, const Vector3 &direction) : p_(origin), d_(direction) {
+ }
+
+ Ray::~Ray() {
+ }
+
+
+ bool Ray::operator==(const Ray& other) const {
+ return (p_ == other.origin()) && (d_ == other.direction());
+ }
+
+
+ bool Ray::operator!=(const Ray& other) const {
+ return (p_ != other.origin()) || (d_ != other.direction());
+ }
+
+
+ float Ray::Length() const {
+ return d_.Length();
+ }
+
+
+ Point3 Ray::origin() const {
+ return p_;
+ }
+
+
+ Vector3 Ray::direction() const {
+ return d_;
+ }
+
+
+
+ bool Ray::IntersectPlane(const Point3 &planePt, const Vector3 &planeNormal,
+ float *iTime, Point3 *iPoint) const
+ {
+ float dot = planeNormal.Dot(d_);
+
+ // return false if we would hit the back face of the plane
+ if (dot > 0.0) {
+ return false;
+ }
+
+ // return false if the ray and plane are parallel
+ if (std::fabs(dot) < MINGFX_MATH_EPSILON) {
+ return false;
+ }
+
+ float denom = planeNormal.Dot(d_);
+ if (std::abs(denom) > MINGFX_MATH_EPSILON) {
+ *iTime = (planePt - p_).Dot(planeNormal) / denom;
+ if (*iTime >= 0) {
+ *iPoint = p_ + (*iTime)*d_;
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ bool Ray::IntersectTriangle(const Point3 &vertex0, const Point3 &vertex1, const Point3 &vertex2,
+ float *iTime, Point3 *iPoint) const
+ {
+ // Implementation of the Möller–Trumbore intersection algorithm
+ // https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm
+
+ Vector3 edge1, edge2, h, s, q;
+ float a,f,u,v;
+ edge1 = vertex1 - vertex0;
+ edge2 = vertex2 - vertex0;
+ h = d_.Cross(edge2);
+ a = edge1.Dot(h);
+ if (a > -MINGFX_MATH_EPSILON && a < MINGFX_MATH_EPSILON)
+ return false;
+ f = 1.f/a;
+ s = p_ - vertex0;
+ u = f * (s.Dot(h));
+ if (u < 0.0 || u > 1.f)
+ return false;
+ q = s.Cross(edge1);
+ v = f * d_.Dot(q);
+ if ((v < 0.0) || (u + v > 1.0f))
+ return false;
+ // At this stage we can compute t to find out where the intersection point is on the line.
+ *iTime = f * edge2.Dot(q);
+ if (*iTime > MINGFX_MATH_EPSILON) { // ray intersection
+ *iPoint = p_ + d_ * (*iTime);
+ return true;
+ }
+ else // This means that there is a line intersection but not a ray intersection.
+ return false;
+
+
+ /***
+ // A basic implementation
+
+ // find the point of intersection of the ray with the plane of the triangle
+ Vector3 AB = B - A;
+ Vector3 AC = C - A;
+ Vector3 cross = AB.Cross(AC);
+ Vector3 N = cross.ToUnit();
+ if (!IntersectPlane(A, N, iTime, iPoint)) {
+ return false;
+ }
+
+ // check to see if iPoint lies within the triangle
+ Vector3 edge1 = B - A;
+ Vector3 v1 = *iPoint - A;
+ Vector3 check1 = edge1.Cross(v1);
+ if (N.Dot(check1) < 0.0) {
+ return false;
+ }
+
+ Vector3 edge2 = C - B;
+ Vector3 v2 = *iPoint - B;
+ Vector3 check2 = edge2.Cross(v2);
+ if (N.Dot(check2) < 0.0) {
+ return false;
+ }
+
+ Vector3 edge3 = A - C;
+ Vector3 v3 = *iPoint - C;
+ Vector3 check3 = edge3.Cross(v3);
+ if (N.Dot(check3) < 0.0) {
+ return false;
+ }
+
+ return true;
+ ***/
+ }
+
+
+ bool Ray::IntersectQuad(const Point3 &A, const Point3 &B, const Point3 &C, const Point3 &D,
+ float *iTime, Point3 *iPoint) const
+ {
+ if (IntersectTriangle(A, B, C, iTime, iPoint)) {
+ return true;
+ }
+ else if (IntersectTriangle(A, C, D, iTime, iPoint)) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+
+ bool Ray::IntersectSphere(const Point3 &center, float radius,
+ float *iTime, Point3 *iPoint) const
+ {
+ Point3 P = p_ + (Point3::Origin() - center);
+ Vector3 D = d_;
+
+ // A = (Dx^2 + Dy^2 + Dz^2)
+ const double A = ((double)D[0]*D[0] + (double)D[1]*D[1] + (double)D[2]*D[2]);
+
+ // B = (Px * Dx + Py * Dy + Pz * Dz)
+ const double B = ((double)P[0]*D[0] + (double)P[1]*D[1] + (double)P[2]*D[2]);
+
+ // C = (Px^2 + Py^2 + Pz^2 - (sphere radius)^2)
+ const double C = ((double)P[0]*P[0] + (double)P[1]*P[1] + (double)P[2]*P[2] - (double)radius*radius);
+
+ // Discriminant of quadratic = B^2 - A * C
+ double discriminant = B*B - A*C;
+
+ if (discriminant < 0.0) {
+ return false;
+ }
+ else {
+ double discRoot = sqrt(discriminant);
+ double t1 = (-B - discRoot) / A;
+ double t2 = (-B + discRoot) / A;
+ bool hit1 = false;
+ bool hit2 = false;
+ if (t1 > MINGFX_MATH_EPSILON) {
+ hit1 = true;
+ *iTime = (float)t1;
+ }
+ if (t2 > MINGFX_MATH_EPSILON) {
+ hit2 = true;
+ *iTime = (float)t2;
+ }
+ if ((!hit1) && (!hit2)) {
+ return false;
+ }
+ if ((hit1) && (hit2)) {
+ if (t1 < t2) {
+ *iTime = (float)t1;
+ }
+ }
+
+ *iPoint = p_ + (*iTime)*d_;
+ return true;
+ }
+ }
+
+
+ bool Ray::IntersectMesh(const Mesh &mesh,
+ float *iTime, Point3 *iPoint, int *iTriangleID) const
+ {
+ *iTime = -1.0;
+ for (int i=0; i<mesh.num_triangles(); i++) {
+ Point3 p;
+ float t;
+ std::vector<unsigned int> indices = mesh.read_triangle_indices_data(i);
+ if (IntersectTriangle(mesh.read_vertex_data(indices[0]), mesh.read_vertex_data(indices[1]), mesh.read_vertex_data(indices[2]), &t, &p)) {
+ if ((*iTime < 0.0) || (t < *iTime)) {
+ *iPoint = p;
+ *iTime = t;
+ *iTriangleID = i;
+ }
+ }
+ }
+ return (*iTime > 0.0);
+ }
+
+ bool Ray::FastIntersectMesh(Mesh *mesh, float *iTime,
+ Point3 *iPoint, int *iTriangleID) const
+ {
+ std::vector<int> tri_ids = mesh->bvh_ptr()->IntersectAndReturnUserData(*this);
+ if (tri_ids.size()) {
+ *iTime = -1.0;
+ for (int i=0; i<tri_ids.size(); i++) {
+ Point3 p;
+ float t;
+ std::vector<unsigned int> indices = mesh->read_triangle_indices_data(tri_ids[i]);
+ if (IntersectTriangle(mesh->read_vertex_data(indices[0]), mesh->read_vertex_data(indices[1]), mesh->read_vertex_data(indices[2]), &t, &p)) {
+ if ((*iTime < 0.0) || (t < *iTime)) {
+ *iPoint = p;
+ *iTime = t;
+ *iTriangleID = i;
+ }
+ }
+ }
+ return (*iTime > 0.0);
+ }
+ else {
+ return false;
+ }
+ }
+
+
+ bool Ray::IntersectAABB(const AABB &box, float *iTime) const {
+ // https://gamedev.stackexchange.com/questions/18436/most-efficient-aabb-vs-ray-collision-algorithms
+
+ Point3 origin = p_;
+
+ Vector3 invdir = d_;
+ invdir[0] = 1.0f / invdir[0];
+ invdir[1] = 1.0f / invdir[1];
+ invdir[2] = 1.0f / invdir[2];
+
+ float t1 = (box.min()[0] - origin[0])*invdir[0];
+ float t2 = (box.max()[0] - origin[0])*invdir[0];
+ float t3 = (box.min()[1] - origin[1])*invdir[1];
+ float t4 = (box.max()[1] - origin[1])*invdir[1];
+ float t5 = (box.min()[2] - origin[2])*invdir[2];
+ float t6 = (box.max()[2] - origin[2])*invdir[2];
+
+ float tmin = std::max(std::max(std::min(t1, t2), std::min(t3, t4)), std::min(t5, t6));
+ float tmax = std::min(std::min(std::max(t1, t2), std::max(t3, t4)), std::max(t5, t6));
+
+ // if tmax < 0, ray (line) is intersecting AABB, but the whole AABB is behind us
+ if (tmax < 0) {
+ *iTime = tmax;
+ return false;
+ }
+
+ // if tmin > tmax, ray doesn't intersect AABB
+ if (tmin > tmax) {
+ *iTime = tmax;
+ return false;
+ }
+
+ *iTime = tmin;
+ return true;
+ }
+
+
+ void Ray::set(Point3 newOrigin, Vector3 newDir) {
+ p_ = newOrigin;
+ d_ = newDir;
+ }
+
+ std::ostream & operator<< ( std::ostream &os, const Ray &r) {
+ return os << r.origin() << " " << r.direction();
+ }
+
+ std::istream & operator>> ( std::istream &is, Ray &r) {
+ // format: (x, y, z)
+ char dummy;
+ Point3 p;
+ Vector3 d;
+ is >> p >> dummy >> d;
+ r.set(p, d);
+ return is;
+ }
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/ray.h b/dev/MinGfx/src/ray.h
new file mode 100644
index 0000000..8e84546
--- /dev/null
+++ b/dev/MinGfx/src/ray.h
@@ -0,0 +1,167 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_RAY_H_
+#define SRC_RAY_H_
+
+#include <iostream>
+
+#include "aabb.h"
+#include "point3.h"
+#include "vector3.h"
+#include "mesh.h"
+
+
+namespace mingfx {
+
+
+/** Stores the mathematical object of a ray that begins at an origin (a 3D
+ point) and points in a direction (a unit 3D vector). Rays can intersect
+ a variety of other computer graphics objects, such as planes, triangles,
+ spheres, 3D meshes, etc. These intersections can be tested with the
+ Intersect...() methods. The Ray can also be transformed by a Matrix4.
+ Example:
+ ~~~
+ // Create a pick ray from the mouse position
+ void MyGraphicsApp::OnLeftMouseDown(const Point2 &pos) {
+ Point2 mouse_xy = PixelsToNormalizedDeviceCoords(pos);
+ float mouse_z = ReadZValueAtPixel(pos);
+ Point3 mouse_3d = GfxMath::ScreenToNearPlane(view_matrix, proj_matrix, mouse_xy, mouse_z);
+ Matrix4 camera_matrix = view_matrix.Inverse();
+ Point3 eye = camera_matrix.ColumnToPoint3(3);
+
+ Ray pick_ray(eye, mouse_3d - eye);
+
+ // check to see if the ray intersects a sphere
+ float t;
+ Point3 p;
+ if (pick_ray.IntersectSphere(Point3(0,0,0), 2.0, &t, &p)) {
+ std::cout << "Mouse pointing at sphere! Intersection point = " << p << std::endl;
+ }
+ }
+ ~~~
+ */
+class Ray {
+public:
+
+ /// Defaults to a ray at the origin and pointing in the -Z direction
+ Ray();
+
+ /// Creates a ray from a 3D origin and direction
+ Ray(const Point3 &origin, const Vector3 &direction);
+
+ /// Ray destructor
+ virtual ~Ray();
+
+ /// Check for "equality", taking floating point imprecision into account
+ bool operator==(const Ray& other) const;
+
+ /// Check for "inequality", taking floating point imprecision into account
+ bool operator!=(const Ray& other) const;
+
+ /// Returns the length of the direction vector
+ float Length() const;
+
+ /** Checks to see if the ray intersects a plane defined by a point and a normal.
+ If there was an intersection, true is returned, iTime is set to the intersection
+ time, and iPoint is set to the intersection point. The plane is considered
+ to be 1-sided. That is the intersection will only occur if the ray hits the
+ plane from its front side as determined by the plane's normal.
+ */
+ bool IntersectPlane(const Point3 &planePt, const Vector3 &planeNormal,
+ float *iTime, Point3 *iPoint) const;
+
+ /** Checks to see if the ray intersects a triangle defined by the vertices v1, v2, and v3.
+ The vertices must be provided in counter-clockwise order so that the normal of the
+ triangle can be determined via the right-hand rule. The intersection will only happen
+ if the ray hits the front side of the triangle. If there was an intersection,
+ true is returned, iTime is set to the intersection time, and iPoint is set to the intersection point.
+ */
+ bool IntersectTriangle(const Point3 &v1, const Point3 &v2, const Point3 &v3,
+ float *iTime, Point3 *iPoint) const;
+
+ /** Checks to see if the ray intersects a quad defined by the vertices v1, v2, v3, and v4.
+ The vertices must be provided in counter-clockwise order so that the normal of the
+ triangle can be determined via the right-hand rule. The intersection will only happen
+ if the ray hits the front side of the triangle. If there was an intersection,
+ true is returned, iTime is set to the intersection time, and iPoint is set to the intersection point.
+ */
+ bool IntersectQuad(const Point3 &v1, const Point3 &v2, const Point3 &v3, const Point3 &v4,
+ float *iTime, Point3 *iPoint) const;
+
+ /** Checks to see if the ray intersects a sphere defined by a center point and a radius.
+ If there was an intersection, true is returned, iTime is set to the intersection time,
+ and iPoint is set to the intersection point.
+ */
+ bool IntersectSphere(const Point3 &center, float radius,
+ float *iTime, Point3 *iPoint) const;
+
+ /** Checks to see if the ray intersects a triangle mesh. This is a brute-force
+ check over each triangle in the mesh. If there was an intersection, true is returned,
+ iTime is set to the intersection time, iPoint is set to the intersection point,
+ and iTriangleID is set to the ID of the closest intersected triangle along the ray.
+ */
+ bool IntersectMesh(const Mesh &mesh, float *iTime,
+ Point3 *iPoint, int *iTriangleID) const;
+
+ /** Checks to see if the ray intersects a triangle mesh. This uses a BVH
+ (Bounding Volume Hierarchy) to accelerate the ray-triangle intersection tests.
+ Each mesh can optionally store a BVH. If a BVH has already been calculated
+ for the mesh (done with Mesh::CalculateBVH()), then this function will be
+ much faster than the brute-force IntersectMesh() function. If a BVH has
+ not already been calculated for the mesh, the first call to FastIntersectMesh()
+ will trigger the mesh to create a BVH (not a fast operation) but then
+ subsequent calls to FastIntersectMesh() will be fast.
+ */
+ bool FastIntersectMesh(Mesh *mesh, float *iTime,
+ Point3 *iPoint, int *iTriangleID) const;
+
+ /** Checks to see if the ray intersects an AABB (Axis-Aligned Bounding Box).
+ Typically, this is the first step of a more detailed intersection test and
+ we don't care about the actual point of intersection, just whether it
+ intersects or not. So, we don't bother calculating the iPoint. We get the
+ iTime for free though, so we do return that. You can calc the iPoint if
+ you want using:
+ ~~~
+ float t;
+ if (ray.IntersectAABB(box, &t)) {
+ Point3 iPoint = ray.origin() + t*ray.direction();
+ }
+ ~~~
+ */
+ bool IntersectAABB(const AABB &box, float *iTime) const;
+
+ /// Returns the origin
+ Point3 origin() const;
+
+ /// Returns the direction
+ Vector3 direction() const;
+
+ /// Sets a new origin and direction
+ void set(Point3 newOrigin, Vector3 newDir);
+
+private:
+ Point3 p_;
+ Vector3 d_;
+};
+
+
+// --- Stream operators ---
+
+std::ostream & operator<< ( std::ostream &os, const Ray &r);
+std::istream & operator>> ( std::istream &is, Ray &r);
+
+
+} // end namespace
+
+#endif
diff --git a/dev/MinGfx/src/shader_program.cc b/dev/MinGfx/src/shader_program.cc
new file mode 100644
index 0000000..faeb82e
--- /dev/null
+++ b/dev/MinGfx/src/shader_program.cc
@@ -0,0 +1,389 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "shader_program.h"
+
+#include "opengl_headers.h"
+
+#include <vector>
+#include <fstream>
+
+
+namespace mingfx {
+
+
+ShaderProgram::ShaderProgram() : vertexShader_(0), fragmentShader_(0), program_(0) {
+}
+
+ShaderProgram::~ShaderProgram() {
+}
+
+bool ShaderProgram::initialized() {
+ return (program_ != 0);
+}
+
+bool ShaderProgram::AddVertexShaderFromSource(const std::string &vertexSource) {
+ // https://www.khronos.org/opengl/wiki/Shader_Compilation
+
+ // Create an empty vertex shader handle
+ vertexShader_ = glCreateShader(GL_VERTEX_SHADER);
+
+ // Send the vertex shader source code to GL
+ // Note that std::string's .c_str is NULL character terminated.
+ const GLchar *source = (const GLchar *)vertexSource.c_str();
+ glShaderSource(vertexShader_, 1, &source, 0);
+
+ // Compile the vertex shader
+ glCompileShader(vertexShader_);
+
+ GLint isCompiled = 0;
+ glGetShaderiv(vertexShader_, GL_COMPILE_STATUS, &isCompiled);
+ if (isCompiled == GL_FALSE) {
+ GLint maxLength = 0;
+ glGetShaderiv(vertexShader_, GL_INFO_LOG_LENGTH, &maxLength);
+
+ // The maxLength includes the NULL character
+ std::vector<GLchar> infoLog(maxLength);
+ glGetShaderInfoLog(vertexShader_, maxLength, &maxLength, &infoLog[0]);
+
+ // We don't need the shader anymore.
+ glDeleteShader(vertexShader_);
+
+ std::cerr << "ShaderProgram: Error compiling vertex shader program: " << std::endl;
+ std::cerr << &infoLog[0] << std::endl;
+ std::cerr << vertexSource << std::endl;
+ return false;
+ }
+ return true;
+}
+
+bool ShaderProgram::AddVertexShaderFromFile(const std::string &file) {
+ std::cout << "Loading vertex shader from file: " << file << std::endl;
+ std::string source;
+ std::string line;
+ std::ifstream myfile (file);
+ if (myfile.is_open()) {
+ while (std::getline(myfile, line)) {
+ source += line + "\n";
+ }
+ myfile.close();
+ return AddVertexShaderFromSource(source);
+ }
+ else {
+ std::cerr << "ShaderProgram: Cannot open file " << file << std::endl;
+ return false;
+ }
+}
+
+
+
+bool ShaderProgram::AddFragmentShaderFromSource(const std::string &fragmentSource) {
+ // https://www.khronos.org/opengl/wiki/Shader_Compilation
+
+ // Create an empty fragment shader handle
+ fragmentShader_ = glCreateShader(GL_FRAGMENT_SHADER);
+
+ // Send the fragment shader source code to GL
+ // Note that std::string's .c_str is NULL character terminated.
+ const GLchar *source = (const GLchar *)fragmentSource.c_str();
+ glShaderSource(fragmentShader_, 1, &source, 0);
+
+ // Compile the fragment shader
+ glCompileShader(fragmentShader_);
+
+ GLint isCompiled = 0;
+ glGetShaderiv(fragmentShader_, GL_COMPILE_STATUS, &isCompiled);
+ if (isCompiled == GL_FALSE) {
+ GLint maxLength = 0;
+ glGetShaderiv(fragmentShader_, GL_INFO_LOG_LENGTH, &maxLength);
+
+ // The maxLength includes the NULL character
+ std::vector<GLchar> infoLog(maxLength);
+ glGetShaderInfoLog(fragmentShader_, maxLength, &maxLength, &infoLog[0]);
+
+ // We don't need the shader anymore.
+ glDeleteShader(fragmentShader_);
+
+ std::cerr << "ShaderProgram: Error compiling fragment shader program: " << std::endl;
+ std::cerr << &infoLog[0] << std::endl;
+ std::cerr << fragmentSource << std::endl;
+ return false;
+ }
+ return true;
+}
+
+
+bool ShaderProgram::AddFragmentShaderFromFile(const std::string &file) {
+ std::cout << "Loading fragment shader from file: " << file << std::endl;
+ std::string source;
+ std::string line;
+ std::ifstream myfile (file);
+ if (myfile.is_open()) {
+ while (std::getline(myfile, line)) {
+ source += line + "\n";
+ }
+ myfile.close();
+ return AddFragmentShaderFromSource(source);
+ }
+ else {
+ std::cerr << "ShaderProgram: Cannot open file " << file << std::endl;
+ return false;
+ }
+}
+
+
+bool ShaderProgram::LinkProgram() {
+ if (!vertexShader_) {
+ std::cerr << "ShaderProgram: Error linking program. A vertex shader must be added and successfully compiled before the program can be linked." << std::endl;
+ return false;
+ }
+ if (!fragmentShader_) {
+ std::cerr << "ShaderProgram: Error linking program. A fragment shader must be added and successfully compiled before the program can be linked." << std::endl;
+ return false;
+ }
+
+ // Vertex and fragment shaders are successfully compiled.
+ // Now time to link them together into a program.
+ // Get a program object.
+ program_ = glCreateProgram();
+
+ // Attach our shaders to our program
+ glAttachShader(program_, vertexShader_);
+ glAttachShader(program_, fragmentShader_);
+
+ // Link our program
+ glLinkProgram(program_);
+
+ // Note the different functions here: glGetProgram* instead of glGetShader*.
+ GLint isLinked = 0;
+ glGetProgramiv(program_, GL_LINK_STATUS, (int *)&isLinked);
+ if (isLinked == GL_FALSE) {
+ GLint maxLength = 0;
+ glGetProgramiv(program_, GL_INFO_LOG_LENGTH, &maxLength);
+
+ // The maxLength includes the NULL character
+ std::vector<GLchar> infoLog(maxLength);
+ glGetProgramInfoLog(program_, maxLength, &maxLength, &infoLog[0]);
+
+ // We don't need the program anymore.
+ glDeleteProgram(program_);
+ // Don't leak shaders either.
+ glDeleteShader(vertexShader_);
+ glDeleteShader(fragmentShader_);
+
+ std::cerr << "ShaderProgram: Error linking program: " << std::endl;
+ std::cerr << &infoLog[0] << std::endl;
+ return false;
+ }
+
+ // Always detach shaders after a successful link.
+ glDetachShader(program_, vertexShader_);
+ glDetachShader(program_, fragmentShader_);
+
+ return true;
+}
+
+
+void ShaderProgram::UseProgram() {
+ if (!initialized()) {
+ std::cerr << "ShaderProgram: Warning cannot UseProgram() until it shaders have been added and linked. Calling LinkProgram() for you now." << std::endl;
+ LinkProgram();
+ }
+ glUseProgram(program_);
+}
+
+
+void ShaderProgram::StopProgram() {
+ glUseProgram(0);
+}
+
+
+// MinGfx math types
+void ShaderProgram::SetUniform(const std::string &name, const Point2 &p) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform2f(loc, p[0], p[1]);
+}
+
+void ShaderProgram::SetUniform(const std::string &name, const Vector2 &v) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform2f(loc, v[0], v[1]);
+}
+
+void ShaderProgram::SetUniform(const std::string &name, const Point3 &p) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform3f(loc, p[0], p[1], p[2]);
+}
+
+void ShaderProgram::SetUniform(const std::string &name, const Vector3 &v) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform3f(loc, v[0], v[1], v[2]);
+}
+
+void ShaderProgram::SetUniform(const std::string &name, const Matrix4 &m) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniformMatrix4fv(loc, 1, GL_FALSE, m.value_ptr());
+}
+
+void ShaderProgram::SetUniform(const std::string &name, const Color &c) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform4f(loc, c[0], c[1], c[2], c[3]);
+}
+
+
+// built-in types
+void ShaderProgram::SetUniform(const std::string &name, int i) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform1i(loc, i);
+}
+
+void ShaderProgram::SetUniform(const std::string &name, unsigned int ui) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform1ui(loc, ui);
+}
+
+void ShaderProgram::SetUniform(const std::string &name, float f) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform1f(loc, f);
+}
+
+
+
+// built-in types - arrays
+void ShaderProgram::SetUniformArray1(const std::string &name, int *i, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform1iv(loc, count, i);
+}
+
+void ShaderProgram::SetUniformArray1(const std::string &name, unsigned int *ui, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform1uiv(loc, count, ui);
+}
+
+void ShaderProgram::SetUniformArray1(const std::string &name, float *f, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform1fv(loc, count, f);
+}
+
+
+void ShaderProgram::SetUniformArray2(const std::string &name, int *i, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform2iv(loc, count, i);
+}
+
+void ShaderProgram::SetUniformArray2(const std::string &name, unsigned int *ui, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform2uiv(loc, count, ui);
+}
+
+void ShaderProgram::SetUniformArray2(const std::string &name, float *f, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform2fv(loc, count, f);
+}
+
+
+void ShaderProgram::SetUniformArray3(const std::string &name, int *i, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform3iv(loc, count, i);
+}
+
+void ShaderProgram::SetUniformArray3(const std::string &name, unsigned int *ui, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform3uiv(loc, count, ui);
+}
+
+void ShaderProgram::SetUniformArray3(const std::string &name, float *f, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform3fv(loc, count, f);
+}
+
+
+void ShaderProgram::SetUniformArray4(const std::string &name, int *i, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform4iv(loc, count, i);
+}
+
+void ShaderProgram::SetUniformArray4(const std::string &name, unsigned int *ui, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform4uiv(loc, count, ui);
+}
+
+void ShaderProgram::SetUniformArray4(const std::string &name, float *f, int count) {
+ UseProgram();
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform4fv(loc, count, f);
+}
+
+
+
+void ShaderProgram::BindTexture(const std::string &name, const Texture2D &tex) {
+ UseProgram();
+
+ int texUnit = 0;
+
+ std::map<std::string,int>::const_iterator it = texBindings_.find(name);
+ if (it != texBindings_.end()) {
+ // Found: This sampler was already bound to a tex unit, so use the same one
+ texUnit = texBindings_[name];
+ }
+ else {
+ // Not found: This sampler was not already bound to a tex unit, so loop through the
+ // past/current bindings and pick the next available texUnit
+ std::map<std::string,int>::const_iterator it2;
+ for (it2 = texBindings_.begin(); it2 != texBindings_.end(); ++it2) {
+ if (texUnit <= it2->second) {
+ texUnit = it2->second + 1;
+ }
+ }
+ // save it for future reference
+ texBindings_[name] = texUnit;
+ }
+
+ // associate the named shader program sampler variable with the selected texture unit
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform1i(loc, texUnit);
+ // bind the opengl texture handle to the same texture unit
+ glActiveTexture(GL_TEXTURE0 + texUnit);
+ glBindTexture(GL_TEXTURE_2D, tex.opengl_id());
+}
+
+void ShaderProgram::BindTexture(const std::string &name, const Texture2D &tex, int texUnit) {
+ UseProgram();
+
+ texBindings_[name] = texUnit;
+
+ // associate the named shader program sampler variable with the selected texture unit
+ GLint loc = glGetUniformLocation(program_, name.c_str());
+ glUniform1i(loc, texUnit);
+ // bind the opengl texture handle to the same texture unit
+ glActiveTexture(GL_TEXTURE0 + texUnit);
+ glBindTexture(GL_TEXTURE_2D, tex.opengl_id());
+}
+
+
+
+} // end namespace
+
+
diff --git a/dev/MinGfx/src/shader_program.h b/dev/MinGfx/src/shader_program.h
new file mode 100644
index 0000000..2bf5f87
--- /dev/null
+++ b/dev/MinGfx/src/shader_program.h
@@ -0,0 +1,238 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_SHADERPROGRAM_H_
+#define SRC_SHADERPROGRAM_H_
+
+#include "color.h"
+#include "matrix4.h"
+#include "opengl_headers.h"
+#include "point2.h"
+#include "point3.h"
+#include "texture2d.h"
+#include "vector2.h"
+#include "vector3.h"
+
+#include <string>
+#include <map>
+
+namespace mingfx {
+
+/** A wrapper around GLSL shader programs. This class supports loading vertex
+ and fragment shaders from files or strings, compiling them, and then linking
+ them into a shader program. Uniform variables within the shader programs can
+ be set in order to pass parameters from C++ code into the shader program.
+ Textures can also be bound to the shader. Example usage:
+ ~~~
+
+ ShaderProgram shader_prog;
+
+ void MyGraphicsApp::InitOpenGL() {
+ shader_prog.AddVertexShaderFromFile(Platform::findFile("my_shader.vert", searchPath));
+ shader_prog.AddFragmentShaderFromFile(Platform::findFile("my_shader.frag", searchPath));
+ shader_prog.LinkProgram();
+ }
+
+ void MyGraphicsApp::DrawUsingOpenGL() {
+ // Activate the shader program
+ shader_prog.UseProgram();
+
+ // Pass uniforms and textures from C++ to the GPU Shader Program
+ shader_prog.SetUniform("ModelMatrix", modelMat);
+ shader_prog.SetUniform("ViewMatrix", viewMat);
+ shader_prog.SetUniform("ProjectionMatrix", projMat);
+ shader_prog.SetUniform("LightPosition", Point3(2,2,2));
+ shader_prog.BindTexture("SurfaceTexture", my_tex);
+
+ // Draw whatever geometry you want now
+ mesh1.Draw();
+ mesh2.Draw();
+
+ // Deactivate the shader program
+ shader_prog.StopProgram();
+ }
+ ~~~
+ */
+class ShaderProgram {
+public:
+ /// Creates an empty ShaderProgram object.
+ ShaderProgram();
+
+ virtual ~ShaderProgram();
+
+
+ // ---- These should be called during startup (e.g., in InitOpenGL()) ----
+
+ /// Call during initialization but after the OpenGL context has been created
+ /// (e.g., inside InitOpenGL()). This loads the shader from the file and
+ /// compiles it. An error will be printed to stderr if there are any
+ /// compilation errors.
+ bool AddVertexShaderFromFile(const std::string &file);
+
+ /// This loads and compiles a shader from a string. An error will be printed
+ /// to stderr if there are any compilation errors.
+ bool AddVertexShaderFromSource(const std::string &code);
+
+ /// Call during initialization but after the OpenGL context has been created
+ /// (e.g., inside InitOpenGL()). This loads the shader from the file and
+ /// compiles it. An error will be printed to stderr if there are any
+ /// compilation errors.
+ bool AddFragmentShaderFromFile(const std::string &file);
+
+ /// This loads and compiles a shader from a string. An error will be printed
+ /// to stderr if there are any compilation errors.
+ bool AddFragmentShaderFromSource(const std::string &code);
+
+ /// Call this after adding vertex and fragment shaders in order to link them
+ /// together to create the full shader program. An error will be printed to
+ /// stderr if there are any linking errors.
+ bool LinkProgram();
+
+
+
+ // ---- These should be called during rendering (e.g., in DrawUsingOpenGL()) ----
+
+ /// Call this first to make the shader program active, then call SetUniform() to
+ /// pass data from your C++ program into the shader code via the named uniform
+ /// variables that appear in the code. Then render whatever geometry you wish
+ /// with your own glDrawArrays() call(s). Finally, call StopProgram() to turn
+ /// off the shader program.
+ void UseProgram();
+
+ // Set Uniform Variables in the Shader
+
+ // MinGfx types
+
+ /// Passes the x,y values of point p to the shader program and stores the
+ /// result in the shader variable named name, which should be of type vec2.
+ void SetUniform(const std::string &name, const Point2 &p);
+
+ /// Passes the x,y values of vector v to the shader program and stores the
+ /// result in the shader variable named name, which should be of type vec2.
+ void SetUniform(const std::string &name, const Vector2 &v);
+
+ /// Passes the x,y,z,1 values of point p to the shader program and stores the
+ /// result in the shader variable named name, which should be of type vec4.
+ void SetUniform(const std::string &name, const Point3 &p);
+
+ /// Passes the x,y,z,0 values of vector v to the shader program and stores the
+ /// result in the shader variable named name, which should be of type vec4.
+ void SetUniform(const std::string &name, const Vector3 &v);
+
+ /// Passes the column-major 16 float values of matrix m to the shader program
+ /// and stores the result in the shader variable named name, which should be of type mat4.
+ void SetUniform(const std::string &name, const Matrix4 &m);
+
+ /// Passes the r,g,b,a values of color c to the shader program and stores the
+ /// result in the shader variable named name, which should be of type vec4.
+ void SetUniform(const std::string &name, const Color &c);
+
+
+ // built-in types
+
+ /// Passes the int to the shader program and stores the result in the shader
+ /// variable named name, which should be of type int.
+ void SetUniform(const std::string &name, int i);
+
+ /// Passes the unsigned int to the shader program and stores the result in the shader
+ /// variable named name, which should be of type uint.
+ void SetUniform(const std::string &name, unsigned int ui);
+
+ /// Passes the float to the shader program and stores the result in the shader
+ /// variable named name, which should be of type float.
+ void SetUniform(const std::string &name, float f);
+
+
+ // built-in types (arrays)
+
+ /// Passes an array of count ints to the shader program and stores the result
+ /// in the shader variable named name, which should be of type int name[count].
+ void SetUniformArray1(const std::string &name, int *i, int count);
+
+ /// Passes an array of count unsigned ints to the shader program and stores the result
+ /// in the shader variable named name, which should be of type uint name[count].
+ void SetUniformArray1(const std::string &name, unsigned int *ui, int count);
+
+ /// Passes an array of count floats to the shader program and stores the result
+ /// in the shader variable named name, which should be of type float name[count].
+ void SetUniformArray1(const std::string &name, float *f, int count);
+
+
+ /// Passes an array of count 2D int arrays to the shader program and stores the result
+ /// in the shader variable named name, which should be of type ivec2 name[count].
+ void SetUniformArray2(const std::string &name, int *i, int count);
+
+ /// Passes an array of count 2D unsigned int arrays to the shader program and stores the result
+ /// in the shader variable named name, which should be of type uivec2 name[count].
+ void SetUniformArray2(const std::string &name, unsigned int *ui, int count);
+
+ /// Passes an array of count 2D float arrays to the shader program and stores the result
+ /// in the shader variable named name, which should be of type vec2 name[count].
+ void SetUniformArray2(const std::string &name, float *f, int count);
+
+
+ /// Passes an array of count 3D int arrays to the shader program and stores the result
+ /// in the shader variable named name, which should be of type ivec3 name[count].
+ void SetUniformArray3(const std::string &name, int *i, int count);
+
+ /// Passes an array of count 3D unsigned int arrays to the shader program and stores the result
+ /// in the shader variable named name, which should be of type uivec3 name[count].
+ void SetUniformArray3(const std::string &name, unsigned int *ui, int count);
+
+ /// Passes an array of count 3D float arrays to the shader program and stores the result
+ /// in the shader variable named name, which should be of type vec3 name[count].
+ void SetUniformArray3(const std::string &name, float *f, int count);
+
+
+ /// Passes an array of count 4D int arrays to the shader program and stores the result
+ /// in the shader variable named name, which should be of type ivec4 name[count].
+ void SetUniformArray4(const std::string &name, int *i, int count);
+
+ /// Passes an array of count 4D unsigned int arrays to the shader program and stores the result
+ /// in the shader variable named name, which should be of type uivec4 name[count].
+ void SetUniformArray4(const std::string &name, unsigned int *ui, int count);
+
+ /// Passes an array of count 4D float arrays to the shader program and stores the result
+ /// in the shader variable named name, which should be of type vec4 name[count].
+ void SetUniformArray4(const std::string &name, float *f, int count);
+
+
+ // Set Textures (Sampler Variables in the Shader)
+
+ /// Binds a Texture2D to a sampler2D in the shader program.
+ /// This version automatically selects an available texture unit, i.e., one
+ /// not already used by this shader program.
+ void BindTexture(const std::string &name, const Texture2D &tex);
+
+ /// Binds a Texture2D to a sampler2D in the shader program.
+ /// This version allows you to specify the texture unit to use.
+ void BindTexture(const std::string &name, const Texture2D &tex, int texUnit);
+
+
+ /// Call this after rendering geometry to deactivate the shader.
+ void StopProgram();
+
+ /// Returns true if the shader program has been successfully compiled and linked.
+ bool initialized();
+
+private:
+ GLuint vertexShader_;
+ GLuint fragmentShader_;
+ GLuint program_;
+ std::map<std::string, int> texBindings_;
+};
+
+
+} // end namespace
+
+#endif
diff --git a/dev/MinGfx/src/shaders/default.frag b/dev/MinGfx/src/shaders/default.frag
new file mode 100644
index 0000000..59b9f27
--- /dev/null
+++ b/dev/MinGfx/src/shaders/default.frag
@@ -0,0 +1,76 @@
+#version 330
+
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+const int MAX_LIGHTS = 10;
+
+in vec3 N;
+in vec3 v;
+in vec2 uv;
+in vec4 col_interp;
+
+out vec4 fragColor;
+
+uniform int NumLights;
+uniform vec3 LightPositions[MAX_LIGHTS];
+uniform vec4 LightIntensitiesAmbient[MAX_LIGHTS];
+uniform vec4 LightIntensitiesDiffuse[MAX_LIGHTS];
+uniform vec4 LightIntensitiesSpecular[MAX_LIGHTS];
+
+uniform vec4 MatReflectanceAmbient;
+uniform vec4 MatReflectanceDiffuse;
+uniform vec4 MatReflectanceSpecular;
+uniform float MatReflectanceShininess;
+
+uniform int UseSurfaceTexture;
+uniform sampler2D SurfaceTexture;
+
+void main() {
+
+ // initialize the fragment color to the interpolated value of per-vertex colors
+ // since some meshes will have color specified per-vertex. if there are no
+ // per vertex colors, then this will default to white.
+ fragColor = col_interp;
+
+
+ // if there is a surface texture, then factor this into the base color of this
+ // fragment as well
+ if (UseSurfaceTexture != 0) {
+ fragColor *= texture(SurfaceTexture, uv);
+ }
+
+ // modulate this base color by the additive intensity from all light sources
+ vec3 Ia = vec3(0,0,0);
+ vec3 Id = vec3(0,0,0);
+ vec3 Is = vec3(0,0,0);
+
+ vec3 n = normalize(N);
+
+ for (int i=0; i<NumLights; i++) {
+ vec3 L = normalize(LightPositions[i] - v);
+ vec3 V = normalize(-v); // eye is at (0,0,0)
+ vec3 R = normalize(-reflect(L,N));
+
+ Ia += MatReflectanceAmbient.rgb * LightIntensitiesAmbient[i].rgb;
+
+ if (dot(n,L) > 0.0) {
+ Id += clamp(MatReflectanceDiffuse.rgb * LightIntensitiesDiffuse[i].rgb * max(dot(n, L), 0.0), 0.0, 1.0);
+
+ Is += MatReflectanceSpecular.rgb * LightIntensitiesSpecular[i].rgb * pow(max(dot(R, V), 0.0), MatReflectanceShininess);
+ Is = clamp(Is, 0.0, 1.0);
+ }
+ }
+ fragColor.rgb *= Ia + Id + Is;
+}
+
diff --git a/dev/MinGfx/src/shaders/default.vert b/dev/MinGfx/src/shaders/default.vert
new file mode 100644
index 0000000..c961992
--- /dev/null
+++ b/dev/MinGfx/src/shaders/default.vert
@@ -0,0 +1,39 @@
+#version 330
+
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+layout(location = 0) in vec3 position;
+layout(location = 1) in vec3 normal;
+layout(location = 2) in vec4 color;
+layout(location = 3) in vec2 texcoord;
+
+layout(location = 8) in mat4 instance_xform;
+
+uniform mat4 ModelMatrix;
+uniform mat4 ViewMatrix;
+uniform mat4 ProjectionMatrix;
+uniform mat4 NormalMatrix;
+
+out vec3 N;
+out vec3 v;
+out vec2 uv;
+out vec4 col_interp;
+
+void main() {
+ v = (ViewMatrix * ModelMatrix * vec4(position, 1)).xyz;
+ N = normalize((NormalMatrix * vec4(normal, 0)).xyz);
+ uv = texcoord.xy;
+ gl_Position = ProjectionMatrix * ViewMatrix * instance_xform * ModelMatrix * vec4(position, 1);
+ col_interp = color;
+} \ No newline at end of file
diff --git a/dev/MinGfx/src/shaders/fullscreen.frag b/dev/MinGfx/src/shaders/fullscreen.frag
new file mode 100644
index 0000000..ce3d624
--- /dev/null
+++ b/dev/MinGfx/src/shaders/fullscreen.frag
@@ -0,0 +1,23 @@
+#version 330
+
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+in vec2 uv;
+uniform sampler2D SurfaceTexture;
+
+out vec4 fragColor;
+
+void main() {
+ fragColor = texture(SurfaceTexture, uv);
+} \ No newline at end of file
diff --git a/dev/MinGfx/src/shaders/fullscreen.vert b/dev/MinGfx/src/shaders/fullscreen.vert
new file mode 100644
index 0000000..db96659
--- /dev/null
+++ b/dev/MinGfx/src/shaders/fullscreen.vert
@@ -0,0 +1,24 @@
+#version 330
+
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+layout(location = 0) in vec3 position;
+layout(location = 3) in vec2 texcoord;
+
+out vec2 uv;
+
+void main() {
+ uv = texcoord.xy;
+ gl_Position = vec4(position,1.0);
+}
diff --git a/dev/MinGfx/src/shaders/text.frag b/dev/MinGfx/src/shaders/text.frag
new file mode 100644
index 0000000..2642061
--- /dev/null
+++ b/dev/MinGfx/src/shaders/text.frag
@@ -0,0 +1,25 @@
+#version 330
+
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+in vec2 uv;
+uniform vec4 color;
+uniform sampler2D font_atlas;
+
+out vec4 frag_color;
+
+void main() {
+ frag_color = color * texture(font_atlas, uv);
+ // frag_color.a = frag_color.r;
+} \ No newline at end of file
diff --git a/dev/MinGfx/src/shaders/text.vert b/dev/MinGfx/src/shaders/text.vert
new file mode 100644
index 0000000..36c6b03
--- /dev/null
+++ b/dev/MinGfx/src/shaders/text.vert
@@ -0,0 +1,28 @@
+#version 330
+
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+layout(location = 0) in vec3 vertex;
+layout(location = 3) in vec2 texcoord;
+
+uniform mat4 mvp_matrix;
+uniform float scale;
+uniform vec3 offset;
+
+out vec2 uv;
+
+void main() {
+ uv = texcoord.xy;
+ gl_Position = mvp_matrix * vec4(scale*(vertex+offset),1.0);
+}
diff --git a/dev/MinGfx/src/stb_rect_pack.h b/dev/MinGfx/src/stb_rect_pack.h
new file mode 100644
index 0000000..9faf578
--- /dev/null
+++ b/dev/MinGfx/src/stb_rect_pack.h
@@ -0,0 +1,624 @@
+// stb_rect_pack.h - v0.11 - public domain - rectangle packing
+// Sean Barrett 2014
+//
+// Useful for e.g. packing rectangular textures into an atlas.
+// Does not do rotation.
+//
+// Not necessarily the awesomest packing method, but better than
+// the totally naive one in stb_truetype (which is primarily what
+// this is meant to replace).
+//
+// Has only had a few tests run, may have issues.
+//
+// More docs to come.
+//
+// No memory allocations; uses qsort() and assert() from stdlib.
+// Can override those by defining STBRP_SORT and STBRP_ASSERT.
+//
+// This library currently uses the Skyline Bottom-Left algorithm.
+//
+// Please note: better rectangle packers are welcome! Please
+// implement them to the same API, but with a different init
+// function.
+//
+// Credits
+//
+// Library
+// Sean Barrett
+// Minor features
+// Martins Mozeiko
+// github:IntellectualKitty
+//
+// Bugfixes / warning fixes
+// Jeremy Jaussaud
+//
+// Version history:
+//
+// 0.11 (2017-03-03) return packing success/fail result
+// 0.10 (2016-10-25) remove cast-away-const to avoid warnings
+// 0.09 (2016-08-27) fix compiler warnings
+// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0)
+// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0)
+// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort
+// 0.05: added STBRP_ASSERT to allow replacing assert
+// 0.04: fixed minor bug in STBRP_LARGE_RECTS support
+// 0.01: initial release
+//
+// LICENSE
+//
+// See end of file for license information.
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// INCLUDE SECTION
+//
+
+#ifndef STB_INCLUDE_STB_RECT_PACK_H
+#define STB_INCLUDE_STB_RECT_PACK_H
+
+#define STB_RECT_PACK_VERSION 1
+
+#ifdef STBRP_STATIC
+#define STBRP_DEF static
+#else
+#define STBRP_DEF extern
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct stbrp_context stbrp_context;
+typedef struct stbrp_node stbrp_node;
+typedef struct stbrp_rect stbrp_rect;
+
+#ifdef STBRP_LARGE_RECTS
+typedef int stbrp_coord;
+#else
+typedef unsigned short stbrp_coord;
+#endif
+
+STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects);
+// Assign packed locations to rectangles. The rectangles are of type
+// 'stbrp_rect' defined below, stored in the array 'rects', and there
+// are 'num_rects' many of them.
+//
+// Rectangles which are successfully packed have the 'was_packed' flag
+// set to a non-zero value and 'x' and 'y' store the minimum location
+// on each axis (i.e. bottom-left in cartesian coordinates, top-left
+// if you imagine y increasing downwards). Rectangles which do not fit
+// have the 'was_packed' flag set to 0.
+//
+// You should not try to access the 'rects' array from another thread
+// while this function is running, as the function temporarily reorders
+// the array while it executes.
+//
+// To pack into another rectangle, you need to call stbrp_init_target
+// again. To continue packing into the same rectangle, you can call
+// this function again. Calling this multiple times with multiple rect
+// arrays will probably produce worse packing results than calling it
+// a single time with the full rectangle array, but the option is
+// available.
+//
+// The function returns 1 if all of the rectangles were successfully
+// packed and 0 otherwise.
+
+struct stbrp_rect
+{
+ // reserved for your use:
+ int id;
+
+ // input:
+ stbrp_coord w, h;
+
+ // output:
+ stbrp_coord x, y;
+ int was_packed; // non-zero if valid packing
+
+}; // 16 bytes, nominally
+
+
+STBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes);
+// Initialize a rectangle packer to:
+// pack a rectangle that is 'width' by 'height' in dimensions
+// using temporary storage provided by the array 'nodes', which is 'num_nodes' long
+//
+// You must call this function every time you start packing into a new target.
+//
+// There is no "shutdown" function. The 'nodes' memory must stay valid for
+// the following stbrp_pack_rects() call (or calls), but can be freed after
+// the call (or calls) finish.
+//
+// Note: to guarantee best results, either:
+// 1. make sure 'num_nodes' >= 'width'
+// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1'
+//
+// If you don't do either of the above things, widths will be quantized to multiples
+// of small integers to guarantee the algorithm doesn't run out of temporary storage.
+//
+// If you do #2, then the non-quantized algorithm will be used, but the algorithm
+// may run out of temporary storage and be unable to pack some rectangles.
+
+STBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem);
+// Optionally call this function after init but before doing any packing to
+// change the handling of the out-of-temp-memory scenario, described above.
+// If you call init again, this will be reset to the default (false).
+
+
+STBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic);
+// Optionally select which packing heuristic the library should use. Different
+// heuristics will produce better/worse results for different data sets.
+// If you call init again, this will be reset to the default.
+
+enum
+{
+ STBRP_HEURISTIC_Skyline_default=0,
+ STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default,
+ STBRP_HEURISTIC_Skyline_BF_sortHeight
+};
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// the details of the following structures don't matter to you, but they must
+// be visible so you can handle the memory allocations for them
+
+struct stbrp_node
+{
+ stbrp_coord x,y;
+ stbrp_node *next;
+};
+
+struct stbrp_context
+{
+ int width;
+ int height;
+ int align;
+ int init_mode;
+ int heuristic;
+ int num_nodes;
+ stbrp_node *active_head;
+ stbrp_node *free_head;
+ stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2'
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// IMPLEMENTATION SECTION
+//
+
+#ifdef STB_RECT_PACK_IMPLEMENTATION
+#ifndef STBRP_SORT
+#include <stdlib.h>
+#define STBRP_SORT qsort
+#endif
+
+#ifndef STBRP_ASSERT
+#include <assert.h>
+#define STBRP_ASSERT assert
+#endif
+
+#ifdef _MSC_VER
+#define STBRP__NOTUSED(v) (void)(v)
+#else
+#define STBRP__NOTUSED(v) (void)sizeof(v)
+#endif
+
+enum
+{
+ STBRP__INIT_skyline = 1
+};
+
+STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic)
+{
+ switch (context->init_mode) {
+ case STBRP__INIT_skyline:
+ STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight);
+ context->heuristic = heuristic;
+ break;
+ default:
+ STBRP_ASSERT(0);
+ }
+}
+
+STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem)
+{
+ if (allow_out_of_mem)
+ // if it's ok to run out of memory, then don't bother aligning them;
+ // this gives better packing, but may fail due to OOM (even though
+ // the rectangles easily fit). @TODO a smarter approach would be to only
+ // quantize once we've hit OOM, then we could get rid of this parameter.
+ context->align = 1;
+ else {
+ // if it's not ok to run out of memory, then quantize the widths
+ // so that num_nodes is always enough nodes.
+ //
+ // I.e. num_nodes * align >= width
+ // align >= width / num_nodes
+ // align = ceil(width/num_nodes)
+
+ context->align = (context->width + context->num_nodes-1) / context->num_nodes;
+ }
+}
+
+STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes)
+{
+ int i;
+#ifndef STBRP_LARGE_RECTS
+ STBRP_ASSERT(width <= 0xffff && height <= 0xffff);
+#endif
+
+ for (i=0; i < num_nodes-1; ++i)
+ nodes[i].next = &nodes[i+1];
+ nodes[i].next = NULL;
+ context->init_mode = STBRP__INIT_skyline;
+ context->heuristic = STBRP_HEURISTIC_Skyline_default;
+ context->free_head = &nodes[0];
+ context->active_head = &context->extra[0];
+ context->width = width;
+ context->height = height;
+ context->num_nodes = num_nodes;
+ stbrp_setup_allow_out_of_mem(context, 0);
+
+ // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly)
+ context->extra[0].x = 0;
+ context->extra[0].y = 0;
+ context->extra[0].next = &context->extra[1];
+ context->extra[1].x = (stbrp_coord) width;
+#ifdef STBRP_LARGE_RECTS
+ context->extra[1].y = (1<<30);
+#else
+ context->extra[1].y = 65535;
+#endif
+ context->extra[1].next = NULL;
+}
+
+// find minimum y position if it starts at x1
+static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste)
+{
+ stbrp_node *node = first;
+ int x1 = x0 + width;
+ int min_y, visited_width, waste_area;
+
+ STBRP__NOTUSED(c);
+
+ STBRP_ASSERT(first->x <= x0);
+
+ #if 0
+ // skip in case we're past the node
+ while (node->next->x <= x0)
+ ++node;
+ #else
+ STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency
+ #endif
+
+ STBRP_ASSERT(node->x <= x0);
+
+ min_y = 0;
+ waste_area = 0;
+ visited_width = 0;
+ while (node->x < x1) {
+ if (node->y > min_y) {
+ // raise min_y higher.
+ // we've accounted for all waste up to min_y,
+ // but we'll now add more waste for everything we've visted
+ waste_area += visited_width * (node->y - min_y);
+ min_y = node->y;
+ // the first time through, visited_width might be reduced
+ if (node->x < x0)
+ visited_width += node->next->x - x0;
+ else
+ visited_width += node->next->x - node->x;
+ } else {
+ // add waste area
+ int under_width = node->next->x - node->x;
+ if (under_width + visited_width > width)
+ under_width = width - visited_width;
+ waste_area += under_width * (min_y - node->y);
+ visited_width += under_width;
+ }
+ node = node->next;
+ }
+
+ *pwaste = waste_area;
+ return min_y;
+}
+
+typedef struct
+{
+ int x,y;
+ stbrp_node **prev_link;
+} stbrp__findresult;
+
+static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height)
+{
+ int best_waste = (1<<30), best_x, best_y = (1 << 30);
+ stbrp__findresult fr;
+ stbrp_node **prev, *node, *tail, **best = NULL;
+
+ // align to multiple of c->align
+ width = (width + c->align - 1);
+ width -= width % c->align;
+ STBRP_ASSERT(width % c->align == 0);
+
+ node = c->active_head;
+ prev = &c->active_head;
+ while (node->x + width <= c->width) {
+ int y,waste;
+ y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste);
+ if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL
+ // bottom left
+ if (y < best_y) {
+ best_y = y;
+ best = prev;
+ }
+ } else {
+ // best-fit
+ if (y + height <= c->height) {
+ // can only use it if it first vertically
+ if (y < best_y || (y == best_y && waste < best_waste)) {
+ best_y = y;
+ best_waste = waste;
+ best = prev;
+ }
+ }
+ }
+ prev = &node->next;
+ node = node->next;
+ }
+
+ best_x = (best == NULL) ? 0 : (*best)->x;
+
+ // if doing best-fit (BF), we also have to try aligning right edge to each node position
+ //
+ // e.g, if fitting
+ //
+ // ____________________
+ // |____________________|
+ //
+ // into
+ //
+ // | |
+ // | ____________|
+ // |____________|
+ //
+ // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned
+ //
+ // This makes BF take about 2x the time
+
+ if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) {
+ tail = c->active_head;
+ node = c->active_head;
+ prev = &c->active_head;
+ // find first node that's admissible
+ while (tail->x < width)
+ tail = tail->next;
+ while (tail) {
+ int xpos = tail->x - width;
+ int y,waste;
+ STBRP_ASSERT(xpos >= 0);
+ // find the left position that matches this
+ while (node->next->x <= xpos) {
+ prev = &node->next;
+ node = node->next;
+ }
+ STBRP_ASSERT(node->next->x > xpos && node->x <= xpos);
+ y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);
+ if (y + height < c->height) {
+ if (y <= best_y) {
+ if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) {
+ best_x = xpos;
+ STBRP_ASSERT(y <= best_y);
+ best_y = y;
+ best_waste = waste;
+ best = prev;
+ }
+ }
+ }
+ tail = tail->next;
+ }
+ }
+
+ fr.prev_link = best;
+ fr.x = best_x;
+ fr.y = best_y;
+ return fr;
+}
+
+static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height)
+{
+ // find best position according to heuristic
+ stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height);
+ stbrp_node *node, *cur;
+
+ // bail if:
+ // 1. it failed
+ // 2. the best node doesn't fit (we don't always check this)
+ // 3. we're out of memory
+ if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) {
+ res.prev_link = NULL;
+ return res;
+ }
+
+ // on success, create new node
+ node = context->free_head;
+ node->x = (stbrp_coord) res.x;
+ node->y = (stbrp_coord) (res.y + height);
+
+ context->free_head = node->next;
+
+ // insert the new node into the right starting point, and
+ // let 'cur' point to the remaining nodes needing to be
+ // stiched back in
+
+ cur = *res.prev_link;
+ if (cur->x < res.x) {
+ // preserve the existing one, so start testing with the next one
+ stbrp_node *next = cur->next;
+ cur->next = node;
+ cur = next;
+ } else {
+ *res.prev_link = node;
+ }
+
+ // from here, traverse cur and free the nodes, until we get to one
+ // that shouldn't be freed
+ while (cur->next && cur->next->x <= res.x + width) {
+ stbrp_node *next = cur->next;
+ // move the current node to the free list
+ cur->next = context->free_head;
+ context->free_head = cur;
+ cur = next;
+ }
+
+ // stitch the list back in
+ node->next = cur;
+
+ if (cur->x < res.x + width)
+ cur->x = (stbrp_coord) (res.x + width);
+
+#ifdef _DEBUG
+ cur = context->active_head;
+ while (cur->x < context->width) {
+ STBRP_ASSERT(cur->x < cur->next->x);
+ cur = cur->next;
+ }
+ STBRP_ASSERT(cur->next == NULL);
+
+ {
+ stbrp_node *L1 = NULL, *L2 = NULL;
+ int count=0;
+ cur = context->active_head;
+ while (cur) {
+ L1 = cur;
+ cur = cur->next;
+ ++count;
+ }
+ cur = context->free_head;
+ while (cur) {
+ L2 = cur;
+ cur = cur->next;
+ ++count;
+ }
+ STBRP_ASSERT(count == context->num_nodes+2);
+ }
+#endif
+
+ return res;
+}
+
+static int rect_height_compare(const void *a, const void *b)
+{
+ const stbrp_rect *p = (const stbrp_rect *) a;
+ const stbrp_rect *q = (const stbrp_rect *) b;
+ if (p->h > q->h)
+ return -1;
+ if (p->h < q->h)
+ return 1;
+ return (p->w > q->w) ? -1 : (p->w < q->w);
+}
+
+static int rect_original_order(const void *a, const void *b)
+{
+ const stbrp_rect *p = (const stbrp_rect *) a;
+ const stbrp_rect *q = (const stbrp_rect *) b;
+ return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed);
+}
+
+#ifdef STBRP_LARGE_RECTS
+#define STBRP__MAXVAL 0xffffffff
+#else
+#define STBRP__MAXVAL 0xffff
+#endif
+
+STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects)
+{
+ int i, all_rects_packed = 1;
+
+ // we use the 'was_packed' field internally to allow sorting/unsorting
+ for (i=0; i < num_rects; ++i) {
+ rects[i].was_packed = i;
+ #ifndef STBRP_LARGE_RECTS
+ STBRP_ASSERT(rects[i].w <= 0xffff && rects[i].h <= 0xffff);
+ #endif
+ }
+
+ // sort according to heuristic
+ STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare);
+
+ for (i=0; i < num_rects; ++i) {
+ if (rects[i].w == 0 || rects[i].h == 0) {
+ rects[i].x = rects[i].y = 0; // empty rect needs no space
+ } else {
+ stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);
+ if (fr.prev_link) {
+ rects[i].x = (stbrp_coord) fr.x;
+ rects[i].y = (stbrp_coord) fr.y;
+ } else {
+ rects[i].x = rects[i].y = STBRP__MAXVAL;
+ }
+ }
+ }
+
+ // unsort
+ STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order);
+
+ // set was_packed flags and all_rects_packed status
+ for (i=0; i < num_rects; ++i) {
+ rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL);
+ if (!rects[i].was_packed)
+ all_rects_packed = 0;
+ }
+
+ // return the all_rects_packed status
+ return all_rects_packed;
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+This software is available under 2 licenses -- choose whichever you prefer.
+------------------------------------------------------------------------------
+ALTERNATIVE A - MIT License
+Copyright (c) 2017 Sean Barrett
+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.
+------------------------------------------------------------------------------
+ALTERNATIVE B - Public Domain (www.unlicense.org)
+This is free and unencumbered software released into the public domain.
+Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
+software, either in source code form or as a compiled binary, for any purpose,
+commercial or non-commercial, and by any means.
+In jurisdictions that recognize copyright laws, the author or authors of this
+software dedicate any and all copyright interest in the software to the public
+domain. We make this dedication for the benefit of the public at large and to
+the detriment of our heirs and successors. We intend this dedication to be an
+overt act of relinquishment in perpetuity of all present and future rights to
+this software under copyright law.
+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 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.
+------------------------------------------------------------------------------
+*/
diff --git a/dev/MinGfx/src/text_shader.cc b/dev/MinGfx/src/text_shader.cc
new file mode 100644
index 0000000..ca99953
--- /dev/null
+++ b/dev/MinGfx/src/text_shader.cc
@@ -0,0 +1,238 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "text_shader.h"
+
+#include "platform.h"
+#include <fstream>
+
+// disable warnings for this 3rd party code
+#pragma warning (push, 0)
+#define STB_RECT_PACK_IMPLEMENTATION
+#include "stb_rect_pack.h"
+#define STB_TRUETYPE_IMPLEMENTATION
+#include <stb_truetype.h>
+#pragma warning (pop)
+
+
+namespace mingfx {
+
+// Reference implementation: https://github.com/nothings/stb/blob/master/tests/oversample/main.c
+
+
+TextShader::TextShader() : native_font_size_(0.0)
+{
+ for (int i = 0; i < 128; i++) {
+ chardata_[i] = stbtt_packedchar();
+ }
+}
+
+TextShader::~TextShader() {
+}
+
+
+bool TextShader::Init(const std::string &filename, int font_size) {
+ // load shader
+ shader_.AddVertexShaderFromFile(Platform::FindMinGfxShaderFile("text.vert"));
+ shader_.AddFragmentShaderFromFile(Platform::FindMinGfxShaderFile("text.frag"));
+ shader_.LinkProgram();
+
+ // load font
+ native_font_size_ = (float)font_size;
+ std::ifstream is(filename.c_str(), std::ifstream::binary);
+ if (is) {
+ is.seekg(0, is.end);
+ int length = (int)is.tellg();
+ is.seekg(0, is.beg);
+
+ char *ttf_buffer = new char[length];
+ is.read(ttf_buffer, length);
+ if (is)
+ std::cout << "all characters read successfully.";
+ else
+ std::cout << "error: only " << is.gcount() << " could be read";
+ is.close();
+
+ // todo: calc an appropriate pow of 2 size given the font_size
+ int atlas_width = 1024;
+ int atlas_height = 1024;
+
+ stbtt_pack_context pc;
+ unsigned char *bitmap = new unsigned char[(size_t)atlas_width * atlas_height];
+
+ stbtt_PackBegin(&pc, bitmap, atlas_width, atlas_height, 0, 1, NULL);
+ stbtt_PackSetOversampling(&pc, 2, 2);
+ stbtt_PackFontRange(&pc, (unsigned char*)ttf_buffer, 0, (float)font_size, 32, 95, chardata_+32);
+ stbtt_PackEnd(&pc);
+
+ // convert to 4-channel since that is all that Texture2D currently supports
+ unsigned char *bitmap4D = new unsigned char[(size_t)4 * atlas_width * atlas_height];
+ for (int i=0; i < atlas_width * atlas_height; i++) {
+ bitmap4D[4*i + 0] = bitmap[i];
+ bitmap4D[4*i + 1] = bitmap[i];
+ bitmap4D[4*i + 2] = bitmap[i];
+ bitmap4D[4*i + 3] = bitmap[i];
+ }
+
+ atlas_.InitFromBytes(atlas_width, atlas_height, bitmap4D);
+
+ delete [] ttf_buffer;
+ delete [] bitmap;
+ delete [] bitmap4D;
+
+ return true;
+ }
+ else {
+ std::cerr << "TextShader: Error font file does not exist: " << filename << std::endl;
+ return false;
+ }
+
+}
+
+
+void TextShader::Draw3D(const Matrix4 &model, const Matrix4 &view, const Matrix4 &projection,
+ const std::string &text, TextFormat format, bool cache)
+{
+ MeshData *md = NULL;
+ std::map<std::string, MeshData>::iterator it = cache_.find(text);
+ if (it != cache_.end()) {
+ // use an existing cached mesh
+ md = &(it->second);
+ }
+ else {
+ // need to create a new mesh, add a new one to the cache or use the tmp_mesh
+ if (cache) {
+ MeshData new_md;
+ cache_[text] = new_md;
+ md = &(cache_[text]);
+ }
+ else {
+ md = &tmp_md_;
+ }
+
+ // set appropriate vertices and texcoords for this text string
+ SetTextMesh(text, md);
+ }
+
+ Vector3 offset;
+ if (format.h_align == HorizAlign::HORIZ_ALIGN_LEFT) {
+ offset[0] = 0;
+ }
+ else if (format.h_align == HorizAlign::HORIZ_ALIGN_CENTER) {
+ offset[0] = -0.5f * (md->max[0] - md->min[0]);
+ }
+ else if (format.h_align == HorizAlign::HORIZ_ALIGN_RIGHT) {
+ offset[0] = -(md->max[0] - md->min[0]);
+ }
+
+ if (format.v_align == VertAlign::VERT_ALIGN_TOP) {
+ offset[1] = -md->max[1];
+ }
+ else if (format.v_align == VertAlign::VERT_ALIGN_CENTER) {
+ offset[1] = -0.5f * md->max[1];
+ }
+ else if (format.v_align == VertAlign::VERT_ALIGN_BASELINE) {
+ offset[1] = 0;
+ }
+ else if (format.v_align == VertAlign::VERT_ALIGN_BOTTOM) {
+ offset[1] = -md->min[1];
+ }
+
+ glDisable(GL_CULL_FACE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ shader_.UseProgram();
+ Matrix4 mvp = projection * view * model;
+ shader_.SetUniform("mvp_matrix", mvp);
+ shader_.SetUniform("scale", format.size / native_font_size_);
+ shader_.SetUniform("offset", offset);
+ shader_.SetUniform("color", format.color);
+ shader_.BindTexture("font_atlas", atlas_);
+ md->mesh.Draw();
+ shader_.StopProgram();
+
+ glEnable(GL_CULL_FACE);
+}
+
+
+void TextShader::SetTextMesh(const std::string &text, MeshData *md) {
+ std::vector<Point3> verts;
+ std::vector<Point2> uvs;
+ std::vector<unsigned int> indices;
+
+ const char *c = text.c_str();
+ float x = 0.0;
+ float y = 0.0;
+ while (*c) {
+ stbtt_aligned_quad q;
+ stbtt_GetPackedQuad(chardata_, atlas_.width(), atlas_.height(), *c++, &x, &y, &q, 0);
+
+ // top left
+ verts.push_back(Point3(q.x0, -q.y0, 0.0));
+ uvs.push_back(Point2(q.s0, q.t0));
+ // top right
+ verts.push_back(Point3(q.x1, -q.y0, 0.0));
+ uvs.push_back(Point2(q.s1, q.t0));
+ // bot right
+ verts.push_back(Point3(q.x1, -q.y1, 0.0));
+ uvs.push_back(Point2(q.s1, q.t1));
+ // bot left
+ verts.push_back(Point3(q.x0, -q.y1, 0.0));
+ uvs.push_back(Point2(q.s0, q.t1));
+
+
+ indices.push_back((unsigned int)verts.size()-2);
+ indices.push_back((unsigned int)verts.size()-3);
+ indices.push_back((unsigned int)verts.size()-4);
+
+ indices.push_back((unsigned int)verts.size()-2);
+ indices.push_back((unsigned int)verts.size()-4);
+ indices.push_back((unsigned int)verts.size()-1);
+ }
+
+ md->mesh.SetVertices(verts);
+ md->mesh.SetTexCoords(0, uvs);
+ md->mesh.SetIndices(indices);
+
+ md->min = Point2(verts[0][0], verts[0][1]);
+ md->max = md->min;
+ for (int i=0; i<verts.size(); i++) {
+ Point3 p = verts[i];
+ if (p[0] < md->min[0]) md->min[0] = p[0];
+ if (p[0] > md->max[0]) md->max[0] = p[0];
+ if (p[1] < md->min[1]) md->min[1] = p[1];
+ if (p[1] > md->max[1]) md->max[1] = p[1];
+ }
+}
+
+Vector2 TextShader::TextExtents(const std::string &text, TextFormat format, bool cache) {
+ MeshData *md = NULL;
+ std::map<std::string, MeshData>::iterator it = cache_.find(text);
+ if (it != cache_.end()) {
+ // use an existing cached mesh
+ md = &(it->second);
+ }
+ else {
+ // need to create a new mesh, add a new one to the cache or use the tmp_mesh
+ if (cache) {
+ MeshData new_md;
+ cache_[text] = new_md;
+ md = &(cache_[text]);
+ }
+ else {
+ md = &tmp_md_;
+ }
+
+ // set appropriate vertices and texcoords for this text string
+ SetTextMesh(text, md);
+ }
+
+ return format.size / native_font_size_ * (md->max - md->min);
+}
+
+
+} // end namespace \ No newline at end of file
diff --git a/dev/MinGfx/src/text_shader.h b/dev/MinGfx/src/text_shader.h
new file mode 100644
index 0000000..a075cd2
--- /dev/null
+++ b/dev/MinGfx/src/text_shader.h
@@ -0,0 +1,110 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_TEXT_SHADER_H_
+#define SRC_TEXT_SHADER_H_
+
+#include <string>
+#include <map>
+
+#include "matrix4.h"
+#include "mesh.h"
+#include "shader_program.h"
+#include "texture2d.h"
+
+// disable warnings for this 3rd party code
+#pragma warning ( push, 0 )
+#include <stb_truetype.h>
+#pragma warning ( pop )
+
+namespace mingfx {
+
+
+
+/**
+ */
+class TextShader {
+public:
+ TextShader();
+ virtual ~TextShader();
+
+ /// Call this from within the InitOpenGL() function since it will initialize
+ /// not just the Font's internal data but also an OpenGL texture to be
+ /// stored on the graphics card. Internally, this uses the stb_truetype
+ /// library to load true type fonts (files with a .ttf extension).
+ bool Init(const std::string &font_file, int native_font_size);
+
+ enum class HorizAlign {
+ HORIZ_ALIGN_LEFT,
+ HORIZ_ALIGN_CENTER,
+ HORIZ_ALIGN_RIGHT
+ };
+
+ enum class VertAlign {
+ VERT_ALIGN_TOP,
+ VERT_ALIGN_CENTER,
+ VERT_ALIGN_BASELINE,
+ VERT_ALIGN_BOTTOM
+ };
+
+ class TextFormat {
+ public:
+ // constructor sets defaults
+ TextFormat() :
+ size(0.1f),
+ color(1,1,1,1),
+ h_align(HorizAlign::HORIZ_ALIGN_CENTER),
+ v_align(VertAlign::VERT_ALIGN_BASELINE) {}
+
+ float size;
+ Color color;
+ HorizAlign h_align;
+ VertAlign v_align;
+ };
+
+
+ //void Draw2D(const Point2 &pos,
+ // const std::string &text, TextFormat format, bool cache=false);
+
+
+ void Draw3D(const Matrix4 &model, const Matrix4 &view, const Matrix4 &projection,
+ const std::string &text, TextFormat format, bool cache=false);
+
+
+ Vector2 TextExtents(const std::string &text, TextFormat format, bool cache=false);
+
+ float native_font_size();
+
+private:
+ Texture2D atlas_;
+ float native_font_size_;
+
+ stbtt_packedchar chardata_[128];
+
+ struct MeshData {
+ Mesh mesh;
+ Point2 min;
+ Point2 max;
+ };
+
+ void SetTextMesh(const std::string &text, MeshData *md);
+
+ std::map<std::string, MeshData> cache_;
+ MeshData tmp_md_;
+
+ ShaderProgram shader_;
+};
+
+} // end namespace
+
+#endif
diff --git a/dev/MinGfx/src/texture2d.cc b/dev/MinGfx/src/texture2d.cc
new file mode 100644
index 0000000..230ad5f
--- /dev/null
+++ b/dev/MinGfx/src/texture2d.cc
@@ -0,0 +1,232 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "texture2d.h"
+#include "platform.h"
+
+#pragma warning (push)
+#pragma warning (disable : 6001)
+#pragma warning (disable : 6011)
+#pragma warning (disable : 6262)
+#pragma warning (disable : 6385)
+#pragma warning (disable : 6387)
+#pragma warning (disable : 26450)
+#pragma warning (disable : 26451)
+#pragma warning (disable : 26453)
+#pragma warning (disable : 26495)
+#pragma warning (disable : 26812)
+
+#ifdef WIN32
+ // this is not needed on OSX or Linux, it must pick up the symbols from
+ // libnanogui.so, but it appears to be needed on Windows.
+ #define STB_IMAGE_IMPLEMENTATION
+#endif
+#include <stb_image.h>
+
+#pragma warning (pop)
+
+#include <iostream>
+
+
+namespace mingfx {
+
+
+
+Texture2D::Texture2D(GLenum wrapMode, GLenum filterMode) :
+ dataType_(GL_UNSIGNED_BYTE), data_ubyte_(NULL), data_float_(NULL),
+ width_(0), height_(0), handleMemInternally_(true), texID_(0),
+ wrapMode_(wrapMode), filterMode_(filterMode)
+{
+}
+
+Texture2D::~Texture2D() {
+
+ // Mem handled internally is always of type data_ubyte_ because that is
+ // what the stbi image loading library returns
+ if ((handleMemInternally_) && (data_ubyte_ != NULL)) {
+ // BUG, TODO: Not sure why the call below does not seem to work.
+ // There will be a mem leak unless we can call this somehow.
+ //stbi_image_free(data_);
+ }
+
+ // This is how to delete GL's version of the texture on the GPU
+ // but you have to be very careful with this. For example, if we cause
+ // C++ to make a tmp copy of the Texture2D or we do an assignment tex1=tex2
+ // we now have two Texture2D objects pointing to the same OpenGL texture id.
+ // If one of them is deleted before the other, then the other will not be
+ // able to draw itself because the OpenGL tex id will be invalid. For now,
+ // this is "addressed" by simply skipping the glDeleteTextures call. This
+ // leads to some wasted OpenGL memory, and that would be a good thing to
+ // fix in the future, maybe via a shared_ptr or static refcount that maps
+ // opengl texids to a count of Texture2D objects that reference them. Then,
+ // only delete the opengl tex if the refcount would go to 0.
+ //glDeleteTextures(1, &texID_);
+}
+
+
+bool Texture2D::InitFromFile(const std::string &filename) {
+ handleMemInternally_ = true;
+ dataType_ = GL_UNSIGNED_BYTE;
+
+
+ std::cout << "Loading texture from file: " << filename << std::endl;
+
+ if (Platform::FileExists(filename)) {
+ stbi_set_unpremultiply_on_load(1);
+ stbi_convert_iphone_png_to_rgb(1);
+ int numChannels;
+ data_ubyte_ = stbi_load(filename.c_str(), &width_, &height_, &numChannels, 4);
+ if (data_ubyte_ == NULL) {
+ std::cerr << "Texture2D: Failed to load file " << filename << " - " << stbi_failure_reason() << std::endl;
+ return false;
+ }
+ }
+ else {
+ std::cerr << "Texture2D: File " << filename << " does not exist." << std::endl;
+ return false;
+ }
+
+ return InitOpenGL();
+}
+
+bool Texture2D::InitFromBytes(int width, int height, const unsigned char * data) {
+ handleMemInternally_ = false;
+ width_ = width;
+ height_ = height;
+ data_ubyte_ = data;
+ dataType_ = GL_UNSIGNED_BYTE;
+
+ return InitOpenGL();
+}
+
+bool Texture2D::InitFromFloats(int width, int height, const float * data) {
+ handleMemInternally_ = false;
+ width_ = width;
+ height_ = height;
+ data_float_ = data;
+ dataType_ = GL_FLOAT;
+
+ return InitOpenGL();
+}
+
+bool Texture2D::InitOpenGL() {
+ glGenTextures(1, &texID_);
+ glBindTexture(GL_TEXTURE_2D, texID_);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode_);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode_);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterMode_);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterMode_);
+
+ if (dataType_ == GL_UNSIGNED_BYTE) {
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width_, height_, 0, GL_RGBA, dataType_, data_ubyte_);
+ }
+ else if (dataType_ == GL_FLOAT) {
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width_, height_, 0, GL_RGBA, dataType_, data_float_);
+ }
+ else {
+ std::cerr << "Texture2D: Unsupported texture data type " << dataType_ << "." << std::endl;
+ return false;
+ }
+
+ return true;
+}
+
+
+bool Texture2D::UpdateFromBytes(const unsigned char * data) {
+ dataType_ = GL_UNSIGNED_BYTE;
+ data_ubyte_ = data;
+ glBindTexture(GL_TEXTURE_2D, texID_);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width_, height_, 0, GL_RGBA, dataType_, data_ubyte_);
+ // presumably glTexSubImage2D is faster, but this crashes on OSX for some reason
+ //glActiveTexture(texID_);
+ //glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width_, height_, GL_RGBA, dataType_, data_ubyte_);
+ return true;
+}
+
+bool Texture2D::UpdateFromFloats(const float * data) {
+ dataType_ = GL_FLOAT;
+ data_float_ = data;
+ glBindTexture(GL_TEXTURE_2D, texID_);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width_, height_, 0, GL_RGBA, dataType_, data_float_);
+ // presumably glTexSubImage2D is faster, but this crashes on OSX for some reason
+ //glActiveTexture(texID_);
+ //glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width_, height_, GL_RGBA, dataType_, data_ubyte_);
+ return true;
+}
+
+
+
+int Texture2D::width() const {
+ return width_;
+}
+
+int Texture2D::height() const {
+ return height_;
+}
+
+
+GLuint Texture2D::opengl_id() const {
+ if (!initialized()) {
+ std::cerr << "Texture2D: Warning, accessing opengl_id() before it has been initialized." << std::endl
+ << "You might be calling opengl_id() before InitOpenGL(). Or, there might have been a" << std::endl
+ << "error loading texture data or binding it to OpenGL." << std::endl;
+ }
+ return texID_;
+}
+
+GLenum Texture2D::wrap_mode() const {
+ return wrapMode_;
+}
+
+GLenum Texture2D::filter_mode() const {
+ return filterMode_;
+}
+
+void Texture2D::set_wrap_mode(GLenum wrapMode) {
+ wrapMode_ = wrapMode;
+ glBindTexture(GL_TEXTURE_2D, texID_);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode_);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode_);
+}
+
+void Texture2D::set_filter_mode(GLenum filterMode) {
+ filterMode_ = filterMode;
+ glBindTexture(GL_TEXTURE_2D, texID_);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterMode_);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterMode_);
+}
+
+bool Texture2D::initialized() const {
+ return texID_ != 0;
+}
+
+
+Color Texture2D::Pixel(int x, int y) const {
+ int index = y*4*width() + x*4;
+
+ if (dataType_ == GL_UNSIGNED_BYTE) {
+ unsigned char r = data_ubyte_[index+0];
+ unsigned char g = data_ubyte_[index+1];
+ unsigned char b = data_ubyte_[index+2];
+ unsigned char a = data_ubyte_[index+3];
+ return Color((float)r/255.0f, (float)g/255.0f, (float)b/255.0f, (float)a/255.0f);
+ }
+ else if (dataType_ == GL_FLOAT) {
+ float r = data_float_[index+0];
+ float g = data_float_[index+1];
+ float b = data_float_[index+2];
+ float a = data_float_[index+3];
+ return Color(r, g, b, a);
+ }
+ else {
+ std::cerr << "Texture2D: Unsupported texture data type " << dataType_ << "." << std::endl;
+ return Color();
+ }
+}
+
+} // end namespace
+
diff --git a/dev/MinGfx/src/texture2d.h b/dev/MinGfx/src/texture2d.h
new file mode 100644
index 0000000..a07d80f
--- /dev/null
+++ b/dev/MinGfx/src/texture2d.h
@@ -0,0 +1,139 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_TEXTURE2D_H_
+#define SRC_TEXTURE2D_H_
+
+
+#include "opengl_headers.h"
+#include "color.h"
+
+#include <string>
+
+
+namespace mingfx {
+
+/** A wrapper around a 2D texture that supports loading images from files or
+ setting texture color data directly. Example:
+ ~~~
+ Texture2D tex1;
+ Texture2D tex2(GL_CLAMP_TO_EDGE);
+
+ void MyGraphicsApp::InitOpenGL() {
+ std::vector<std::string> search_path;
+ search_path.push_back(".");
+ search_path.push_back("./data");
+ search_path.push_back("./shaders");
+ tex1.InitFromFile(Platform::FindFile("earth-2k.png", search_path));
+ tex2.InitFromFile(Platform::FindFile("toon-ramp.png", search_path));
+ }
+ ~~~
+ */
+class Texture2D {
+public:
+
+ /// Creates an empty texture. Optional parameters can be provided to set
+ /// the texture wrap mode and filter mode.
+ Texture2D(GLenum wrapMode=GL_REPEAT, GLenum filterMode=GL_LINEAR);
+ virtual ~Texture2D();
+
+
+ /// Call this from within the InitOpenGL() function since it will initialize
+ /// not just the Texture2D's internal data but also an OpenGL texture to be
+ /// stored on the graphics card. Internally, this uses the stbi library to
+ /// load images. It supports png, jpg, bmp, and other file formats.
+ bool InitFromFile(const std::string &filename);
+
+ /// Call this from within the InitOpenGL() function since it will initialize
+ /// not just the Texture2D's internal data but also an OpenGL texture to be
+ /// stored on the graphics card.
+ /// With this version of Init, you may pass in your own pointer to color data.
+ /// The data argument must point to an array of 4-channel color data stored as
+ /// unsigned chars in RGBA format. You are responsible for managing the memory
+ /// for this array. If you will never call Pixel(), then it is safe to free
+ /// data as soon as this function returns. Otherwise, you need to make sure
+ /// data does not change in memory until you destroy the Texture2D object.
+ bool InitFromBytes(int width, int height, const unsigned char * data);
+
+ /// Call this from within the InitOpenGL() function since it will initialize
+ /// not just the Texture2D's internal data but also an OpenGL texture to be
+ /// stored on the graphics card.
+ /// With this version of Init, you may pass in your own pointer to color data.
+ /// The data argument must point to an array of 4-channel color data stored as
+ /// floats in RGBA format. You are responsible for managing the memory
+ /// for this array. If you will never call Pixel(), then it is safe to free
+ /// data as soon as this function returns. Otherwise, you need to make sure
+ /// data does not change in memory until you destroy the Texture2D object.
+ bool InitFromFloats(int width, int height, const float * data);
+
+
+ /// This function may be called to re-read the texture data from an array
+ /// formated the same as in InitFromBytes. The width and height of the
+ /// texture must remain the same.
+ bool UpdateFromBytes(const unsigned char * data);
+
+ /// This function may be called to re-read the texture data from an array
+ /// formated the same as in InitFromFloats. The width and height of the
+ /// texture must remain the same.
+ bool UpdateFromFloats(const float * data);
+
+
+ /// Returns true if the texture data has been successfully transferred to OpenGL.
+ bool initialized() const;
+
+ /// Returns the width in pixels of the texture.
+ int width() const;
+
+ /// Returns the height in pixels of the texture.
+ int height() const;
+
+ /// Returns the unsigned int used as the texture handle by OpenGL
+ GLuint opengl_id() const;
+
+ /// Returns an enumerated constant for the OpenGL wrap mode used by the texture.
+ GLenum wrap_mode() const;
+
+ /// Returns an enumerated constant for the OpenGL filter mode used by the texture.
+ GLenum filter_mode() const;
+
+ /// Uses the OpenGL texture wrap mode arguments
+ void set_wrap_mode(GLenum wrapMode);
+
+ /// Uses the OpenGL texture filter mode arguments
+ void set_filter_mode(GLenum filterMode);
+
+ /// Returns the color at the specified pixel. The top left corner of the
+ /// image is (0,0) and the bottom right is (width()-1, height()-1).
+ Color Pixel(int x, int y) const;
+
+private:
+
+ bool InitOpenGL();
+
+ GLenum dataType_; // GL_UNSIGNED_BYTE or GL_FLOAT
+ const unsigned char * data_ubyte_;
+ const float * data_float_;
+
+ int width_;
+ int height_;
+ bool handleMemInternally_;
+
+ GLuint texID_;
+ GLenum wrapMode_;
+ GLenum filterMode_;
+};
+
+
+} // end namespace
+
+#endif \ No newline at end of file
diff --git a/dev/MinGfx/src/unicam.cc b/dev/MinGfx/src/unicam.cc
new file mode 100644
index 0000000..0acb9c9
--- /dev/null
+++ b/dev/MinGfx/src/unicam.cc
@@ -0,0 +1,317 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "unicam.h"
+
+#include "gfxmath.h"
+
+namespace mingfx {
+
+
+UniCam::UniCam() : state_(UniCamState::START), defaultDepth_(4.0), boundingSphereRad_(1.0),
+ dollyFactor_(1.0), dollyInitialized_(false), elapsedTime_(0.0), hitGeometry_(false),
+ rotAngularVel_(0.0), rotInitialized_(false), rotLastTime_(0.0), showIcon_(false)
+{
+}
+
+UniCam::UniCam(const Matrix4 &initialViewMatrix) :
+ state_(UniCamState::START), defaultDepth_(4.0), V_(initialViewMatrix), boundingSphereRad_(1.0),
+ dollyFactor_(1.0), dollyInitialized_(false), elapsedTime_(0.0), hitGeometry_(false),
+ rotAngularVel_(0.0), rotInitialized_(false), rotLastTime_(0.0), showIcon_(false)
+{
+}
+
+UniCam::~UniCam()
+{
+}
+
+
+void UniCam::recalc_angular_vel() {
+ // update angular velocity
+ float cutoff = (float)elapsedTime_ - 0.2f; // look just at the last 0.2 secs
+ while ((rotAngularVelBuffer_.size()) && (rotAngularVelBuffer_[0].first < cutoff)) {
+ rotAngularVelBuffer_.erase(rotAngularVelBuffer_.begin());
+ }
+ rotAngularVel_ = 0.0;
+ if (rotAngularVelBuffer_.size()) {
+ for (int i=0; i<rotAngularVelBuffer_.size(); i++) {
+ rotAngularVel_ += rotAngularVelBuffer_[i].second;
+ }
+ rotAngularVel_ /= rotAngularVelBuffer_.size();
+ }
+ //std::cout << rotAngularVelBuffer_.size() << " " << rotAngularVel_ << std::endl;
+}
+
+
+void UniCam::OnButtonDown(const Point2 &mousePos, float mouseZ) {
+ if (state_ == UniCamState::START) {
+ initialClickPos_ = mousePos;
+ mouseLast_ = mousePos;
+ elapsedTime_ = 0.0;
+ rotInitialized_ = false;
+ dollyInitialized_ = false;
+
+ hitGeometry_ = (mouseZ < 1.0);
+ if (hitGeometry_) {
+ hitPoint_ = GfxMath::ScreenToWorld(V_, Pdraw_, mousePos, mouseZ);
+ }
+ else {
+ hitPoint_ = GfxMath::ScreenToDepthPlane(V_, Pdraw_, Point2(0,0), defaultDepth_);
+ }
+ showIcon_ = true;
+ state_ = UniCamState::PAN_DOLLY_ROT_DECISION;
+ }
+ else if (state_ == UniCamState::ROT_WAIT_FOR_SECOND_CLICK) {
+ // we have the second click now, and we will start the trackball rotate interaction
+ state_ = UniCamState::ROT;
+ }
+ else if (state_ == UniCamState::SPINNING) {
+ // this click is to "catch" the model, stopping it from spinning.
+ state_ = UniCamState::START;
+ }
+ else {
+ std::cerr << "UniCam::OnButtonDown() unexpected state." << std::endl;
+ }
+}
+
+void UniCam::OnDrag(const Point2 &mousePos) {
+ if (state_ == UniCamState::PAN_DOLLY_ROT_DECISION) {
+ const double panMovementThreshold = 0.01;
+ const double dollyMovementThreshold = 0.01;
+ if (fabs(mousePos[0] - initialClickPos_[0]) > panMovementThreshold) {
+ // already lots of horizontal movement, we can go right to pan
+ state_ = UniCamState::PAN;
+ showIcon_ = false;
+ }
+ else if (fabs(mousePos[1] - initialClickPos_[1]) > dollyMovementThreshold) {
+ // already lots of vertical movement, we can go right to dolly
+ state_ = UniCamState::DOLLY;
+ showIcon_ = false;
+ }
+ else if (elapsedTime_ > 1.0) {
+ // timeout, this was not a quick click to set a center of rotation,
+ // so there is no intent to rotate. instead we will be doing either
+ // pan or dolly.
+ state_ = UniCamState::PAN_DOLLY_DECISION;
+ showIcon_ = false;
+ }
+ }
+ else if (state_ == UniCamState::PAN_DOLLY_DECISION) {
+ const double panMovementThreshold = 0.01;
+ const double dollyMovementThreshold = 0.01;
+ if (fabs(mousePos[0] - initialClickPos_[0]) > panMovementThreshold) {
+ // lots of horizontal movement, go to pan
+ state_ = UniCamState::PAN;
+ }
+ else if (fabs(mousePos[1] - initialClickPos_[1]) > dollyMovementThreshold) {
+ // lots of vertical movement, go to dolly
+ state_ = UniCamState::DOLLY;
+ }
+ }
+ else if (state_ == UniCamState::PAN) {
+ Matrix4 camMat = V_.Inverse();
+ Point3 eye = camMat.ColumnToPoint3(3);
+ Vector3 look = -camMat.ColumnToVector3(2);
+ float depth = (hitPoint_ - eye).Dot(look);
+ Point3 pWorld1 = GfxMath::ScreenToDepthPlane(V_, Pdraw_, mouseLast_, depth);
+ Point3 pWorld2 = GfxMath::ScreenToDepthPlane(V_, Pdraw_, mousePos, depth);
+ V_ = V_ * Matrix4::Translation(pWorld2 - pWorld1);
+ }
+ else if (state_ == UniCamState::DOLLY) {
+ if (!dollyInitialized_) {
+ // Setup dollyFactor so that if you move the mouse to the bottom of the screen, the point
+ // you clicked on will be right on top of the camera.
+ Matrix4 camMat = V_.Inverse();
+ Point3 eye = camMat.ColumnToPoint3(3);
+ Vector3 look = -camMat.ColumnToVector3(2);
+ float depth = (hitPoint_ - eye).Dot(look);
+ float deltaYToBottom = initialClickPos_[1] + 1;
+ dollyFactor_ = depth / deltaYToBottom;
+ dollyInitialized_ = true;
+ }
+ Vector3 d(0, 0, -dollyFactor_ * (mousePos[1] - mouseLast_[1]));
+ V_ = Matrix4::Translation(d) * V_ ;
+ }
+ else if (state_ == UniCamState::ROT) {
+ if (!rotInitialized_) {
+ float depth = 0.0;
+ if (hitGeometry_) {
+ // if we hit some geometry, then make that the center of rotation
+ boundingSphereCtr_ = hitPoint_;
+ Matrix4 camMat = V_.Inverse();
+ Point3 eye = camMat.ColumnToPoint3(3);
+ Vector3 look = -camMat.ColumnToVector3(2);
+ depth = (hitPoint_ - eye).Dot(look);
+ }
+ else {
+ // if we did not hit any geometry, then center the bounding sphere in front of
+ // the camera at a distance that can be configured by the user.
+ boundingSphereCtr_ = GfxMath::ScreenToDepthPlane(V_, Pdraw_, Point2(0,0), defaultDepth_);
+ depth = defaultDepth_;
+ }
+
+ // determine the size of the bounding sphere by projecting a screen-space
+ // distance of 0.75 units to the depth of the sphere center
+ Point3 pWorld1 = GfxMath::ScreenToDepthPlane(V_, Pdraw_, Point2(0,0), depth);
+ Point3 pWorld2 = GfxMath::ScreenToDepthPlane(V_, Pdraw_, Point2(0.75,0), depth);
+ boundingSphereRad_ = (pWorld2-pWorld1).Length();
+
+ rotLastTime_ = elapsedTime_;
+ rotAngularVelBuffer_.clear();
+ rotInitialized_ = true;
+ }
+ else {
+ // Do a trackball rotation based on the mouse movement and the bounding sphere
+ // setup earlier.
+
+ Matrix4 camMat = V_.Inverse();
+ Point3 eye = camMat.ColumnToPoint3(3);
+
+ // last mouse pos
+ bool hit1 = false;
+ Point3 mouse3D1 = GfxMath::ScreenToNearPlane(V_, Pdraw_, mouseLast_);
+ Ray ray1(eye, mouse3D1 - eye);
+ float t1;
+ Point3 iPoint1;
+ if (ray1.IntersectSphere(boundingSphereCtr_, boundingSphereRad_, &t1, &iPoint1)) {
+ hit1 = true;
+ }
+
+ // current mouse pos
+ bool hit2 = false;
+ Point3 mouse3D2 = GfxMath::ScreenToNearPlane(V_, Pdraw_, mousePos);
+ Ray ray2(eye, mouse3D2 - eye);
+ float t2;
+ Point3 iPoint2;
+ if (ray2.IntersectSphere(boundingSphereCtr_, boundingSphereRad_, &t2, &iPoint2)) {
+ hit2 = true;
+ }
+ rotLastIPoint_ = iPoint2;
+
+ if (hit1 && hit2) {
+ Vector3 v1 = (iPoint1 - boundingSphereCtr_).ToUnit();
+ Vector3 v2 = (iPoint2 - boundingSphereCtr_).ToUnit();
+
+ rotAxis_ = v1.Cross(v2).ToUnit();
+ float angle = std::acos(v1.Dot(v2));
+
+ if (std::isfinite(angle)) {
+ Matrix4 R = Matrix4::Rotation(boundingSphereCtr_, rotAxis_, angle);
+ R = R.Orthonormal();
+ V_ = V_ * R;
+ //V_ = V_.orthonormal();
+
+ // add a sample to the angular vel vector
+ double dt = elapsedTime_ - rotLastTime_;
+ double avel = angle / dt;
+ if (std::isfinite(avel)) {
+ rotAngularVelBuffer_.push_back(std::make_pair(elapsedTime_, avel));
+ }
+ rotLastTime_ = elapsedTime_;
+ }
+ }
+
+ recalc_angular_vel();
+ }
+ }
+ else if (state_ == UniCamState::START) {
+ // picked up a little mouse movement after "catching" a spinning model
+ // nothing to do, just wait for the button up.
+ }
+ else {
+ std::cerr << "UniCam::OnDrag() unexpected state." << std::endl;
+ }
+ mouseLast_ = mousePos;
+}
+
+void UniCam::OnButtonUp(const Point2 &mousePos) {
+ if (state_ == UniCamState::PAN_DOLLY_ROT_DECISION) {
+ // here, we got a quick click of the mouse to indicate a center of rotation
+ // so we now go into a mode of waiting for a second click to start rotating
+ // around that point.
+ state_ = UniCamState::ROT_WAIT_FOR_SECOND_CLICK;
+ }
+ else if (state_ == UniCamState::ROT) {
+ showIcon_ = false;
+ // if we are leaving the rotation state and the angular velocity is
+ // greater than some thresold, then the user has "thrown" the model
+ // keep rotating the same way by entering the spinning state.
+
+ recalc_angular_vel();
+ //std::cout << "check for spin: " << n-start << " " << rotAngularVel_ << " " << avel2 << std::endl;
+
+ const float threshold = 0.2f;
+ if (std::fabs(rotAngularVel_) > threshold) {
+ state_ = UniCamState::SPINNING;
+ }
+ else {
+ state_ = UniCamState::START;
+ }
+ }
+ else {
+ showIcon_ = false;
+ // all other cases go back to the start state
+ state_ = UniCamState::START;
+ }
+}
+
+void UniCam::AdvanceAnimation(double dt) {
+ elapsedTime_ += dt;
+
+ if (state_ == UniCamState::SPINNING) {
+ double deltaT = elapsedTime_ - rotLastTime_;
+ rotLastTime_ = elapsedTime_;
+ double angle = (double)rotAngularVel_ * deltaT;
+ Matrix4 R = Matrix4::Rotation(boundingSphereCtr_, rotAxis_, (float)angle);
+ //R = R.orthonormal();
+ V_ = V_ * R;
+ }
+}
+
+
+void UniCam::Draw(const Matrix4 &projectionMatrix) {
+ Pdraw_ = projectionMatrix;
+
+ if (showIcon_) {
+ Matrix4 camMat = V_.Inverse();
+ Point3 eye = camMat.ColumnToPoint3(3);
+ Vector3 look = -camMat.ColumnToVector3(2);
+ float depth = (hitPoint_ - eye).Dot(look);
+ Point3 pWorld1 = GfxMath::ScreenToDepthPlane(V_, Pdraw_, Point2(0.f,0.f), depth);
+ Point3 pWorld2 = GfxMath::ScreenToDepthPlane(V_, Pdraw_, Point2(0.015f,0.f), depth);
+ float rad = (pWorld2 - pWorld1).Length();
+ Matrix4 M = Matrix4::Translation(hitPoint_ - Point3::Origin()) * Matrix4::Scale(Vector3(rad, rad, rad));
+ quickShapes_.DrawSphere(M, V_, Pdraw_, Color(0,0,0));
+ }
+}
+
+
+Matrix4 UniCam::view_matrix() {
+ return V_;
+}
+
+void UniCam::set_view_matrix(Matrix4 viewMatrix) {
+ V_ = viewMatrix;
+}
+
+void UniCam::set_default_depth(float d) {
+ defaultDepth_ = d;
+}
+
+Point3 UniCam::eye() {
+ Matrix4 camMat = V_.Inverse();
+ return camMat.ColumnToPoint3(3);
+}
+
+Vector3 UniCam::look() {
+ Matrix4 camMat = V_.Inverse();
+ return -camMat.ColumnToVector3(2);
+}
+
+
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/unicam.h b/dev/MinGfx/src/unicam.h
new file mode 100644
index 0000000..999232b
--- /dev/null
+++ b/dev/MinGfx/src/unicam.h
@@ -0,0 +1,256 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_UNICAM_H_
+#define SRC_UNICAM_H_
+
+#include "quick_shapes.h"
+#include "point2.h"
+#include "point3.h"
+#include "vector2.h"
+#include "vector3.h"
+
+
+namespace mingfx {
+
+
+/** This implements a user interface for controlling the camera with the mouse.
+ It is a special interface inspired by the "Unicam" technique developed by
+ Zeleznik et al.
+
+ The key feature is that this interface makes it possible to control camera pan,
+ dolly, and rotation with only a single mouse button. That is quite useful
+ because it leaves the other mouse buttons free for pointing, sketching, or
+ other interaction techniques.
+
+ The only downside of this technique is that it can take some time to learn. In
+ order to enjoy it, you will need to read these brief instructions on how to Pan,
+ Dolly, Rotate, and Spin:
+
+ - Pan: Click and drag horizontally with the mouse. Once you make an initial
+ horizontal movement you can than pan up and down as well, but the key to entering
+ pan mode is to start with a horizontal movement.
+
+ - Dolly: Click and drag vertically with the mouse. The initial movement must
+ be vertical. If you click on some object in the scene, then the speed of dollying
+ is set so that the object will come all the up to the camera lens if you drag
+ the mouse to the bottom of the screen.
+
+ - Rotate: Start with a quick click and release to set the center of rotation.
+ This is most useful if you click on some object in the scene. You will see a
+ black dot appear to mark the center of rotation. If you click on the background
+ then a center of rotation will be selected for you. It will be a point straight
+ ahead and at a depth 4.0 units away. The depth can be adjusted for your application
+ with set_default_depth(). Once your center of rotation is established, move
+ your mouse away a bit and then click and drag to do a trackball rotatation of
+ the scene around this point. Come to a stop before letting go of the mouse
+ button in order to avoid entering the spin state!
+
+ - Spin: For some fun, try "throwing" the scene so that it continues to rotate
+ even after you let go. To do this, start a rotation and then let go of the
+ mouse button while your mouse is still moving. To stop spinning just click and
+ release the mouse once to "catch" the scene.
+
+
+ Example usage:
+~~~
+// Create a global or member variable in your MyGraphicsApp class:
+UniCam unicam_;
+
+
+void MyGraphicsApp::OnLeftMouseDown(const Point2 &pos) {
+ Point2 mouse_xy = PixelsToNormalizedDeviceCoords(pos);
+ float mouse_z = ReadZValueAtPixel(pos);
+ unicam_.OnButtonDown(mouse_xy, mouse_z);
+}
+
+void MyGraphicsApp::OnLeftMouseDrag(const Point2 &pos, const Vector2 &delta) {
+ Point2 mouse_xy = PixelsToNormalizedDeviceCoords(pos);
+ unicam_.OnDrag(mouse_xy);
+}
+
+void MyGraphicsApp::OnLeftMouseUp(const Point2 &pos) {
+ Point2 mouse_xy = PixelsToNormalizedDeviceCoords(pos);
+ unicam_.OnButtonUp(mouse_xy);
+}
+
+void MyGraphicsApp::InitOpenGL() {
+ projMatrix_ = Matrix4::perspective(30, aspect_ratio(), 1, 20);
+ unicam_.set_view_matrix(Matrix4::lookAt(Point3(2.5,1,2.5), Point3(0,0,0), Vector3(0,1,0)););
+}
+
+void MyGraphicsApp::DrawOpenGL() {
+ // draw your scene using the view matrix from UniCam
+ Matrix4 proj_matrix = Matrix4::Perspective(60, aspect_ratio(), 0.001, 10);;
+ Matrix4 view_matrix = uniCam.view_matrix();
+ Matrix4 model_matrix = Matrix4::RotateY(to_radians(45.0));
+ quickShapes.DrawCube(model_matrix, view_matirx, proj_matrix, Color(1,1,1));
+
+ // tell unicam to draw itself (i.e., the small sphere that marks the center of
+ // rotation when in rotation mode)
+ unicam_.Draw(proj_matrix);
+}
+~~~
+*/
+class UniCam {
+public:
+
+ /// Creates a UniCam object with an initial view matrix = identity.
+ UniCam();
+
+ /// Creates a UniCam object with the supplied initial view matrix.
+ UniCam(const Matrix4 &initialViewMatrix);
+
+ virtual ~UniCam();
+
+
+ // To make the interaction work, the following set of functions need to be
+ // called from your GraphicsApp or whatever main application class you use
+ // to receive user input events and a draw callback.
+
+ /// Attach this to whatever mouse button you wish, for example, call this
+ /// from within GraphicsApp::OnRightMouseDown(). If your mousePos is reported
+ /// in pixels, you will need to convert it to normalized device coordinates
+ /// before passing it on to this routine. The depth buffer value for the
+ /// pixel under the mouse is also needed. If you are using GraphicsApp, you
+ /// can access both of these as follows:
+ /// ~~~
+ /// Point2 mouse_xy = PixelsToNormalizedDeviceCoords(mouse_in_pixels);
+ /// float mouse_z = ReadZValueAtPixel(mouse_in_pixels);
+ /// uniCam.OnButtonDown(mouse_xy, mouse_z);
+ /// ~~~
+ void OnButtonDown(const Point2 &normalizedMousePos, float mouseZ);
+
+ /// Attach this to the corresponding mouse move event, for example, call this
+ /// from within GraphicsApp::OnRightMouseDrag(). If your mousePos is reported
+ /// in pixels, you will need to convert it to normalized device coordinates
+ /// before passing it on to this routine. Within GraphicsApp, use:
+ /// ~~~
+ /// Point2 mouse_xy = PixelsToNormalizedDeviceCoords(mouse_in_pixels);
+ /// uniCam.OnDrag(mouse_xy);
+ /// ~~~
+ void OnDrag(const Point2 &normalizedMousePos);
+
+ /// Attach this to the corresponding button up event, for example, call this
+ /// from within GraphicsApp::OnRightMouseUp(). If your mousePos is reported
+ /// in pixels, you will need to convert it to normalized device coordinates
+ /// before passing it on to this routine. Within GraphicsApp, use:
+ /// ~~~
+ /// Point2 mouse_xy = PixelsToNormalizedDeviceCoords(mouse_in_pixels);
+ /// uniCam.OnButtonUp(mouse_xy);
+ /// ~~~
+ void OnButtonUp(const Point2 &normalizedMousePos);
+
+ /// Attach this to a callback that can be used to control animation. Within
+ /// GraphicsApp::UpdateSimulation(), use:
+ /// ~~~
+ /// uniCam.AdvanceAnimation(dt);
+ /// ~~~
+ void AdvanceAnimation(double dt);
+
+ /// Finally, attach this to your draw callback routine. Within
+ /// GraphicsApp::DrawUsingOpenGL(), use:
+ /// ~~~
+ /// uniCam.Draw(projMatrix);
+ /// ~~~
+ void Draw(const Matrix4 &projectionMatrix);
+
+
+ /// Access the camera view matrix created by the UniCam interactions via
+ /// this method and use it to draw the geometry in your scence.
+ /// For example, within GraphicsApp::DrawUsingOpenGL(), you might have:
+ /// ~~~
+ /// Matrix4 P = Matrix4::Perspective(30, aspect_ratio(), 1, 20);
+ /// Matrix4 V = unicam.view_matrix();
+ /// Matrix4 M = Matrix4::RotateY(GfxMath::ToRadians(45.0));
+ /// quick_shapes.DrawCube(M, V, P, Color(1,1,1));
+ /// ~~~
+ Matrix4 view_matrix();
+
+
+ /// Returns the "eye" point (i.e., focal point) of the camera in world
+ /// space coordinates.
+ Point3 eye();
+
+ /// Returns the look direction (i.e., -Z axis of the camera matrix) in world
+ /// space coordinates.
+ Vector3 look();
+
+
+ // -------------
+
+ /// This is not required, but you may use this if you wish to set an initial
+ /// view matrix or reset the view matrix
+ void set_view_matrix(Matrix4 viewMatrix);
+
+ /// This sets the depth of the center of rotation for the case when the user's
+ /// click does not intersect any geometry. It defaults to 4 units, but the
+ /// right value to use depends very much on the current scene. For example,
+ /// you could set a very good value by calculating the current centroid of
+ /// your scene and the finding the depth of this point (the distance along
+ /// the look vector) relative to the camera.
+ void set_default_depth(float d);
+
+
+private:
+
+ void recalc_angular_vel();
+
+ enum class UniCamState {
+ START,
+ PAN_DOLLY_ROT_DECISION,
+ PAN_DOLLY_DECISION,
+ ROT_WAIT_FOR_SECOND_CLICK,
+ PAN,
+ DOLLY,
+ ROT,
+ SPINNING
+ };
+ UniCamState state_;
+
+ Point2 mouseLast_;
+ double elapsedTime_;
+
+ Point2 initialClickPos_;
+ bool hitGeometry_;
+ Point3 hitPoint_;
+
+ bool rotInitialized_;
+ Point3 rotLastIPoint_;
+ float boundingSphereRad_;
+ Point3 boundingSphereCtr_;
+ double rotLastTime_;
+ std::vector<std::pair<double, double>> rotAngularVelBuffer_;
+ double rotAngularVel_;
+ Vector3 rotAxis_;
+
+ bool dollyInitialized_;
+ float dollyFactor_;
+ float defaultDepth_;
+
+ bool showIcon_;
+ QuickShapes quickShapes_;
+
+ Matrix4 V_;
+ Matrix4 Vstart_;
+
+ // saved from the last draw call in order to unproject the mouse pos
+ Matrix4 Pdraw_;
+};
+
+
+} // end namespace
+
+#endif
+
+
diff --git a/dev/MinGfx/src/vector2.cc b/dev/MinGfx/src/vector2.cc
new file mode 100644
index 0000000..cada189
--- /dev/null
+++ b/dev/MinGfx/src/vector2.cc
@@ -0,0 +1,185 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "vector2.h"
+
+#include <math.h>
+
+namespace mingfx {
+
+
+static const Vector2 s_zerov2d = Vector2(0,0);
+static const Vector2 s_onev2d = Vector2(1,1);
+static const Vector2 s_unitxv2d = Vector2(1,0);
+static const Vector2 s_unityv2d = Vector2(0,1);
+
+const Vector2& Vector2::Zero() { return s_zerov2d; }
+const Vector2& Vector2::One() { return s_onev2d; }
+const Vector2& Vector2::UnitX() { return s_unitxv2d; }
+const Vector2& Vector2::UnitY() { return s_unityv2d; }
+
+Vector2::Vector2() {
+ v[0] = 0.0;
+ v[1] = 0.0;
+}
+
+Vector2::Vector2(float x, float y) {
+ v[0] = x;
+ v[1] = y;
+}
+
+Vector2::Vector2(float *ptr) {
+ v[0] = ptr[0];
+ v[1] = ptr[1];
+}
+
+Vector2::Vector2(const Vector2& other) {
+ v[0] = other[0];
+ v[1] = other[1];
+}
+
+Vector2::~Vector2() {
+}
+
+bool Vector2::operator==(const Vector2& other) const {
+ return (fabs(other[0] - v[0]) < MINGFX_MATH_EPSILON &&
+ fabs(other[1] - v[1]) < MINGFX_MATH_EPSILON);
+}
+
+bool Vector2::operator!=(const Vector2& other) const {
+ return (fabs(other[0] - v[0]) >= MINGFX_MATH_EPSILON &&
+ fabs(other[1] - v[1]) >= MINGFX_MATH_EPSILON);
+}
+
+Vector2& Vector2::operator=(const Vector2& other) {
+ v[0] = other[0];
+ v[1] = other[1];
+ return *this;
+}
+
+float Vector2::operator[](const int i) const {
+ if ((i>=0) && (i<=1)) {
+ return v[i];
+ }
+ else {
+ // w component of a vector is 0 so return the constant 0.0
+ return 0.0;
+ }
+}
+
+float& Vector2::operator[](const int i) {
+ return v[i];
+}
+
+float Vector2::Dot(const Vector2& other) const {
+ return v[0]*other[0] + v[1]*other[1];
+}
+
+float Vector2::Length() const {
+ return sqrt(v[0]*v[0] + v[1]*v[1]);
+}
+
+void Vector2::Normalize() {
+ // Hill & Kelley provide this:
+ float sizeSq = + v[0]*v[0] + v[1]*v[1];
+ if (sizeSq < MINGFX_MATH_EPSILON) {
+ return; // do nothing to zero vectors;
+ }
+ float scaleFactor = (float)1.0/(float)sqrt(sizeSq);
+ v[0] *= scaleFactor;
+ v[1] *= scaleFactor;
+}
+
+Vector2 Vector2::ToUnit() const {
+ Vector2 v(*this);
+ v.Normalize();
+ return v;
+}
+
+
+Vector2 Vector2::Lerp(const Vector2 &b, float alpha) const {
+ float x = (1.0f-alpha)*(*this)[0] + alpha*b[0];
+ float y = (1.0f-alpha)*(*this)[1] + alpha*b[1];
+ return Vector2(x,y);
+}
+
+Vector2 Vector2::Lerp(const Vector2 &a, const Vector2 &b, float alpha) {
+ float x = (1.0f-alpha)*a[0] + alpha*b[0];
+ float y = (1.0f-alpha)*a[1] + alpha*b[1];
+ return Vector2(x,y);
+}
+
+
+const float * Vector2::value_ptr() const {
+ return v;
+}
+
+
+Vector2 Vector2::Normalize(const Vector2 &v) {
+ return v.ToUnit();
+}
+
+
+float Vector2::Dot(const Vector2 &v1, const Vector2 &v2) {
+ return v1.Dot(v2);
+}
+
+
+
+Vector2 operator/(const Vector2& v, const float s) {
+ const float invS = 1 / s;
+ return Vector2(v[0]*invS, v[1]*invS);
+}
+
+Vector2 operator*(const float s, const Vector2& v) {
+ return Vector2(v[0]*s, v[1]*s);
+}
+
+Vector2 operator*(const Vector2& v, const float s) {
+ return Vector2(v[0]*s, v[1]*s);
+}
+
+Vector2 operator-(const Vector2& v) {
+ return Vector2(-v[0], -v[1]);
+}
+
+Point2 operator+(const Vector2& v, const Point2& p) {
+ return Point2(p[0] + v[0], p[1] + v[1]);
+};
+
+Point2 operator+(const Point2& p, const Vector2& v) {
+ return Point2(p[0] + v[0], p[1] + v[1]);
+}
+
+Vector2 operator+(const Vector2& v1, const Vector2& v2) {
+ return Vector2(v1[0] + v2[0], v1[1] + v2[1]);
+}
+
+Point2 operator-(const Point2& p, const Vector2& v) {
+ return Point2(p[0] - v[0], p[1] - v[1]);
+}
+
+Vector2 operator-(const Vector2& v1, const Vector2& v2) {
+ return Vector2(v1[0] - v2[0], v1[1] - v2[1]);
+}
+
+Vector2 operator-(const Point2& p1, const Point2& p2) {
+ return Vector2(p1[0] - p2[0], p1[1] - p2[1]);
+}
+
+
+std::ostream & operator<< ( std::ostream &os, const Vector2 &v) {
+ return os << "<" << v[0] << ", " << v[1] << ">";
+}
+
+std::istream & operator>> ( std::istream &is, Vector2 &v) {
+ // format: <x, y, z>
+ char dummy;
+ return is >> dummy >> v[0] >> dummy >> v[1] >> dummy;
+}
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/vector2.h b/dev/MinGfx/src/vector2.h
new file mode 100644
index 0000000..f1a8d3e
--- /dev/null
+++ b/dev/MinGfx/src/vector2.h
@@ -0,0 +1,186 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_VECTOR2_H_
+#define SRC_VECTOR2_H_
+
+#include <iostream>
+
+#include "point2.h"
+
+
+namespace mingfx {
+
+
+/** A 2D Vector with floating point coordinates, used for storing 2D translations,
+ mouse movements, and screen-space vectors.
+ */
+class Vector2 {
+public:
+
+ /// Default constructor to create zero vector
+ Vector2();
+
+ /// Constructs a vector (x,y,0), where the 0 comes from the use of
+ /// homogeneous coordinates in computer graphics.
+ Vector2(float x, float y);
+
+ /// Constructs a vector given a pointer to x,y,z data
+ Vector2(float *v);
+
+ /// Copy constructor for vector
+ Vector2(const Vector2& v);
+
+ /// Vector destructor
+ virtual ~Vector2();
+
+ /// Check for "equality", taking floating point imprecision into account
+ bool operator==(const Vector2& v) const;
+
+ /// Check for "inequality", taking floating point imprecision into account
+ bool operator!=(const Vector2& v) const;
+
+ /// Vector assignment operator
+ Vector2& operator=(const Vector2& v);
+
+ /// Read only access to the ith coordinate of the vector.
+ float operator[](const int i) const;
+
+ /// Returns a reference to the ith coordinate of the vector. Use this
+ /// accessor if you wish to set the coordinate rather than just request
+ /// its value. Example:
+ /// ~~~
+ /// Vector2 a;
+ /// a[0] = 5.0; // set the x-coordinate of the vector
+ /// ~~~
+ float& operator[](const int i);
+
+ /// Read only access to the x coordinate. Can also use my_vector[0]. Use
+ /// the my_vector[0] = 1.0; form if you need to set the value.
+ float x() const { return v[0]; }
+
+ /// Read only access to the y coordinate. Can also use my_vector[1]. Use
+ /// the my_vector[1] = 1.0; form if you need to set the value.
+ float y() const { return v[1]; }
+
+ /// In homogeneous coordinates, the w coordinate for all vectors is 0.0.
+ float w() const { return 0.0; }
+
+
+ // --- Vector operations ---
+
+ /// Returns "this dot v"
+ float Dot(const Vector2& v) const;
+
+ /// Returns the length of the vector
+ float Length() const;
+
+ /// Normalizes the vector by making it unit length.
+ void Normalize();
+
+ /// Returns a normalized (i.e., unit length) version of the vector without
+ /// modifying the original ('this') vector.
+ Vector2 ToUnit() const;
+
+ /// Linear interpolation between this vector and another. Alpha=0.0 returns
+ /// this vector, and alpha=1.0 returns the other vector, other values blend
+ /// between the two.
+ Vector2 Lerp(const Vector2 &b, float alpha) const;
+
+ /// Returns a const pointer to the raw data array
+ const float * value_ptr() const;
+
+
+
+ /// Returns a new vector that is the unit version of v.
+ static Vector2 Normalize(const Vector2 &v);
+
+ /// Returns v1 dot v2
+ static float Dot(const Vector2 &v1, const Vector2 &v2);
+
+ /// (0,0) - a shortcut for a special vector that is frequently needed
+ static const Vector2& Zero();
+
+ /// (1,1) - a shortcut for a special vector that is frequently needed
+ static const Vector2& One();
+
+ /// (1,0) - a shortcut for a special vector that is frequently needed
+ static const Vector2& UnitX();
+
+ /// (0,1) - a shortcut for a special vector that is frequently needed
+ static const Vector2& UnitY();
+
+ /// Linear interpolation between two vectors. Alpha=0.0 returns 'a' and
+ /// alpha=1.0 returns 'b', other values blend between the two.
+ static Vector2 Lerp(const Vector2 &a, const Vector2 &b, float alpha);
+
+private:
+ float v[2];
+};
+
+
+// ---------- Operator Overloads for Working with Vectors ----------
+
+
+// --- Scalers ---
+
+/// Divide the vector by the scalar s
+Vector2 operator/(const Vector2& v, const float s);
+
+/// Multiply the vector by the scalar s
+Vector2 operator*(const float s, const Vector2& v);
+
+/// Multiply the vector by the scalar s
+Vector2 operator*(const Vector2& v, const float s);
+
+/// Negate the vector
+Vector2 operator-(const Vector2& v);
+
+// Note: no -(point) operator, that's an undefined operation
+
+
+// --- Point and Vector Arithmetic ---
+
+/// Adds a vector and a point, returns a point
+Point2 operator+(const Vector2& v, const Point2& p);
+
+/// Adds a point and a vector, returns a point
+Point2 operator+(const Point2& p, const Vector2& v);
+
+/// Adds a vector and a vector, returns a vector
+Vector2 operator+(const Vector2& v1, const Vector2& v2);
+
+// Note: no (point + point) operator, that's an undefined operation
+
+/// Subtracts a vector from a point, returns a point
+Point2 operator-(const Point2& p, const Vector2& v);
+
+/// Subtracts v2 from v1, returns a vector
+Vector2 operator-(const Vector2& v1, const Vector2& v2);
+
+/// Returns the vector spanning p1 and p2
+Vector2 operator-(const Point2& p1, const Point2& p2);
+
+// Note: no (vector - point) operator, that's an undefined operation
+
+
+// --- Stream operators ---
+
+// Vector2
+std::ostream & operator<< ( std::ostream &os, const Vector2 &v);
+std::istream & operator>> ( std::istream &is, Vector2 &v);
+
+
+} // end namespace
+
+#endif
diff --git a/dev/MinGfx/src/vector3.cc b/dev/MinGfx/src/vector3.cc
new file mode 100644
index 0000000..19262c2
--- /dev/null
+++ b/dev/MinGfx/src/vector3.cc
@@ -0,0 +1,206 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+#include "vector3.h"
+
+#include <math.h>
+
+namespace mingfx {
+
+static const Vector3 s_zerov3d = Vector3(0,0,0);
+static const Vector3 s_onev3d = Vector3(1,1,1);
+static const Vector3 s_unitxv3d = Vector3(1,0,0);
+static const Vector3 s_unityv3d = Vector3(0,1,0);
+static const Vector3 s_unitzv3d = Vector3(0,0,1);
+
+const Vector3& Vector3::Zero() { return s_zerov3d; }
+const Vector3& Vector3::One() { return s_onev3d; }
+const Vector3& Vector3::UnitX() { return s_unitxv3d; }
+const Vector3& Vector3::UnitY() { return s_unityv3d; }
+const Vector3& Vector3::UnitZ() { return s_unitzv3d; }
+
+
+Vector3::Vector3() {
+ v[0] = 0.0;
+ v[1] = 0.0;
+ v[2] = 0.0;
+}
+
+Vector3::Vector3(float x, float y, float z) {
+ v[0] = x;
+ v[1] = y;
+ v[2] = z;
+}
+
+Vector3::Vector3(float *ptr) {
+ v[0] = ptr[0];
+ v[1] = ptr[1];
+ v[2] = ptr[2];
+}
+
+Vector3::Vector3(const Vector3& other) {
+ v[0] = other[0];
+ v[1] = other[1];
+ v[2] = other[2];
+}
+
+Vector3::~Vector3() {
+}
+
+bool Vector3::operator==(const Vector3& other) const {
+ return (fabs(other[0] - v[0]) < MINGFX_MATH_EPSILON &&
+ fabs(other[1] - v[1]) < MINGFX_MATH_EPSILON &&
+ fabs(other[2] - v[2]) < MINGFX_MATH_EPSILON);
+}
+
+bool Vector3::operator!=(const Vector3& other) const {
+ return (fabs(other[0] - v[0]) >= MINGFX_MATH_EPSILON &&
+ fabs(other[1] - v[1]) >= MINGFX_MATH_EPSILON &&
+ fabs(other[2] - v[2]) >= MINGFX_MATH_EPSILON);
+}
+
+Vector3& Vector3::operator=(const Vector3& other) {
+ v[0] = other[0];
+ v[1] = other[1];
+ v[2] = other[2];
+ return *this;
+}
+
+float Vector3::operator[](const int i) const {
+ if ((i>=0) && (i<=2)) {
+ return v[i];
+ }
+ else {
+ // w component of a vector is 0 so return the constant 0.0
+ return 0.0;
+ }
+}
+
+float& Vector3::operator[](const int i) {
+ return v[i];
+}
+
+float Vector3::Dot(const Vector3& other) const {
+ return v[0]*other[0] + v[1]*other[1] + v[2]*other[2];
+}
+
+Vector3 Vector3::Cross(const Vector3& other) const {
+ return Vector3(v[1] * other[2] - v[2] * other[1],
+ v[2] * other[0] - v[0] * other[2],
+ v[0] * other[1] - v[1] * other[0]);
+}
+
+float Vector3::Length() const {
+ return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
+}
+
+void Vector3::Normalize() {
+ // Hill & Kelley provide this:
+ float sizeSq = + v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
+ if (sizeSq < MINGFX_MATH_EPSILON) {
+ return; // do nothing to zero vectors;
+ }
+ float scaleFactor = (float)1.0/(float)sqrt(sizeSq);
+ v[0] *= scaleFactor;
+ v[1] *= scaleFactor;
+ v[2] *= scaleFactor;
+}
+
+
+Vector3 Vector3::ToUnit() const {
+ Vector3 v(*this);
+ v.Normalize();
+ return v;
+}
+
+const float * Vector3::value_ptr() const {
+ return v;
+}
+
+
+
+Vector3 Vector3::Normalize(const Vector3 &v) {
+ return v.ToUnit();
+}
+
+Vector3 Vector3::Cross(const Vector3 &v1, const Vector3 &v2) {
+ return v1.Cross(v2);
+}
+
+float Vector3::Dot(const Vector3 &v1, const Vector3 &v2) {
+ return v1.Dot(v2);
+}
+
+Vector3 Vector3::Lerp(const Vector3 &b, float alpha) const {
+ float x = (1.0f-alpha)*(*this)[0] + alpha*b[0];
+ float y = (1.0f-alpha)*(*this)[1] + alpha*b[1];
+ float z = (1.0f-alpha)*(*this)[2] + alpha*b[2];
+ return Vector3(x,y,z);
+}
+
+Vector3 Vector3::Lerp(const Vector3 &a, const Vector3 &b, float alpha) {
+ float x = (1.0f-alpha)*a[0] + alpha*b[0];
+ float y = (1.0f-alpha)*a[1] + alpha*b[1];
+ float z = (1.0f-alpha)*a[2] + alpha*b[2];
+ return Vector3(x,y,z);
+}
+
+
+
+Vector3 operator/(const Vector3& v, const float s) {
+ const float invS = 1 / s;
+ return Vector3(v[0]*invS, v[1]*invS, v[2]*invS);
+}
+
+Vector3 operator*(const float s, const Vector3& v) {
+ return Vector3(v[0]*s, v[1]*s, v[2]*s);
+}
+
+Vector3 operator*(const Vector3& v, const float s) {
+ return Vector3(v[0]*s, v[1]*s, v[2]*s);
+}
+
+Vector3 operator-(const Vector3& v) {
+ return Vector3(-v[0], -v[1], -v[2]);
+}
+
+Point3 operator+(const Vector3& v, const Point3& p) {
+ return Point3(p[0] + v[0], p[1] + v[1], p[2] + v[2]);
+};
+
+Point3 operator+(const Point3& p, const Vector3& v) {
+ return Point3(p[0] + v[0], p[1] + v[1], p[2] + v[2]);
+}
+
+Vector3 operator+(const Vector3& v1, const Vector3& v2) {
+ return Vector3(v1[0] + v2[0], v1[1] + v2[1], v1[2] + v2[2]);
+}
+
+Point3 operator-(const Point3& p, const Vector3& v) {
+ return Point3(p[0] - v[0], p[1] - v[1], p[2] - v[2]);
+}
+
+Vector3 operator-(const Vector3& v1, const Vector3& v2) {
+ return Vector3(v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]);
+}
+
+Vector3 operator-(const Point3& p1, const Point3& p2) {
+ return Vector3(p1[0] - p2[0], p1[1] - p2[1], p1[2] - p2[2]);
+}
+
+
+std::ostream & operator<< ( std::ostream &os, const Vector3 &v) {
+ return os << "<" << v[0] << ", " << v[1] << ", " << v[2] << ">";
+}
+
+std::istream & operator>> ( std::istream &is, Vector3 &v) {
+ // format: <x, y, z>
+ char dummy;
+ return is >> dummy >> v[0] >> dummy >> v[1] >> dummy >> v[2] >> dummy;
+}
+
+
+} // end namespace
diff --git a/dev/MinGfx/src/vector3.h b/dev/MinGfx/src/vector3.h
new file mode 100644
index 0000000..d12c819
--- /dev/null
+++ b/dev/MinGfx/src/vector3.h
@@ -0,0 +1,273 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#ifndef SRC_VECTOR3_H_
+#define SRC_VECTOR3_H_
+
+#include <iostream>
+
+#include "point3.h"
+
+
+namespace mingfx {
+
+
+/** A 3D Vector with floating point coordinates, used for storing normals and
+ all sorts of other 3D graphics operations. Vector3s can be transformed by a
+ Matrix4, and a Vector3 can be created by subtracting two Point3s. Example:
+ ~~~
+ // subtracting two points creates a vector
+ Point3 a(0,0,0);
+ Point3 b(2,0,0);
+ Vector3 c = b - a;
+
+ // vectors can be transformed by Matrix4s
+ Vector3 dir = c.ToUnit();
+ Matrix4 M = Matrix4::RotateX(GfxMath::ToDegrees(30.0));
+ Vector3 dir_transformed = M * dir;
+
+ // vectors can be added and subtracted
+ Vector3 d(1,0,0);
+ Vector3 e = c + d;
+
+ // and we can do the usual dot products and cross products too
+ float f = d.Dot(e);
+ Vector3 g = b.Cross(d);
+
+ // you can access the individual components of the vector in two ways:
+ Vector3 v(1,2,3);
+ float option1 = v.x();
+ float option2 = v[0];
+
+ // to set an individual component of the vector use the [] operator:
+ Vector3 w;
+ w[0] = 0.4;
+ w[1] = 1.2;
+ w[2] = 3.1;
+
+ // you can print the vector by sending it to stdout:
+ std::cout << v << std::endl;
+ ~~~
+ */
+class Vector3 {
+public:
+
+ /// Default constructor to create zero vector
+ Vector3();
+
+ /// Constructs a vector (x,y,z,0), where the 0 comes from the use of
+ /// homogeneous coordinates in computer graphics
+ Vector3(float x, float y, float z);
+
+ /// Constructs a vector given a pointer to x,y,z data
+ Vector3(float *v);
+
+ /// Copy constructor for vector
+ Vector3(const Vector3& v);
+
+ /// Vector destructor
+ virtual ~Vector3();
+
+ /// Check for "equality", taking floating point imprecision into account
+ bool operator==(const Vector3& v) const;
+
+ /// Check for "inequality", taking floating point imprecision into account
+ bool operator!=(const Vector3& v) const;
+
+ /// Vector assignment operator
+ Vector3& operator=(const Vector3& v);
+
+ /// Read only access to the ith coordinate of the vector.
+ float operator[](const int i) const;
+
+ /// Returns a reference to the ith coordinate of the vector. Use this
+ /// accessor if you wish to set the coordinate rather than just request
+ /// its value. Example:
+ /// ~~~
+ /// Vector3 a;
+ /// a[0] = 5.0; // set the x-coordinate of the vector
+ /// ~~~
+ float& operator[](const int i);
+
+ /// Read only access to the x coordinate. Can also use my_vector[0]. Use
+ /// the my_vector[0] = 1.0; form if you need to set the value.
+ float x() const { return v[0]; }
+
+ /// Read only access to the y coordinate. Can also use my_vector[1]. Use
+ /// the my_vector[1] = 1.0; form if you need to set the value.
+ float y() const { return v[1]; }
+
+ /// Read only access to the z coordinate. Can also use my_vector[2]. Use
+ /// the my_vector[2] = 1.0; form if you need to set the value.
+ float z() const { return v[2]; }
+
+ /// In homogeneous coordinates, the w coordinate for all vectors is 0.0.
+ float w() const { return 0.0; }
+
+
+ // --- Vector operations ---
+
+ /** Returns "this dot v", for example:
+ ~~~
+ Vector3 a(1,0,0);
+ Vector3 b(0.5,0,0);
+ float c = a.Dot(b);
+ ~~~
+ */
+ float Dot(const Vector3& v) const;
+
+ /** Returns "this cross v", for example:
+ ~~~
+ Vector3 x(1,0,0);
+ Vector3 y(0,1,0);
+ Vector3 z = x.Cross(y);
+ ~~~
+ */
+ Vector3 Cross(const Vector3& v) const;
+
+ /// Returns the length of the vector
+ float Length() const;
+
+ /// Normalizes the vector by making it unit length.
+ void Normalize();
+
+ /// Returns a normalized (i.e., unit length) version of the vector without
+ /// modifying the original 'this' vector.
+ Vector3 ToUnit() const;
+
+ /// Returns a const pointer to the raw data array
+ const float * value_ptr() const;
+
+ /// Linear interpolation between this vector and another. Alpha=0.0 returns
+ /// this vector, and alpha=1.0 returns the other vector, other values blend
+ /// between the two.
+ Vector3 Lerp(const Vector3 &b, float alpha) const;
+
+
+ /// (0,0,0) - a shortcut for a special vector that is frequently needed
+ static const Vector3& Zero();
+
+ /// (1,1,1) - a shortcut for a special vector that is frequently needed
+ static const Vector3& One();
+
+ /// (1,0,0) - a shortcut for a special vector that is frequently needed
+ static const Vector3& UnitX();
+
+ /// (0,1,0) - a shortcut for a special vector that is frequently needed
+ static const Vector3& UnitY();
+
+ /// (0,0,1) - a shortcut for a special vector that is frequently needed
+ static const Vector3& UnitZ();
+
+
+ /** Returns a new vector that is the unit version of v. This is just an
+ alternative syntax for ToUnit(). Example:
+ ~~~
+ Vector3 a(100,150,80);
+ Vector3 b = Vector3::Normalize(a);
+ Vector3 c = a.ToUnit();
+ // b and c are the same.
+ ~~~
+ */
+ static Vector3 Normalize(const Vector3 &v);
+
+ /** Returns v1 cross v2. This is just an alternative syntax for Cross().
+ Example:
+ ~~~
+ Vector3 x(1,0,0);
+ Vector3 y(0,1,0);
+ Vector3 z1 = Vector3::Cross(x,y);
+ Vector3 z2 = x.Cross(y);
+ // z1 and z2 are the same.
+ ~~~
+ */
+ static Vector3 Cross(const Vector3 &v1, const Vector3 &v2);
+
+ /** Returns v1 dot v2. This is just an alternative syntax for Dot().
+ Example:
+ ~~~
+ Vector3 a(1,0,0);
+ Vector3 b(0.5,0,0);
+ Vector3 c1 = a.Dot(b);
+ Vector3 c2 = Vector3::Dot(a,b);
+ // c1 and c2 are the same.
+ ~~~
+ */
+ static float Dot(const Vector3 &v1, const Vector3 &v2);
+
+ /// Linear interpolation between two vectors. Alpha=0.0 returns 'a' and
+ /// alpha=1.0 returns 'b', other values blend between the two.
+ static Vector3 Lerp(const Vector3 &a, const Vector3 &b, float alpha);
+
+private:
+ float v[3];
+};
+
+
+// ---------- Operator Overloads for Working with Vectors ----------
+
+
+// --- Scalers ---
+
+/// Divide the vector by the scalar s
+Vector3 operator/(const Vector3& v, const float s);
+
+/// Multiply the vector by the scalar s
+Vector3 operator*(const float s, const Vector3& v);
+
+/// Multiply the vector by the scalar s
+Vector3 operator*(const Vector3& v, const float s);
+
+/// Negate the vector
+Vector3 operator-(const Vector3& v);
+
+// Note: no -(point) operator, that's an undefined operation
+
+
+// --- Point and Vector Arithmetic ---
+
+/// Adds a vector and a point, returns a point
+Point3 operator+(const Vector3& v, const Point3& p);
+
+/// Adds a point and a vector, returns a point
+Point3 operator+(const Point3& p, const Vector3& v);
+
+/// Adds a vector and a vector, returns a vector
+Vector3 operator+(const Vector3& v1, const Vector3& v2);
+
+// Note: no (point + point) operator, that's an undefined operation
+
+/// Subtracts a vector from a point, returns a point
+Point3 operator-(const Point3& p, const Vector3& v);
+
+/// Subtracts v2 from v1, returns a vector
+Vector3 operator-(const Vector3& v1, const Vector3& v2);
+
+/// Returns the vector spanning p1 and p2
+Vector3 operator-(const Point3& p1, const Point3& p2);
+
+// Note: no (vector - point) operator, that's an undefined operation
+
+
+
+
+// --- Stream operators ---
+
+// Vector3
+std::ostream & operator<< ( std::ostream &os, const Vector3 &v);
+std::istream & operator>> ( std::istream &is, Vector3 &v);
+
+
+} // end namespace
+
+#endif
diff --git a/dev/MinGfx/tests/blank_window/CMakeLists.txt b/dev/MinGfx/tests/blank_window/CMakeLists.txt
new file mode 100644
index 0000000..2081638
--- /dev/null
+++ b/dev/MinGfx/tests/blank_window/CMakeLists.txt
@@ -0,0 +1,41 @@
+# This file is part of the MinGfx cmake build system.
+# See the main MinGfx/CMakeLists.txt file for details.
+
+project(mingfx-test-blank-window)
+
+
+# Source:
+set (SOURCEFILES
+ main.cc
+)
+set (HEADERFILES
+)
+set (CONFIGFILES
+)
+
+
+# Define the target
+add_executable(${PROJECT_NAME} ${HEADERFILES} ${SOURCEFILES})
+
+
+# Add dependency on libMinGfx:
+target_include_directories(${PROJECT_NAME} PUBLIC ../../src)
+target_link_libraries(${PROJECT_NAME} PUBLIC MinGfx)
+
+# Add external dependency on NanoGUI
+include(AutoBuildNanoGUI)
+AutoBuild_use_package_NanoGUI(${PROJECT_NAME} PUBLIC)
+
+
+
+# Installation:
+install(TARGETS ${PROJECT_NAME}
+ RUNTIME DESTINATION ${INSTALL_BIN_DEST}
+ COMPONENT Tests)
+
+
+# For better organization when using an IDE with folder structures:
+set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER "Tests")
+source_group("Header Files" FILES ${HEADERFILES})
+set_source_files_properties(${CONFIGFILES} PROPERTIES HEADER_FILE_ONLY TRUE)
+source_group("Config Files" FILES ${CONFIGFILES})
diff --git a/dev/MinGfx/tests/blank_window/main.cc b/dev/MinGfx/tests/blank_window/main.cc
new file mode 100644
index 0000000..da81ccb
--- /dev/null
+++ b/dev/MinGfx/tests/blank_window/main.cc
@@ -0,0 +1,25 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+// The GraphicsApp base class can also run as its own app, but it just displays a blank screen
+
+#include <mingfx.h>
+using namespace mingfx;
+
+int main(int argc, char **argv) {
+
+ GraphicsApp *app = new GraphicsApp(1024, 768, "A Blank Window!");
+ app->Run();
+
+ return 0;
+}
diff --git a/dev/MinGfx/tests/gui_plus_opengl/CMakeLists.txt b/dev/MinGfx/tests/gui_plus_opengl/CMakeLists.txt
new file mode 100644
index 0000000..5e49e7c
--- /dev/null
+++ b/dev/MinGfx/tests/gui_plus_opengl/CMakeLists.txt
@@ -0,0 +1,44 @@
+# This file is part of the MinGfx cmake build system.
+# See the main MinGfx/CMakeLists.txt file for details.
+
+project(mingfx-test-gui-plus-opengl)
+
+
+# Source:
+set (SOURCEFILES
+ gui_plus_opengl.cc
+ main.cc
+)
+set (HEADERFILES
+ gui_plus_opengl.h
+)
+set (CONFIGFILES
+)
+
+
+# Define the target
+add_executable(${PROJECT_NAME} ${HEADERFILES} ${SOURCEFILES})
+
+
+# Add dependency on libMinGfx:
+target_include_directories(${PROJECT_NAME} PUBLIC ../../src)
+target_link_libraries(${PROJECT_NAME} PUBLIC MinGfx)
+
+# Add external dependency on NanoGUI
+include(AutoBuildNanoGUI)
+AutoBuild_use_package_NanoGUI(${PROJECT_NAME} PUBLIC)
+
+
+
+# Installation:
+install(TARGETS ${PROJECT_NAME}
+ RUNTIME DESTINATION ${INSTALL_BIN_DEST}
+ COMPONENT Tests)
+
+
+# For better organization when using an IDE with folder structures:
+set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER "Tests")
+source_group("Header Files" FILES ${HEADERFILES})
+set_source_files_properties(${CONFIGFILES} PROPERTIES HEADER_FILE_ONLY TRUE)
+source_group("Config Files" FILES ${CONFIGFILES})
+
diff --git a/dev/MinGfx/tests/gui_plus_opengl/gui_plus_opengl.cc b/dev/MinGfx/tests/gui_plus_opengl/gui_plus_opengl.cc
new file mode 100644
index 0000000..be83d2e
--- /dev/null
+++ b/dev/MinGfx/tests/gui_plus_opengl/gui_plus_opengl.cc
@@ -0,0 +1,374 @@
+/*
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+ See corresponding header file for details.
+ */
+
+
+#define _USE_MATH_DEFINES
+#include "gui_plus_opengl.h"
+#include "default_shader.h"
+#include "mesh.h"
+#include "shader_program.h"
+#include "texture2d.h"
+#include "text_shader.h"
+#include "unicam.h"
+
+
+#pragma warning (push)
+#pragma warning (disable : 6001)
+#pragma warning (disable : 6011)
+#pragma warning (disable : 6262)
+#pragma warning (disable : 6385)
+#pragma warning (disable : 6387)
+#pragma warning (disable : 26450)
+#pragma warning (disable : 26451)
+#pragma warning (disable : 26453)
+#pragma warning (disable : 26495)
+#pragma warning (disable : 26812)
+#include <stb_image.h>
+#pragma warning (pop)
+
+#include <iostream>
+
+
+QuickShapes *qs;
+Ray pickRay;
+
+
+GLuint vbo, vao, vshader, fshader, shaderProgram;
+float model[16];
+GLuint texID = 0;
+
+Mesh mesh1, mesh2;
+ShaderProgram shaderprog1;
+Texture2D tex1;
+
+DefaultShader dShader;
+DefaultShader::MaterialProperties mat1;
+
+Matrix4 P,V;
+
+UniCam uniCam;
+
+Point2 mpos;
+
+
+TextShader ts;
+
+
+
+GuiPlusOpenGL::GuiPlusOpenGL() : GraphicsApp(1024,768, "Circle Simulation") {
+
+ InitGraphicsContext();
+
+ simTime_ = 0.0;
+ paused_ = false;
+ pauseBtn_ = NULL;
+
+ int i;
+ i = mesh1.AddTriangle(Point3(0,0,0), Point3(1,0,0), Point3(1,1,0));
+ mesh1.SetNormals(i, Vector3(0,0,1), Vector3(0,0,1), Vector3(0,0,1));
+ mesh1.SetTexCoords(i, 0, Point2(0,0), Point2(1,0), Point2(1,1));
+ i = mesh1.AddTriangle(Point3(0,0,0), Point3(1,1,0), Point3(0,1,0));
+ mesh1.SetNormals(i, Vector3(0,0,1), Vector3(0,0,1), Vector3(0,0,1));
+ mesh1.SetTexCoords(i, 0, Point2(0,0), Point2(1,1), Point2(0,1));
+
+ //i = mesh1.AppendTriangle(Point3(0,0,0), Point3(0,0,1), Point3(1,1,0));
+ //mesh1.SetNormals(i, Vector3(0,0,1), Vector3(0,0,1), Vector3(0,0,1));
+}
+
+
+
+
+GuiPlusOpenGL::~GuiPlusOpenGL() {
+
+}
+
+void GuiPlusOpenGL::InitNanoGUI() {
+ nanogui::FormHelper *gui = new nanogui::FormHelper(screen());
+ nanogui::ref<nanogui::Window> window = gui->addWindow(Eigen::Vector2i(10, 10), "Simulation Controls");
+ pauseBtn_ = gui->addButton("Pause", std::bind(&GuiPlusOpenGL::OnPauseBtnPressed, this));
+ gui->addButton("Restart", std::bind(&GuiPlusOpenGL::OnRestartBtnPressed, this));
+
+ screen()->performLayout();
+}
+
+
+
+void GuiPlusOpenGL::UpdateSimulation(double dt) {
+ if (!paused_) {
+ simTime_ += dt;
+ //std::cout << "Update Simulation " << simTime_ << std::endl;
+ }
+ uniCam.AdvanceAnimation(dt);
+}
+
+
+void GuiPlusOpenGL::OnRestartBtnPressed() {
+ simTime_ = 0.0;
+}
+
+void GuiPlusOpenGL::OnPauseBtnPressed() {
+ paused_ = !paused_;
+ if (paused_) {
+ pauseBtn_->setCaption("Play");
+ }
+ else {
+ pauseBtn_->setCaption("Pause");
+ }
+}
+
+
+
+void GuiPlusOpenGL::OnMouseMove(const Point2 &pos, const Vector2 &delta) {
+ //std::cout << "Mouse moved to " << pos << " delta from last frame " << delta << std::endl;
+
+ Point2 mouseInNDC = PixelsToNormalizedDeviceCoords(pos);
+ Point3 filmplanePt = GfxMath::ScreenToNearPlane(uniCam.view_matrix(), P, mouseInNDC);
+
+ Matrix4 camMat = uniCam.view_matrix().Inverse();
+ Point3 eye = camMat.ColumnToPoint3(3);
+
+ pickRay = Ray(eye, filmplanePt - eye);
+
+ mpos = pos;
+}
+
+void GuiPlusOpenGL::OnLeftMouseDown(const Point2 &pos) {
+ //std::cout << "Left mouse button down at " << pos << std::endl;
+
+ Point2 mouseInNDC = PixelsToNormalizedDeviceCoords(pos);
+ float mouseZ = ReadZValueAtPixel(pos);
+ uniCam.OnButtonDown(mouseInNDC, mouseZ);
+
+}
+
+void GuiPlusOpenGL::OnLeftMouseDrag(const Point2 &pos, const Vector2 &delta) {
+ //std::cout << "Mouse dragged (left button) to " << pos << " delta from last frame " << delta << std::endl;
+
+ Point2 mouseInNDC = PixelsToNormalizedDeviceCoords(pos);
+ uniCam.OnDrag(mouseInNDC);
+}
+
+void GuiPlusOpenGL::OnLeftMouseUp(const Point2 &pos) {
+ //std::cout << "Left mouse button up at " << pos << std::endl;
+
+ Point2 mouseInNDC = PixelsToNormalizedDeviceCoords(pos);
+ uniCam.OnButtonUp(mouseInNDC);
+
+}
+
+
+void GuiPlusOpenGL::OnMiddleMouseDown(const Point2 &pos) {
+ //std::cout << "Middle mouse button down at " << pos << std::endl;
+}
+
+void GuiPlusOpenGL::OnMiddleMouseDrag(const Point2 &pos, const Vector2 &delta) {
+ //std::cout << "Mouse dragged (middle button) to " << pos << " delta from last frame " << delta << std::endl;
+}
+
+void GuiPlusOpenGL::OnMiddleMouseUp(const Point2 &pos) {
+ //std::cout << "Middle mouse button up at " << pos << std::endl;
+}
+
+
+void GuiPlusOpenGL::OnRightMouseDown(const Point2 &pos) {
+ //std::cout << "Right mouse button down at " << pos << std::endl;
+}
+
+void GuiPlusOpenGL::OnRightMouseDrag(const Point2 &pos, const Vector2 &delta) {
+ //std::cout << "Mouse dragged (right button) to " << pos << " delta from last frame " << delta << std::endl;
+ Point2 mouseInNDC = PixelsToNormalizedDeviceCoords(pos);
+ Point3 filmplanePt = GfxMath::ScreenToNearPlane(uniCam.view_matrix(), P, mouseInNDC);
+
+ Matrix4 camMat = uniCam.view_matrix().Inverse();
+ Point3 eye = camMat.ColumnToPoint3(3);
+
+ pickRay = Ray(eye, filmplanePt - eye);
+}
+
+void GuiPlusOpenGL::OnRightMouseUp(const Point2 &pos) {
+ //std::cout << "Right mouse button up at " << pos << std::endl;
+}
+
+
+
+void GuiPlusOpenGL::OnKeyDown(const char *c, int modifiers) {
+ //std::cout << "Key DOWN (" << c << ") modifiers=" << modifiers << std::endl;
+}
+
+void GuiPlusOpenGL::OnKeyUp(const char *c, int modifiers) {
+ //std::cout << "Key UP (" << c << ") modifiers=" << modifiers << std::endl;
+}
+
+void GuiPlusOpenGL::OnSpecialKeyDown(int key, int scancode, int modifiers) {
+ //std::cout << "Special Key DOWN key=" << key << " scancode=" << scancode << " modifiers=" << modifiers << std::endl;
+}
+
+void GuiPlusOpenGL::OnSpecialKeyUp(int key, int scancode, int modifiers) {
+ //std::cout << "Special Key UP key=" << key << " scancode=" << scancode << " modifiers=" << modifiers << std::endl;
+}
+
+
+void GuiPlusOpenGL::DrawUsingNanoVG(NVGcontext *ctx) {
+
+ // example of drawing some circles
+
+ nvgBeginPath(ctx);
+ nvgCircle(ctx, 512.0f+50.0f*std::cosf((float)simTime_), 350.0f+200.0f*std::sinf((float)simTime_), 50.0f);
+ nvgFillColor(ctx, nvgRGBA(100,100,255,200));
+ nvgFill(ctx);
+ nvgStrokeColor(ctx, nvgRGBA(0,0,0,255));
+ nvgStroke(ctx);
+
+ nvgBeginPath(ctx);
+ nvgCircle(ctx, 512.0f+200.0f*std::cosf((float)simTime_), 350.0f+50.0f*std::sinf((float)simTime_), 50.0f);
+ nvgFillColor(ctx, nvgRGBA(255,100,100,200));
+ nvgFill(ctx);
+ nvgStrokeColor(ctx, nvgRGBA(0,0,0,255));
+ nvgStroke(ctx);
+
+}
+
+
+void GuiPlusOpenGL::InitOpenGL() {
+ std::string fname = Platform::FindMinGfxDataFile("Futura_Medium_BT.ttf");
+ ts.Init(fname, 42);
+
+ qs = new QuickShapes();
+
+ P = Matrix4::Perspective(60.0f, aspect_ratio(), 0.1f, 10.0f);
+ V = Matrix4::LookAt(Point3(0,0,3), Point3(0,0,0), Vector3(0,1,0));
+ uniCam.set_view_matrix(V);
+
+ mesh1.UpdateGPUMemory();
+
+ mesh2.LoadFromOBJ(Platform::FindMinGfxDataFile("teapot.obj"));
+ std::vector<Matrix4> xforms;
+ for (float x=-4.0; x <= 4.0; x += 1.0) {
+ //xforms.push_back(Matrix4());
+ xforms.push_back(Matrix4::Translation(Vector3(x,0,0)));
+ }
+ mesh2.SetInstanceTransforms(xforms);
+
+
+ tex1.InitFromFile(Platform::FindMinGfxDataFile("test.png"));
+ mat1.surface_texture = tex1;
+
+ DefaultShader::LightProperties l;
+ l.position = Point3(-10, 5, 5);
+ l.diffuse_intensity = Color(1,0,0);
+ dShader.AddLight(l);
+}
+
+
+void GuiPlusOpenGL::DrawUsingOpenGL() {
+
+ V = uniCam.view_matrix();
+ Matrix4 M = Matrix4::Translation(Vector3(-1,0,0)) * Matrix4::Scale(Vector3(0.5, 0.5, 0.5));
+
+ // Draw several quick shapes
+ float col[3] = {0.4f, 0.4f, 0.8f};
+ Matrix4 M2 = Matrix4::Translation(Vector3(1.0f, 1.5f, 0.0f))*Matrix4::Scale(Vector3(0.2f, 0.2f, 0.2f));
+ qs->DrawSphere(M2, V, P, col);
+
+ M2 = Matrix4::Translation(Vector3(0,-0.5,0)) * M2;
+ qs->DrawCylinder(M2, V, P, col);
+
+ M2 = Matrix4::Translation(Vector3(0,-0.5,0)) * M2;
+ qs->DrawCone(M2, V, P, col);
+
+ M2 = Matrix4::Translation(Vector3(0,-0.5,0)) * M2;
+ qs->DrawCube(M2, V, P, col);
+
+ M2 = Matrix4::Translation(Vector3(0,-0.5,0)) * M2;
+ qs->DrawBrush(M2, V, P, col);
+
+ M2 = Matrix4::Translation(Vector3(0,-0.5,0)) * M2;
+ qs->DrawSquare(M2, V, P, col);
+
+ M2 = Matrix4::Translation(Vector3(0,-0.5,0)) * M2;
+ qs->DrawSquare(M2, V, P, col, tex1);
+
+
+ qs->DrawArrow(Matrix4(), V, P, col, Point3(0,0,0), Vector3(-1,1.5,0), 0.01f);
+
+ qs->DrawLineSegment(Matrix4(), V, P, col, Point3(0,0,0), Point3(1, 1.5, 0), 0.01f);
+
+ qs->DrawAxes(Matrix4(), V, P);
+
+ dShader.Draw(Matrix4(), V, P, &mesh1, mat1);
+ dShader.Draw(Matrix4(), V, P, &mesh2, DefaultShader::MaterialProperties());
+
+
+ float t;
+ Point3 p;
+ int id;
+ if (pickRay.IntersectMesh(mesh1, &t, &p, &id)) {
+ M2 = Matrix4::Translation(p - Point3::Origin()) * Matrix4::Scale(Vector3(0.025f, 0.025f, 0.025f));
+ qs->DrawSphere(M2, V, P, Color(1,0,1));
+ }
+ if (pickRay.IntersectMesh(mesh2, &t, &p, &id)) {
+ M2 = Matrix4::Translation(p - Point3::Origin()) * Matrix4::Scale(Vector3(0.025f, 0.025f, 0.025f));
+ qs->DrawSphere(M2, V, P, Color(1,1,0));
+ }
+
+ uniCam.Draw(P);
+
+
+ Matrix4 M3 = Matrix4::Translation(Vector3(-1,0,0));
+ TextShader::TextFormat f;
+
+
+ f.color = Color(1,1,0);
+ f.h_align = TextShader::HorizAlign::HORIZ_ALIGN_CENTER;
+ f.v_align = TextShader::VertAlign::VERT_ALIGN_TOP;
+ ts.Draw3D(M3, V, P, "TOPgg", f, true);
+
+ f.color = Color(0,1,1);
+ f.h_align = TextShader::HorizAlign::HORIZ_ALIGN_CENTER;
+ f.v_align = TextShader::VertAlign::VERT_ALIGN_CENTER;
+ ts.Draw3D(M3, V, P, "V_CENTERyy", f, true);
+
+ f.color = Color(1,0,1);
+ f.h_align = TextShader::HorizAlign::HORIZ_ALIGN_CENTER;
+ f.v_align = TextShader::VertAlign::VERT_ALIGN_BOTTOM;
+ ts.Draw3D(M3, V, P, "BOTTOMgg", f, true);
+
+ f.color = Color(1,1,1);
+ f.h_align = TextShader::HorizAlign::HORIZ_ALIGN_CENTER;
+ f.v_align = TextShader::VertAlign::VERT_ALIGN_BASELINE;
+ ts.Draw3D(M3, V, P, "Hello good buddy", f, true);
+
+ qs->DrawLineSegment(M3, V, P, col, Point3(0,0,0), Point3(1, 0, 0), 0.01f);
+
+ M3 = M3 * Matrix4::Translation(Vector3(0,0.5,0));
+
+
+ f.color = Color(1,0,0);
+ f.h_align = TextShader::HorizAlign::HORIZ_ALIGN_LEFT;
+ f.v_align = TextShader::VertAlign::VERT_ALIGN_TOP;
+ ts.Draw3D(M3, V, P, "LEFT", f, true);
+
+ f.color = Color(0,1,0);
+ f.h_align = TextShader::HorizAlign::HORIZ_ALIGN_CENTER;
+ f.v_align = TextShader::VertAlign::VERT_ALIGN_TOP;
+ ts.Draw3D(M3, V, P, "CENTER", f, true);
+
+ f.color = Color(0,0,1);
+ f.h_align = TextShader::HorizAlign::HORIZ_ALIGN_RIGHT;
+ f.v_align = TextShader::VertAlign::VERT_ALIGN_TOP;
+ ts.Draw3D(M3, V, P, "RIGHT", f, true);
+
+
+ M3 = Matrix4::Translation(Vector3(0,0,1));
+ f.color = Color(1,1,1);
+ f.h_align = TextShader::HorizAlign::HORIZ_ALIGN_CENTER;
+ f.v_align = TextShader::VertAlign::VERT_ALIGN_BASELINE;
+ f.size = 0.25;
+ ts.Draw3D(M3, V, P, "Hello good buddy", f, true);
+
+
+ //std::cout << mpos << " z = " << z_value_at_pixel(mpos) << std::endl;
+}
diff --git a/dev/MinGfx/tests/gui_plus_opengl/gui_plus_opengl.h b/dev/MinGfx/tests/gui_plus_opengl/gui_plus_opengl.h
new file mode 100644
index 0000000..faf3580
--- /dev/null
+++ b/dev/MinGfx/tests/gui_plus_opengl/gui_plus_opengl.h
@@ -0,0 +1,96 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#include <mingfx.h>
+using namespace mingfx;
+
+
+/** An application that opens up a window that includes a few buttons
+ for controlling the simulation and can be used to draw circles and
+ other computer graphics.
+
+ After constructing a new CircleViewer, call Run() to start and
+ run the application. Run() will not return until the application
+ window is closed. Make sure that you call cs3081::InitGraphics()
+ before creating the RobotViewer app. Example:
+
+ ```
+ int main(int argc, char **argv) {
+ cs3081::InitGraphics();
+ cs3081::CircleViewer *app = new cs3081::CircleViewer();
+ app->Run();
+ cs3081::ShutdownGraphics();
+ return 0;
+ }
+ ```
+
+ While the window is open UpdateSimulation() will be called
+ repeatedly, once per frame. Fill this in to update your simulation
+ or perform any other processing that should happen over time as the
+ simulation progresses.
+
+ Fill in the On*() methods as desired to respond to user input events.
+
+ Fill in the Draw*() methods to draw graphics to the screen using
+ either the nanovg library or raw OpenGL.
+*/
+class GuiPlusOpenGL : public GraphicsApp {
+public:
+ GuiPlusOpenGL();
+ ~GuiPlusOpenGL();
+
+ void InitNanoGUI();
+
+ void UpdateSimulation(double dt);
+
+
+ void OnRestartBtnPressed();
+ void OnPauseBtnPressed();
+
+
+ void OnMouseMove(const Point2 &pos, const Vector2 &delta);
+
+ void OnLeftMouseDown(const Point2 &pos);
+ void OnLeftMouseDrag(const Point2 &pos, const Vector2 &delta);
+ void OnLeftMouseUp(const Point2 &pos);
+
+ void OnMiddleMouseDown(const Point2 &pos);
+ void OnMiddleMouseDrag(const Point2 &pos, const Vector2 &delta);
+ void OnMiddleMouseUp(const Point2 &pos);
+
+ void OnRightMouseDown(const Point2 &pos);
+ void OnRightMouseDrag(const Point2 &pos, const Vector2 &delta);
+ void OnRightMouseUp(const Point2 &pos);
+
+
+
+ void OnKeyDown(const char *c, int modifiers);
+
+ void OnKeyUp(const char *c, int modifiers);
+
+ void OnSpecialKeyDown(int key, int scancode, int modifiers);
+
+ void OnSpecialKeyUp(int key, int scancode, int modifiers);
+
+
+ void DrawUsingNanoVG(NVGcontext *ctx);
+
+ void InitOpenGL();
+
+ void DrawUsingOpenGL();
+
+private:
+ double simTime_;
+ bool paused_;
+ nanogui::Button *pauseBtn_;
+};
diff --git a/dev/MinGfx/tests/gui_plus_opengl/main.cc b/dev/MinGfx/tests/gui_plus_opengl/main.cc
new file mode 100644
index 0000000..e520953
--- /dev/null
+++ b/dev/MinGfx/tests/gui_plus_opengl/main.cc
@@ -0,0 +1,25 @@
+/*
+ This file is part of the MinGfx Project.
+
+ Copyright (c) 2017,2018 Regents of the University of Minnesota.
+ All Rights Reserved.
+
+ Original Author(s) of this File:
+ Dan Keefe, 2018, University of Minnesota
+
+ Author(s) of Significant Updates/Modifications to the File:
+ ...
+ */
+
+#include <mingfx.h>
+#include "gui_plus_opengl.h"
+
+
+int main(int argc, char **argv) {
+
+ GuiPlusOpenGL *app = new GuiPlusOpenGL();
+ app->Run();
+
+ return 0;
+}
+