From cc111afa83b7bad78e0260d13e3fa95d6b9491dd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9au?= <theau.baton@etu.univ-amu.fr>
Date: Sat, 19 Oct 2024 02:19:58 +0200
Subject: [PATCH] Add Window class

---
 .gitignore                                    |   4 +-
 CMakelists.txt                                |  10 ++-
 assets/textures/Cube_Amber.png                | Bin 0 -> 1834 bytes
 assets/textures/Cube_Blue.png                 | Bin 0 -> 314 bytes
 assets/textures/Cube_Brown.png                | Bin 0 -> 314 bytes
 assets/textures/Cube_Cyan.png                 | Bin 0 -> 314 bytes
 assets/textures/Cube_Dark_Green.png           | Bin 0 -> 314 bytes
 assets/textures/Cube_Grass.png                | Bin 0 -> 775 bytes
 assets/textures/Cube_Gray.png                 | Bin 0 -> 314 bytes
 assets/textures/Cube_Grayy.png                | Bin 0 -> 1028 bytes
 assets/textures/Cube_Green.png                | Bin 0 -> 314 bytes
 assets/textures/Cube_Greeny.png               | Bin 0 -> 1468 bytes
 assets/textures/Cube_Inverted.png             | Bin 0 -> 314 bytes
 assets/textures/Cube_Inverted_2.png           | Bin 0 -> 314 bytes
 assets/textures/Cube_Magenta.png              | Bin 0 -> 314 bytes
 assets/textures/Cube_Orange.png               | Bin 0 -> 314 bytes
 assets/textures/Cube_Pink.png                 | Bin 0 -> 314 bytes
 assets/textures/Cube_Purple.png               | Bin 0 -> 314 bytes
 assets/textures/Cube_Red.png                  | Bin 0 -> 314 bytes
 assets/textures/Cube_Redy.png                 | Bin 0 -> 1198 bytes
 assets/textures/Cube_Saumon.png               | Bin 0 -> 314 bytes
 assets/textures/Cube_Yellow.png               | Bin 0 -> 314 bytes
 assets/textures/Cube_Yellowy.png              | Bin 0 -> 1393 bytes
 .../graphics/back/textures/TextureBuffer.cpp  |  33 ++++++--
 .../graphics/back/textures/TextureBuffer.hpp  |   4 +-
 source/engine/graphics/front/object/Image.cpp |   2 +-
 source/engine/io/Window.cpp                   |  74 ++++++++++++++++++
 source/engine/io/Window.hpp                   |  31 ++++++++
 source/main.cpp                               |  37 +++++----
 29 files changed, 161 insertions(+), 34 deletions(-)
 create mode 100644 assets/textures/Cube_Amber.png
 create mode 100644 assets/textures/Cube_Blue.png
 create mode 100644 assets/textures/Cube_Brown.png
 create mode 100644 assets/textures/Cube_Cyan.png
 create mode 100644 assets/textures/Cube_Dark_Green.png
 create mode 100644 assets/textures/Cube_Grass.png
 create mode 100644 assets/textures/Cube_Gray.png
 create mode 100644 assets/textures/Cube_Grayy.png
 create mode 100644 assets/textures/Cube_Green.png
 create mode 100644 assets/textures/Cube_Greeny.png
 create mode 100644 assets/textures/Cube_Inverted.png
 create mode 100644 assets/textures/Cube_Inverted_2.png
 create mode 100644 assets/textures/Cube_Magenta.png
 create mode 100644 assets/textures/Cube_Orange.png
 create mode 100644 assets/textures/Cube_Pink.png
 create mode 100644 assets/textures/Cube_Purple.png
 create mode 100644 assets/textures/Cube_Red.png
 create mode 100644 assets/textures/Cube_Redy.png
 create mode 100644 assets/textures/Cube_Saumon.png
 create mode 100644 assets/textures/Cube_Yellow.png
 create mode 100644 assets/textures/Cube_Yellowy.png
 create mode 100644 source/engine/io/Window.cpp
 create mode 100644 source/engine/io/Window.hpp

diff --git a/.gitignore b/.gitignore
index 6013f5a..e2a14a6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,4 @@ build/*
 include/*
 library/*
 vcpkg_installed/*
-old/*
-
-assets/textures/*
\ No newline at end of file
+old/*
\ No newline at end of file
diff --git a/CMakelists.txt b/CMakelists.txt
index 4ed6f26..ed662f7 100644
--- a/CMakelists.txt
+++ b/CMakelists.txt
@@ -24,7 +24,7 @@ set(CMAKE_CXX_EXTENSIONS OFF)
 if(WIN32)
 	option(CMAKE_TOOLCHAIN_FILE "C:/vcpkg/vcpkg/scripts/buildsystems/vcpkg.cmake")
 elseif(UNIX)
-	option(CMAKE_TOOLCHAIN_FILE "/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake")	
+	#option(CMAKE_TOOLCHAIN_FILE "/amuhome/b20017738/Bureau/vcpkg/scripts/buildsystems/vcpkg.cmake")	
 endif()
 
 #==============================================================
@@ -35,8 +35,8 @@ set(SOURCES ${CMAKE_SOURCE_DIR}/source/)
 set(LIBRARY ${CMAKE_SOURCE_DIR}/library/)
 set(INCLUDE ${CMAKE_SOURCE_DIR}/include/)
 
-set(VCPK_INCLUDE ${CMAKE_SOURCE_DIR}/vcpkg_installed/*/include)
-set(VCPK_INCLUDE ${CMAKE_SOURCE_DIR}/vcpkg_installed/*/lib)
+set(VCPKG_INCLUDE ${CMAKE_SOURCE_DIR}/vcpkg_installed/*/include)
+set(VCPKG_LIB 	 ${CMAKE_SOURCE_DIR}/vcpkg_installed/*/lib)
 
 #==============================================================
 #                           Build
@@ -59,6 +59,10 @@ set_property(TARGET ${CURRENT_TARGET} PROPERTY RUNTIME_OUTPUT_DIRECTORY $<1:${CM
 
 target_include_directories(${CURRENT_TARGET} PRIVATE ${INCLUDE})
 
+#list(APPEND CMAKE_PREFIX_PATH "/amuhome/b20017738/Bureau/vcpkg/packages/glew_x64-linux")
+#list(APPEND CMAKE_PREFIX_PATH "/amuhome/b20017738/Bureau/vcpkg/packages/glm_x64-linux")
+#list(APPEND CMAKE_PREFIX_PATH "/amuhome/b20017738/Bureau/vcpkg/packages/imgui_x64-linux")
+
 find_package(glfw3  REQUIRED)
 find_package(GLEW   REQUIRED)
 find_package(glm 	CONFIG REQUIRED)
diff --git a/assets/textures/Cube_Amber.png b/assets/textures/Cube_Amber.png
new file mode 100644
index 0000000000000000000000000000000000000000..2818dc1c2e2ce58ac8d1c13f1ea554e000ea450c
GIT binary patch
literal 1834
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
HoD!M<TG3bk

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Blue.png b/assets/textures/Cube_Blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..660ea2bcf6a491b02d8245636432892a96cac429
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*Tp1V`QbYeQ-~BJj`b=%he+CAI44pM;3=9lxB|(0{
z|3QFZ^Zq6K85kHi3p^r=85sBugD~Uq{1qt-3=H!<T^vI!{NG;k6gsTH;}Y0(_V0R`
ztyg9l>}#x^=<s)Yp=k0}UdjHL-F+V?mj>xg+vxRZhNSl)=kqg!|5m4+>G(6pm`!Q^
z(c6VT-kkhg7<|Aq{^T6<17Dp~?z5;bvOMTFLwkiv5xbw)Jw}hy{t7LvzZ-lHs98<u
z2|vDUwZrPYSz(b)6<2?WA8CBb;K@^=cYxF38C%Z-#m}p<#V5?W{)_q7LhiTg_T5~{
Qz`(%Z>FVdQ&MBb@0Eg&&wEzGB

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Brown.png b/assets/textures/Cube_Brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..6625a70ebf229d0bd2531ebd3723c97dcac377d0
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*Tp5|T^24m!Gwss@EIP9t7#J9i7X;KWFfg!{1o;L3
z2LXo7`<LuzU|`@Z@Q5sCVBk9p!i>lBSEMj7FwFOKaSXBWe|yPO=&%BhOJLL4zw2eT
zUYTXEud#Zf!{6<NqRCr%CHrG`_kEmP8l*REqt~MulHP}$&(9G4Tb*{M<IfypHl_JT
zZx{Y}bMkXx@B!2KlXJ`ue05T}&!WD_@}S=g?G-9T?0#PN7(Gt=E3~x!Zty*zW;LNF
z{P?of4y*TOg+(@1T>T|}r12?(Cr^dm0ZxZ!Y&{PYKd;IbpD^$GFXmqhx!<nacXKHN
P0|SGntDnm{r-UW|06BT~

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Cyan.png b/assets/textures/Cube_Cyan.png
new file mode 100644
index 0000000000000000000000000000000000000000..e154c1b9291be5f26b3735e77279271177ba376a
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*T)DWoy!Sp>^!|<Iyc=b=UNA5)7^bh4Wnf@nD+%%o
z{tp5SoA)o-&%nUIS>O>_%)r2R7=#&*=dVa%U|^W<>Eak-;s5rMr_f;q9+$wTvwzpi
zY`rqeU|(bPM2ElI3q_N+@=Er{?C$$Gxim;`+D5NOGbFtaIiH^){I@#oOvj%&#%xOS
zkKQi)@#f^`!r%j@@h9h)ANcB|a-T(gk>x?Z8QLpUirD?U?lF3t_E%_W{oUYuK+S4G
zPx$d=s~uMF%?gWbs<`?~{7B<d22Y*}y#t&M&)9k%D1Kg*Ek0r1^<T`t7IME`x9{ds
Q1_lNOPgg&ebxsLQ04ceBVE_OC

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Dark_Green.png b/assets/textures/Cube_Dark_Green.png
new file mode 100644
index 0000000000000000000000000000000000000000..e2e446677e0be7233a32d5f4436d2b1b7df8d14d
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*Tm=~zmAj(lR~4z$hsdujWnf^)J(n?wfq{XoB*-uL
zKL{{v-oIo&0|NtRfk$L90|Vb-5N14{zaoW!fnmO<i(`m||JzHRLWdQ2TmqZU{#`G#
z^~x-ReT~%<9sX`F6iwdBE7>2jyYJ)V(jdKQ8@(RQkn}#}e13-T-|Dn89e?H+vnkC#
zdb{w)o0FdlgAbU-pPXZU;H#6$eHQgamIwW2Xs=KyV)yg9$LMj|U!kS-cZ2T%HLD3d
z;m4P)c38bPD=f09;_5H)BaKfPJb5bg4sbd=W9xaK_<2>f_=I`ae=+}B$o+QRzMD%K
Q7#J8lUHx3vIVCg!095vRR{#J2

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Grass.png b/assets/textures/Cube_Grass.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf967e698b61604ff8428348c9ad2d9d3b0e8538
GIT binary patch
literal 775
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@t_JvoxH2#>w5$zkToKT<HKb`(K-ad=+Qoit>x1f-`M0hM
zYFO^yu_?HHV{pgj;O13<&8q{e7x}hr2=3S%(y}(NV^c`us(_|df!*6eJGX??Ec9(y
z;orEzziD+~<s9$sZ6UQw{Mt7JcWnu&U+O>UU}XJr|K>G;otr~y7WsB;3F+P*+PE^H
zcV}4j0^gn;VQm|N%IA0|)?2o%4{ll+FkxRr|DN!cHGzS4`rX^Z8khTbZ4GT%6I8#{
zuPWB9WnEDHGQX~EAq^`78dv()E%9qz8<gGWFs&$@fq|h*Hm-?*fx*2b$S?RmRRF{B
zIbrz>3=EtF9+AZi419+{nDKc2iWCM0#tcsv#}EtuvzKlLH5)LrK5V%l#1u7oOG7DR
z@<F|@jaheJ<^BHGpTd;rx%c(d=Zji??tjT+%qX4g;3xmJC!AqHYtG~?aSR(0mcLeb
zv(2-XrD2EMH`z_w?^`e6y~xgB@Hnhqpk<o0tWtVK$izpC4fSv4%{g{ba^b!g^ZPlz
zE=u%#(tk#C+oCr~IX@i*ge1P(OyRmQUqi{hduPjn3I3i&yXSPTelyE2q1=9EK~C}4
zn?D`yDC|0rcYLN$opgG+!M^f<rsXCnJ6TTKEMNJ6pU3W&|372DmnNNi#F><*J=bQP
zHpyVU`kFJ%N*^vWeu=vu^iA)x7qhF~jTv>1Qr@+!<FK45x|6Z%hO&A|lYW!f{a5Et
zn>q;Ims?i+=%dwa2f-r(IZtyJbWHru<XLj@HshZci?%aIyk7L(|G+eZ#xt+3y$oB!
z+ZA;$EB2{W!2MT`0w;4#*~!MM={PldffAR=O$OCS=}K;mq-STJiC3~6RMS#F6wJWD
Oz~JfX=d#Wzp$P!U2zoRC

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Gray.png b/assets/textures/Cube_Gray.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2057bc9e04b33cb9e494f72a35d2693da1e0047
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*T)DWo=Fgvh<Hn7)wzhry_AxLp1nex!WME)mD+%%o
z{tp5SoA)o-&%nUIS>O>_%)r2R7=#&*=dVa%U|^W<>Eak-;s5rMr_f;q9+$wTvwzpi
zY`rqeU|(bPM2ElI3q_N+@=Er{?C$$Gxim;`+D5NOGbFtaIiH^){I@#oOvj%&#%xOS
zkKQi)@#f^`!r%j@@h9h)ANcB|a-T(gk>x?Z8QLpUirD?U?lF3t_E%_W{oUYuK+S4G
zPx$d=s~uMF%?gWbs<`?~{7B<d22Y*}y#t&M&)9k%D1Kg*Ek0r1^<T`t7IME`x9{ds
Q1_lNOPgg&ebxsLQ0Ek$9%m4rY

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Grayy.png b/assets/textures/Cube_Grayy.png
new file mode 100644
index 0000000000000000000000000000000000000000..405cb6f9309a3775a9d9cfc8137688ac33152514
GIT binary patch
literal 1028
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>V_;y|p|&!Rfq{XsILO_JVcj{ImkbOH
zEa{HEjtmSN`?>!lvNA9*a29w(7BevL9R^{><M}I67#Nsmdb&7<M7YnLep;{8QK0pE
zp>%~z@b_vL9v%VyL<K=1MIl3j<fMcIk0T8WC8~M-AN`uY{>QdUZ)E;W4Oz8o_pWQJ
z?$wrk%MAVBxo_XT?fnKHe*E|mzxCf9&qs?FFP7;3`t|FFdeKj>pZNUw^eJfX-o5e;
z;o;#uz2;_SO8?eQ=<`fHe*XM<Q_G6l+P@ukjT6qEJ=<Z;nHe+X$B!Qt9IDeUteef!
z5VkrrH$UI~j>?nUOOB|kt6#l*Ie5Y&#io!$K^~p&-o5+Kb@T3B-gvH+>_YSB&2!uC
z`{Y<d=@~;=V=-G>TSGUNrVmReOgoaEp6<xQcu#^+z~ET$1PP;SjZR)SY~z?aZr;A#
zZILD?C%34<)i}{}o@)X}&Ze^IiO**B@87@wzequ8X=rb6Z|LL4j};H}b%?6$Y%)mV
z(D0gb(mVLflP4)3F6eZ)7Zel-uqsAJMt1&q_fF5u%Vm!Ba)!@u7?0Q=JZ)iZEnWTV
z_wU1>E!^DQ@3X#n|Ni=2uPs})h!{F4sHDxk5u?+6f!pJSn4p01H=`tBVd4A!2lBq2
zK7Cs7{=Iw01b=C4VmK~o6I7&n>_=z<gQBsq@%!=z>Jc9vJz8XCZ@+%ovSq7YzI>_g
zWW3YN!a{;AF+V?l?(3?1{8Fq_9F9DFni{ic;>3x&6pk6o%E|F1c^Dfmf1#`+FaP5s
z-;J5Gbsku`@7}OMAo<#fsV2?A7k+bCRM{kFxwLg2kiNxfZf<_{>(|nbOmo2}_xO7)
zdv~o7t`=G#wm_@L<$&5n6)vUEx>^y!Tt?To9t-<?ere~Ob6y7PC3YXnj`XNynz8(W
zzv^M-Gf5q~Dk@@6cesQsj&=-u@0j^y<1z`Gq>qPU9(r~K6|A`tIa4FD&9W<TjlT5B
z4Pu{XESHJ&+cn|%O@$Ll#Rqi`t^4|PUXMUPp20bm%6nUD(m%z0{_teyantWtnRFBq
z?OKb9=Y_KreoK|p*UWw%wY6dE)~&l5y8BM|iYT9J+0)Te+;{KqIm3DL=kqguWqvrd
z=lSQ`;p^oE|4fniot5@RyP~kru*=GAgQWmtYwDx2yAS?VDc=e>@$g~d1nss*zjT`3
zv$1SAHfP#L;f+7k95h<;Sz9y~h%_=-Jy~XbeAkTGv$^Aiy4@I^6s@hT18wGWe0=pP
z%O?8R8fBLA*ZDG(#AI1HT61!9Sv#42w4GsUYim>5FTC-`R)&QF|9(53QqDLZ%FN8X
q@n3Y($8<&~#YgLpykD`Z-f`p0rH}sdr7<utFnGH9xvX<aXaWFgl-V5s

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Green.png b/assets/textures/Cube_Green.png
new file mode 100644
index 0000000000000000000000000000000000000000..e863145c801b80978785b3f2a1949f24fc31f2e4
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*Tp1V`Hone$^JQbrZl6o<dl?uQJ_j5*$iTqBRubeF
z{2v4uHt%1upMimav%n*=n1O-sFbFdq&tH+kz`!uy)5S5w!vF0hPocvKJT8GvXaBC3
z*?MJ`!M?`oi4K3a7m6lt<(2G@+1>YXa%qs>w2fYmW=MJ;ay~yp_-}REnT|hmjM<dt
zAH7}p<ITy>g~10*<4?{pKk(H_<vxr0BFlq*GqhKz6tVkx-DC7P?XS?%`n$pRfST2W
zp77(#Ry(ZTn-vz>RB`o}_>sn^44ym{dIvZip0V{jQ2e|qTYSR2>%W+PE#!W?Zr{zN
Q3=9kmp00i_>zopr0ArPY!~g&Q

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Greeny.png b/assets/textures/Cube_Greeny.png
new file mode 100644
index 0000000000000000000000000000000000000000..7adbb641868ecf1fe99512d0dda3302e63b14abd
GIT binary patch
literal 1468
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>V_;y|p|&!Rfq{XsILO_JVcj{ImkbOH
zEa{HEjtmSN`?>!lvNA9*a29w(7BevL9R^{><M}I67#LUsJzX3_BHZVOdw0jW3aooq
z{h8gTM#b=)!OSxgI{BHDx)fLx7d$$)UqHl#MU+QKpfpvC(LC$hIu=1@uC7TsBD{7?
zN)kPfPR%_czDTk7{mXB^_r0?EF4#WPGxb$jX=!<FeCT(}+DUJ$Qr*vOojEB`^SWsE
z?QW(Y%f#i5=3kuuG-v<3n)&Z?g>Qa(!m#h-&-S&~vQ`#pUet`-ZyLJ0=9Tl!Xw^+G
zmoVJ>ddHbbEkm_}^F!wnmi;?Ye!tz?|KxVhiMD3OJ)dtb4%?meCtcRImtphu9?ifl
zJW4a>PJTM;?f2{U7caQEtSj_Ok2#jCE$YCqZt3Ss%6^`%Z&SFPj2g5X4CPrO1U28-
z-?LaQ`Pt={U;U0gd!`3UA8wU~?Q&aS#hCUs+Oae1443wTy$1rkn2rCW%3PVk{_Xkf
zbW`<?B@FleUP`{!>lSuxqUk|*zPRHW>Ib=_!wy7qo;+f=#qE-XV)<(3^-cmF&NrIx
zguA$>J!}>}6(;)hp;UG7hr^d9bL1wc&U*XgRs{Q@4b`lbS?x0trwa<bzIM0Y(tM7c
zTZVeU*T>vuHhYo|@18bgu951(mzRVC%tS&H=FhqD?TFOO3te47r#Z4+nbOn0hP|*$
zd9EtV$P{B+eel}(+U#cQ@6r2`FFM|4^r_);VVb;j4Nr~Dj5Ptuk3<{l{an*Z*DsxF
z+qF1g1&1q3MD@I^C%LcZ*QGB$zmL6B_4IcAM@P2TKASIQz42aNOWL;VU0kQP&yeMK
zuq0PAIjoJlnc-2(k;kV0{w(U<za!)DR@T$)Vo$ge7bqCScAk`Ua`N7NcEtpjqB~9h
zd=hw11V*uLSU2}hrR4nmDR+O$=M)rNymTw~)I5JDjq@$c!qN^5YflHn-)k`BU-IXI
zRYjw3Arr&*baCzvA+M(1a;Ymh9v{1j$#;cE)NS*X4#BtkgPb4B25ePbx1xHp;k7q2
zoo{?TkhIV4aG6p?-ARW@YioWkE{*@6@^XRvsx6zY^GGIdnzE5oNx@Ebt<hfnbNy;&
zDQUgiTXrRW4)uz8Z*2B$?oHEEcg^ji8?~zU<k)DiD@EV<u(WCKvxs266Jb-t`XXOT
zGI*@`y@&Too9@Tg61ojvti)zm@m*LwnYmi?cMP-hYthY27dE#E>z=k>$<leT@8x9^
ziQ|pwj_IK)g<hH4L)YeBOxhp2amD_Vch=iwFWINxS7!Xts`7M%$o;tO(u^@eOmjl#
z&#09Sk&HKqZF#oSO~^R?rs6Hvb-A3WdCuKWSqeHbSXZz~FZiuCvv{|SftX7|r_;)-
z7J2(6)D@0CcDl{$c~OhqNwgsL(|oqV_TBPQ(Lzruwi-#ZtlRYR`x}=nj4hwMwly9<
zTic__v}<*=D9f4Z+1(edCOXDThR+dZE&L$qaAbnM$uW`H9}^seqmzE?e~VPv!^M(n
zf5PSd>MIS>4_$Vz<lWi!*^qzRl;n)R%}1_olrpKWtNhx-RHQKFK%V)Bm02vDKUqz3
zxa1EQZ+>>@S^8_U#`bCL%)fvCxUJOSq4zO!o4fpC)_C0=Mx~Vpo@H;@@3SoG$K{8q
zYaY$*Z;#D){PJVZ>kCy(jw<g@e0$&hUMTI8?}~d<SSHS%Z`ZZp-^!;8-X2a`ceY&q
z!md7+O5;b{nib_$w>>zeoqpy1ht(Bvzt%rlF84-zLB0)xv|W@n(?Z|xYclq&3y(Yh
zcI^sgj-8)ARcCGg^S`N*Q)%}+n@{^gCGPBAb)GSg{XcUvqu`I{N33JEDHfbq#^O|^
z<S#RG!U5mu@1rkQT%D=$?YeRP%KefBC#G?>uuPoWZ_l7~l<m8`lm6|e$;)5fGb%W-
j4J0w)Ez|B9f7yAq-`kMT%y@=@fq}u()z4*}Q$iB}N&TrS

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Inverted.png b/assets/textures/Cube_Inverted.png
new file mode 100644
index 0000000000000000000000000000000000000000..c88966e2a81981d7e9ad95375909d70e89289569
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*T)%$(dTz1Gre=Z5GX+<bFfcGMEUa{CXJBApD+%%o
z{tp5SoA)o-&%nUIS>O>_%)r2R7=#&*=dVa%U|^W<>Eak-;s5rMr_f;q9+$wTvwzpi
zY`rqeU|(bPM2ElI3q_N+@=Er{?C$$Gxim;`+D5NOGbFtaIiH^){I@#oOvj%&#%xOS
zkKQi)@#f^`!r%j@@h9h)ANcB|a-T(gk>x?Z8QLpUirD?U?lF3t_E%_W{oUYuK+S4G
zPx$d=s~uMF%?gWbs<`?~{7B<d22Y*}y#t&M&)9k%D1Kg*Ek0r1^<T`t7IME`x9{ds
Pkk33_{an^LB{Ts5qw0Om

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Inverted_2.png b/assets/textures/Cube_Inverted_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..8da98f7caf655f6813524717d75e8f8ca23d257c
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*T)%$(%CYSg!{W0Hhd(ncJjTGlkht!33<CoLTS<^#
z@P80s*t~zqeg*~x&H|6fVg?4j!ywFfJby(B0|Uc+PZ!4!3;(y5JcSM`@VEpvo&CFB
zX6uz%2KySTCp!GyUMQNpl~=MqW_RDm$)!Ph(>8iNnjz_Z$oc#X;lI^sXFC4OF=kVm
zfAn_Yk2fbj7X}|NjXycZ{J>WymHRB}i!2ZN&Cp(<QpE1(b&t{Gw7)`2>+c5N18P<i
zdcuz{TkWuVZ&p}jQ^nO^;zt^vGI;V-=pEp6c*fTAK=JdcZ1D;6uK!~GwUGPmx_vj7
RGB7YOc)I$ztaD0e0sycve*XXf

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Magenta.png b/assets/textures/Cube_Magenta.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6c445d966448805ceb5301a6b7701676c0e31e9
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*Tp1V`7H7WRx$#T4&+b*d?->{vzP78eGcYi)l?3?(
z{|5nv&HI<^XJBC9EbxddW?<ku48n}Z^H-!WFfh#bba4!^@PB*BQ|Pb)k4s?F*}v;$
zwqBWKu&=RtqQl?qg`&w@c_sT}cK3apTpFY|ZKKzt8Is<IoX^h?{#%`PrsK~XV>YGv
zM{gJYcysb|VekRd_>*(Y4}5h}xzD1$$nv1y4DA&vMeKfF_ZU4+`zy4x{%-I+pk_6p
zC;a%b)efuoW`#vIRb2fgex&g!gC|dg-T_XBXKXzW6hE)Z7N0Qh`Y+~R3%TE}+jny*
Q0|Nttr>mdKI;Vst02H!)O8@`>

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Orange.png b/assets/textures/Cube_Orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..af4c2ecb3a372c602cd3a570464906733dbd230a
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*T)DWo{>SP3pEUhvmc;*}cm@WBMOV6X85kJYN`m}?
z|APR-=KV|dGcYi47I;J!GcfQS24TkI`72Tw7#QYzx;Tbd_`kj6DRfwY$0e}o?BDe=
zTd&MA*w<J+(c$m*Leb={ypsJfyZb&)E)CL~w$ba+3`y@p&gW+c|E*3t)A47HF`Lr-
zqqhrxygB)~F!+FJ{K+}y2fjL~+-Ff=WO>kUhV}}TB6dHodyF2Z{S{hTe>eCZP_vrQ
z6MlTzYKPT(v%(^qDz5$#KhpS=!IP&#?*OO6Gq#=wil0|yi%*z${TK7Eh1_q~?Yp^@
Qfq{X+)78&qol`;+0IU>z+yDRo

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Pink.png b/assets/textures/Cube_Pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a7ea7ef1b519bb8751293c66699de4ec76c6155
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*Tv=IJ|NFoFwB-L)^VR>W{xdKz)auWB%D}+DRubeF
z{2v4uHt%1upMimav%n*=n1O-sFbFdq&tH+kz`!uy)5S5w!vF0hPocvKJT8GvXaBC3
z*?MJ`!M?`oi4K3a7m6lt<(2G@+1>YXa%qs>w2fYmW=MJ;ay~yp_-}REnT|hmjM<dt
zAH7}p<ITy>g~10*<4?{pKk(H_<vxr0BFlq*GqhKz6tVkx-DC7P?XS?%`n$pRfST2W
zp77(#Ry(ZTn-vz>RB`o}_>sn^44ym{dIvZip0V{jQ2e|qTYSR2>%W+PE#!W?Zr{zN
Q3=9kmp00i_>zopr0Cl>4(f|Me

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Purple.png b/assets/textures/Cube_Purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..10e017c1f432c1d9eab0a939a311bba880ee7b30
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*Tp5{UqQmCpXRZznm{FL$mVtrc_r=BU7#JAXN`m}?
z|APR-=KV|dGcYi47I;J!GcfQS24TkI`72Tw7#QYzx;Tbd_`kj6DRfwY$0e}o?BDe=
zTd&MA*w<J+(c$m*Leb={ypsJfyZb&)E)CL~w$ba+3`y@p&gW+c|E*3t)A47HF`Lr-
zqqhrxygB)~F!+FJ{K+}y2fjL~+-Ff=WO>kUhV}}TB6dHodyF2Z{S{hTe>eCZP_vrQ
z6MlTzYKPT(v%(^qDz5$#KhpS=!IP&#?*OO6Gq#=wil0|yi%*z${TK7Eh1_q~?Yp^@
Qfq{X+)78&qol`;+0Bb^gsQ>@~

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Red.png b/assets/textures/Cube_Red.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa5264076cdce558b91dc109cc21cc587bbc3495
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*Tp1V`{)ZO)TYmA3wZs3~r3?%VwTYh-85kJYN`m}?
z|APR-=KV|dGcYi47I;J!GcfQS24TkI`72Tw7#QYzx;Tbd_`kj6DRfwY$0e}o?BDe=
zTd&MA*w<J+(c$m*Leb={ypsJfyZb&)E)CL~w$ba+3`y@p&gW+c|E*3t)A47HF`Lr-
zqqhrxygB)~F!+FJ{K+}y2fjL~+-Ff=WO>kUhV}}TB6dHodyF2Z{S{hTe>eCZP_vrQ
z6MlTzYKPT(v%(^qDz5$#KhpS=!IP&#?*OO6Gq#=wil0|yi%*z${TK7Eh1_q~?Yjx`
O7=x#)pUXO@geCwh6Mbm_

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Redy.png b/assets/textures/Cube_Redy.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2e2022e42869b30ec3a07e20a981daac7ada6a2
GIT binary patch
literal 1198
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>V_;y|p|&!Rfq{XsILO_JVcj{ImkbOH
zEa{HEjtmSN`?>!lvNA9*a29w(7BevL9R^{><M}I67#LWbJzX3_BHZUr_wJ4f6>0Sk
zeH0Sy+v8O-Cow5*(hB9N9Tvq&AKW{b+1ca;dK5VR@pDQEe*CC@q*KAlv*}{Ph0k9O
ze_gx#`r6CeS5I1}Q+54b`uy5&QP1y0Z_hh_>u}P(jnNky=ALbTwe{a3rG4Mdq}_fS
z7XPz4nd6#B(T7J$|K8m6o%mvX*rT!{vCr4+;(|{!cdJ>q<!tAuWfI!VFZAi;+-A;5
z+sGsHvyT_F+z4}WIPzsi==Gh??DkgIEB>DB`se7!v)j%FY9DjnvR2~!$MZ9iO^dyw
zl$jWJTk-z6D(WQGtn}}brJ(b*iR~74yZdIuu(h1Y;yYuS*5Q6Z@o2E(W`X*ze;j<)
z%X*|9`98&1(6U!{^5UH~3(oln&zP~tPm#%JUzn4~wr{U1?<TNZ6=6EzcBoH=f1!Wd
z#u^s?+|@lZX6ar{K4R|o;<ie}f$Q6&s-LdB7B|gN=yb1me&CN&J2M3<^a|4jZcU$C
zyJ)Mikso^mL$uS8ud|ywruSLx7FhhKV?(EI)0UD#r61?^+@59q`A0$w8_&lBOj>3a
zzusP3TfBU0w@~3n&$Cxk4<4I*L5pKjbAz18-Q-hqFD<pxO)BeoYE+QV$bI6wn8lS-
z`KphO*{_YgP`Fn^ao@`+{Sw@gUhT5lC(do0tYrH&<8DP%b^p&RC*E5&E?v>|{$K9f
zYEDai#pit*u}^~K9o6Nf&$zFBw?*-NRMH7;_Au@l57;|@1SXyHJP|2)VS=C9bw0~i
z;#(fOi#WfTn<Q}R(O2_xjNAprjqfvBwU_=a*}irD|I56g*S~E!@?%A)d{XzUhz`Mt
zG6ufqk0wucnU^6~p0NFac&7u0`OC!n*PPF&cFx?f=elaR(t!hO&s#1LS*s+kb$q8_
z*0J|ZoKG6_ZwMvNx16~@RFXT-`?87LNzEj)L(?36mjx$(R^r&{@7@;CZ!66xqIpX5
ziRM-A&-$~O`Pntry=1)<*&*@UNuGIobAgJs;OR5`!mlJw3r~KmZl0j06zi<JlcA4K
z&$Lq1?Sx0bwd;}`y7Ga4PrAAod{aC>Yu5JU!g&$xDPo(B?76*4T1@ZSSJRuNe>7y0
zl4gmxF;<J6Sk~*__(_6WushxSr2p#<<*ulHQ32*^IfZ!vZ;l$(h<*3{y{C9;e@C3p
zwF~nvd)Yc)V}4Zj^w}|uq?m|}*S}S&&UwGL>ByDkX=_xEZK+$v@ac3tZ@vo`_t&hl
zQ2oU}Pu{t<S@?F4==q}m`%XWf*j4Yle@d}ws-6EHo0kGS0@Hk3Dn9yIxN`pVSpRs>
z!3#P^#Fp-iJMy}!F>(2sNQSLHUd_orvb+ABD&IG54zCmKzuHxtin#W6cvlrVHncs~
z{K9lE(otrOn81_?{C!>>tCUrg?p5q!3DIM^_wVt)BL|yVSyZ3=RX$wrrFPk!MWO3Y
z^nUps3yU2M3tINH3%KUXO>Q{6cJHs-RYwl~VrmjHO7eZgxb`o<FVDmrxt_IO85kHC
NJYD@<);T3K0RYmfDenLP

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Saumon.png b/assets/textures/Cube_Saumon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e370b7ab8ddd84fbdf284149415e35ea06cdf66b
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*T)DWowuPmhDQG$pmh-4)A_D`1=aQ0F3=9lxB|(0{
z|3QFZ^Zq6K85kHi3p^r=85sBugD~Uq{1qt-3=H!<T^vI!{NG;k6gsTH;}Y0(_V0R`
ztyg9l>}#x^=<s)Yp=k0}UdjHL-F+V?mj>xg+vxRZhNSl)=kqg!|5m4+>G(6pm`!Q^
z(c6VT-kkhg7<|Aq{^T6<17Dp~?z5;bvOMTFLwkiv5xbw)Jw}hy{t7LvzZ-lHs98<u
z2|vDUwZrPYSz(b)6<2?WA8CBb;K@^=cYxF38C%Z-#m}p<#V5?W{)_q7LhiTg_T5~{
O0P>lupUXO@geCxRqI{wN

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Yellow.png b/assets/textures/Cube_Yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f055da0c20cc1b2f3da0d12ef895ab2402b308e
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>W?*3G{}GwYz`(#*9OUlAu<o49O9lo8
zmUKs7M+SzC{oH>NSs54@gaUj*T)DWojvRBleIxPOMVHU-vKbf{{N5hWVPIfjD+%%o
z{tp5SoA)o-&%nUIS>O>_%)r2R7=#&*=dVa%U|^W<>Eak-;s5rMr_f;q9+$wTvwzpi
zY`rqeU|(bPM2ElI3q_N+@=Er{?C$$Gxim;`+D5NOGbFtaIiH^){I@#oOvj%&#%xOS
zkKQi)@#f^`!r%j@@h9h)ANcB|a-T(gk>x?Z8QLpUirD?U?lF3t_E%_W{oUYuK+S4G
zPx$d=s~uMF%?gWbs<`?~{7B<d22Y*}y#t&M&)9k%D1Kg*Ek0r1^<T`t7IME`x9{ds
Q1_lNOPgg&ebxsLQ0IU0b^#A|>

literal 0
HcmV?d00001

diff --git a/assets/textures/Cube_Yellowy.png b/assets/textures/Cube_Yellowy.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b29e005f793fc7f11c13b4b1c35904720274cac
GIT binary patch
literal 1393
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU{K^>V_;y|p|&!Rfq{XsILO_JVcj{ImkbOH
zEa{HEjtmSN`?>!lvNA9*a29w(7BevL9R^{><M}I67#LXDJY5_^BHZUr_wSBz6*;<k
zclx5V3%yM#`x-eScM5*wZ*misRb3!>B*Ww)$1b75bhF4Vy-gQc6uFO1m~n6_n~V6a
zg2$K6U%0Q3m9}iR?f&4>Tju)4Crk81w!gZzw%YIRukZI3+*$ZWfA!|Dt$$*Vm5XFQ
zbY%SZ^mO6OGB^9r_f~yf<nrx}%!B#+rKWERJ$2+-P+OOQXY$G^&+o_goXDN~%Xl6~
zjag~<*@j!@ogFei6Y^ck-tv4{|NMCBqNs-Dv)=M3<zCx-W}k9%;8o?`>W7P?g?FBm
zcyM38@AR{_hAX!wu~m4pFwDug!qBUHq>O`?v*OH!u8*INTMN%LXZmy8{PCux3t|fz
zoDWDEY<iW|&SE63wIFBW#A!*(B$OvMT-fyMw+kENzt5A>);RcmPh*{@afA0N<5u5W
z3(iCxbZRkN$}D4OP^)A#!Jg$(-P6flF3W<}o!@dW>a?aB^QGBF-ww`YWo=YwnXCEA
zdP=YK)(TG1Waod<myYcIH{CC|Rp;rgok4PTVW%8L9d6`&=Dp6rdgt`wrd|gI1~y0i
z@Z~dFYIdbu<D35JQ880$v&SBmaQpQy*>m1HNB-A+y8ZpXbnk*DgW}(s7ecN~7G-g=
z=KP(oqR>5l)#(kJl$0+|t9|+)OSRyqv2G*N#%BiUzWsA2UAABP=SQuwqP66QPae+K
zk`+|;KAx*EVXJfL+wb?anR1mEwNI#ABDmvI>p82<ssTaQuKhd`&82et*RCl>k0)O|
zP^`6#$xltmeV*uqoHG&*&D|F+*)^W_OM6%SC5&YW;|ZfVc5$!6*M$k)W4^@rJuXm;
z&pwv(PI38MRfi=toxe75?GoJee<LeLMdp>d=cZSuc7C1zL_45nM+cv6q$dN9V2i1^
zpDGjQSvjFNrm5`m@82>qu^4z?P-n1At9z7j^~O!%(_DND*D)N@onb0}QhnxuvIi@#
zR`Dc?PrN(3eQvkF0_~k;`Z0P>|ENw3sGXlSSA3GW($VscE^{4;+(|why&)NlZK6Ck
zR8E)`7*F=^7dYU|pm43p$%ubie88_K>66y#s~=;zv36!5!wn6AVlykrTWVZJ3K8zl
z4oWvzGTwP*layyJ)1J0=66<>D141XxaIP#6oEhR$DmOd#QiI^+%*c)#*93(>Z1fNl
znR0jbT(5<GjS{Dw+}@mzxVh|AcZH<1=LzB4!aZA__Re7FV^iAjD(|%51`(E~&k0Nq
zi+OrEcTe|yw8m6OaMzvQxrV3Af;d;SKXw$z)1LfNR9-oATH`kVzOLgd9qd%*1a391
zPWR4bHs0sUanOeSjKeEVANf|ZZ>e3cl+V_6He8yMpYvnE$Nu@953bkrF24EvMfA_Q
zFn5OCkqsdS)<)mm9DMit?h+4yIc3KZ9#3LAX{gXN|5eATU(4!?OZ}7-EUY#}%%1X!
zjc0<%U*|1)O24<wJj%Xz$;NZjZXJ=iw{%+$zfIu&jw_+9+LE<zoA&YU=qjC4@ps4f
z?XjmX)lCb1&Sm#?6;l_(-+v8(NA8rIk!XzAB>3Q``NC*f&WZBpdjGOME@ynOjQ5`6
z$9K}D%f6hAKYH%w`HRmUI+p#_dgtBoA;@XTf3LP9nSvTh0Z(kFo@JS0d;hP{yqJ{p
z|5<A}C+45e$_y!fHJS0{Wc90@j8|(<2Dmh=mrXH$a3Yt}#p%hTnZK4lId7EutfK$G
zDd%eDzBe-+R9yD`3vrq9?)v?08`sE0@K|gzX!PiC5o28!bgF*u%wx&_r4%19FfcH9
My85}Sb4q9e0Q4_~Qvd(}

literal 0
HcmV?d00001

diff --git a/source/engine/graphics/back/textures/TextureBuffer.cpp b/source/engine/graphics/back/textures/TextureBuffer.cpp
index 1d020b3..67013aa 100644
--- a/source/engine/graphics/back/textures/TextureBuffer.cpp
+++ b/source/engine/graphics/back/textures/TextureBuffer.cpp
@@ -21,12 +21,12 @@ namespace megu {
         this->_height = src._height;
 
         return *this;
-    }   
-
-    GLuint TextureBuffer::get(GLuint x, GLuint y) const {
-        return this->_data.at((this->_width * y) + x);
     }
 
+    void TextureBuffer::flipVerticaly() {
+        stbi__vertical_flip(this->_data.data(), this->_width, this->_height, TextureBuffer::BytePerPixel(this->_format));
+    }  
+
     void TextureBuffer::load(const GLubyte * data, size_t size) {
         this->_data = std::vector<GLubyte>(data, data + size);
     }
@@ -75,7 +75,28 @@ namespace megu {
         this->_data.clear();
     }
 
-    void TextureBuffer::set(GLuint x, GLuint y, GLubyte v) {
-        this->_data[(y * this->_width) + x] = v;
+    int TextureBuffer::BytePerPixel(GLenum format) {
+        switch (format) {
+            case GL_ZERO:
+                return 0;
+
+            case GL_RED:
+                return 1;
+
+            case GL_ONE:
+                return 1;
+
+            case GL_RG:
+                return 2;
+
+            case GL_RGB:
+                return 3;
+
+            case GL_RGBA:
+                return 4;
+
+            default:
+                throw std::runtime_error("Unkwon byter per pixel for " + format);
+        }
     }
 }
\ No newline at end of file
diff --git a/source/engine/graphics/back/textures/TextureBuffer.hpp b/source/engine/graphics/back/textures/TextureBuffer.hpp
index cb7f87f..584ed8c 100644
--- a/source/engine/graphics/back/textures/TextureBuffer.hpp
+++ b/source/engine/graphics/back/textures/TextureBuffer.hpp
@@ -21,13 +21,13 @@ namespace megu {
             inline const GLubyte * data_ptr() const {return this->_data.data();}
             inline bool empty() const {return this->_data.empty();}
 
-            GLuint get(GLuint, GLuint) const;
+            void flipVerticaly();
 
             void load(const GLubyte *, size_t);
             void load(const std::filesystem::path &, bool = true);
             void free();
 
-            void set(GLuint, GLuint, GLubyte);
+            static int BytePerPixel(GLenum);
 
         private:
             GLuint _width, _height;
diff --git a/source/engine/graphics/front/object/Image.cpp b/source/engine/graphics/front/object/Image.cpp
index d719bfb..42ac510 100644
--- a/source/engine/graphics/front/object/Image.cpp
+++ b/source/engine/graphics/front/object/Image.cpp
@@ -13,7 +13,7 @@ namespace megu {
     }
 
     void Image::load(const TextureBuffer & buffer) {
-        this->setSize(buffer.width(), buffer.height());
+        this->setSize(static_cast<float>(buffer.width()), static_cast<float>(buffer.height()));
         this->_texture.store(buffer);
     }
 }
\ No newline at end of file
diff --git a/source/engine/io/Window.cpp b/source/engine/io/Window.cpp
new file mode 100644
index 0000000..fdc462a
--- /dev/null
+++ b/source/engine/io/Window.cpp
@@ -0,0 +1,74 @@
+#include "Window.hpp"
+
+#include <stdexcept>
+
+namespace megu {
+    Window::Window() 
+    : _pointer(nullptr) {
+        if(glfwInit() == GLFW_FALSE) {
+            throw std::runtime_error("Cannot initialize GLFW.");
+        }
+    }
+
+    uint16_t Window::width() const {
+        if(this->_pointer != nullptr) {
+            int width;
+            glfwGetWindowSize(this->_pointer, &width, NULL);
+            return width;
+        }
+        return 0;
+    }
+
+    uint16_t Window::height() const {
+         if(this->_pointer != nullptr) {
+            int height;
+            glfwGetWindowSize(this->_pointer, NULL, &height);
+            return height;
+        }
+        return 0;
+    }
+
+    bool Window::isOpen() const {
+        return this->_pointer != nullptr ? !glfwWindowShouldClose(this->_pointer) : false;
+    }
+
+    void Window::resize(uint16_t width, uint16_t height) {
+        if(this->_pointer != nullptr) {
+            glfwSetWindowSize(this->_pointer, width, height);
+        }
+    }
+
+    void Window::open(const std::string & title, uint16_t width, uint16_t height) {
+        if(this->_pointer == nullptr) {
+            this->_pointer = glfwCreateWindow(width, height, title.c_str(), NULL, NULL);
+            if(this->_pointer== NULL) {
+                throw std::runtime_error("Cannot open Window.");
+            }
+
+            glfwMakeContextCurrent(this->_pointer);
+            glfwSwapInterval(0);
+
+            if(glewInit()) {
+                throw std::runtime_error("Cannot initialize GLEW.");
+            }
+
+            glViewport(0, 0, width, height);
+        }
+    }
+
+    void Window::close() {
+        if(this->_pointer != nullptr) {
+            glfwSetWindowShouldClose(this->_pointer, true);
+        }
+    }
+
+    void Window::pollEvents() {
+        glfwPollEvents();
+    }
+
+    void Window::swapBuffers() {
+        if(this->_pointer != nullptr) {
+            glfwSwapBuffers(this->_pointer);
+        }
+    }
+}
\ No newline at end of file
diff --git a/source/engine/io/Window.hpp b/source/engine/io/Window.hpp
new file mode 100644
index 0000000..b541bf8
--- /dev/null
+++ b/source/engine/io/Window.hpp
@@ -0,0 +1,31 @@
+#pragma once
+
+#include <string>
+#include <GL/glew.h>
+#include <GLFW/glfw3.h>
+
+namespace megu {
+    class Window {
+        public:
+            Window();
+            Window(const Window &) = delete;
+           ~Window() = default;
+
+            uint16_t width() const;
+            uint16_t height() const;
+
+            bool isOpen() const;
+
+            void resize(uint16_t, uint16_t);
+            void open(const std::string &, uint16_t, uint16_t);
+            void close();
+
+            void pollEvents();
+            void swapBuffers();
+
+            inline static double Time() {return glfwGetTime();}
+
+        private:
+            GLFWwindow * _pointer;
+    };
+}
\ No newline at end of file
diff --git a/source/main.cpp b/source/main.cpp
index ba376e7..7b6a23d 100644
--- a/source/main.cpp
+++ b/source/main.cpp
@@ -6,6 +6,7 @@
 #define WINDOW_WIDTH  1200
 #define WINDOW_HEIGHT 720
 
+#include <engine/io/Window.hpp>
 #include <engine/graphics/back/cameras/View.hpp>
 #include <engine/graphics/front/object/Image.hpp>
 #include <engine/graphics/front/group/ImageGroup.hpp>
@@ -13,7 +14,7 @@
 
 int main(int argc, const char * argv[]) {
     try {
-        //? GLFW
+        /*//? GLFW
         if(glfwInit() == GLFW_FALSE) {
             std::cerr << "GLFW : GLFW Init Error" << std::endl;
             return EXIT_FAILURE;
@@ -43,47 +44,45 @@ int main(int argc, const char * argv[]) {
         std::cout << "GLFW Inited" << std::endl;
 
         //? Glew
-        if (glewInit()) {
+        if(glewInit()) {
             std::cerr << "Failed to initialize GLAD" << std::endl;
             return EXIT_FAILURE;
-        }
-
-        std::cout << "Glew Inited" << std::endl;
-
-        //? Viewport
-        glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
-
+        }*/
+        //? Window
+        megu::Window window;
+        window.open("Window", WINDOW_WIDTH, WINDOW_HEIGHT);
         megu::error::opengl_error::check();
 
+        std::cout << "Window Inited" << std::endl;
+
         //? Camera
         megu::View view(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
+        std::cout << "View Initied" << std::endl;
 
         //? Image
         megu::Image image;
-        image.load("assets/textures/Test.png");
+        image.load("assets/textures/Cube_Red.png");
 
-        image.setSize(WINDOW_WIDTH/2, WINDOW_HEIGHT/2);
-
-        std::cout << "Texture" << std::endl;
+        std::cout << "Image Inited" << std::endl;
 
         //? Group
         megu::ImageGroup group;
         group.temp_set(image);
 
+        std::cout << "Group Inited" << std::endl;
+
         //? Render Loop
         glClearColor(0.0f, 0.0f, 0.0f, 0.f);
 
         std::cout << "Render Loop Begin !" << std::endl;
-        while(!glfwWindowShouldClose(window)) {
+        while(window.isOpen()) {
             glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-            glfwPollEvents();
-
+            window.pollEvents();
             group.draw(view);
 
-            image.setPosition(sin(glfwGetTime()) * WINDOW_WIDTH/2, cos(glfwGetTime()) * WINDOW_HEIGHT/2);
+            image.setPosition(static_cast<float>(sin(glfwGetTime()) * WINDOW_WIDTH/2), static_cast<float>(cos(glfwGetTime()) * WINDOW_HEIGHT/2));
             
-
-            glfwSwapBuffers(window);
+            window.swapBuffers();
         }
         std::cout << "Render Loop End !" << std::endl;
     }
-- 
GitLab