From dd3ee57fcb5438824849255c14c34bb8234efa41 Mon Sep 17 00:00:00 2001 From: leca Date: Sun, 2 Mar 2025 21:57:05 +0300 Subject: [PATCH] build basic coil segment with some problems ;) --- .../index/coil.cpp.430626AC9C964D13.idx | Bin 1384 -> 2472 bytes .../index/coil.hpp.679854B715F05634.idx | Bin 958 -> 1312 bytes .../index/main.cpp.40336BE2C71C0AAD.idx | Bin 1224 -> 2880 bytes .../index/segment.cpp.E58BEE5B986EAFA7.idx | Bin 5024 -> 6568 bytes .../index/segment.hpp.C426421540A83234.idx | Bin 1680 -> 1884 bytes .../index/utils.cpp.9EA3B96F5F89167F.idx | Bin 2552 -> 2572 bytes .../index/utils.hpp.66E4232BF41BB544.idx | Bin 690 -> 710 bytes .vscode/launch.json | 16 ++ CMakeLists.txt | 1 + build.sh | 2 +- shaders/shader.vert | 7 +- src/coil/coil.cpp | 58 +++++-- src/coil/coil.hpp | 15 +- src/coil/segment.cpp | 136 +++++++++++++---- src/coil/segment.hpp | 15 +- src/main.cpp | 144 ++++++++++++++---- src/utils/utils.cpp | 4 +- src/utils/utils.hpp | 4 +- 18 files changed, 316 insertions(+), 86 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.cache/clangd/index/coil.cpp.430626AC9C964D13.idx b/.cache/clangd/index/coil.cpp.430626AC9C964D13.idx index 159e30a22c7cfa3695c0ef97af4f15e7b11c1847..9bbceaf8a842c353473d100e2420131c67098065 100644 GIT binary patch literal 2472 zcmY*b2~ZPf6yDt&`lnROy>=bW$jNcLP}^GA_rC0Aj69ham|yF@C$FSA*QDaU!j|QTJXL}r z#b196V;{eL-e`&xKA784b-ezEliB;zbe3&eMe+UAvT?PH#TUauEy{!Wx%FWiGPF;r zO_i~&>pVMirlgi$Ij-KwJyXk@)A4lff&4pPj?79qmw0L!FKPPBp2oQ4!IMtRxR*Wl zcglLGVyLvBb9%(7^YNqHnw#`j6&3A$FE;PFb+qcnylX>m45J!4+&0Z3QY-3p!mmEw z64SdPt#aJE*s1S^CQM`%Pd&cnS%)h3%5MTeG8{iwHGxi+#jF zG7m40KyVjkX4!7BG0fg~V8eqJib0T+zq`NR2i_P)Qc=Pve?U_cB>_DftSp?Q#4Ir% zQeV=2x~^n&iV&?e=}jR}ElHUz=4e1i)2@YmTP~E)L2MHb%qYms%m*~1%ub{U%T-L0 z(n_>4s2p($@Yg$$MQ<^{62x$LR1hHZ1GU>@dWatK|m6gh`68;OhXj_WM?iw_VZ`OiGXI<<7hY z+~7dm`kiZ1^+$qG*DSu4K-fSVzy9;&tqVfkND2vs2`Ldm@&PAmv`Xv+jV37>TgHQd zla!LJ;3 zT;~!MN97I@i!AVsUbvR5pvN65h=!n$<{;JHhmWg}*+N(xPxj}Az_t~=d0Ua$&)rW0 z)i=*O&dy4VsX&LFyU8z472HBcJ> zC25Lx<|f-)5rIfvq+`CZlLlg6-u&WMCi7oS0RbjOYs!geO#vw;MQaL>G_EseQDfE> zl$WjmwtIi&>*th5L_6XXga@g>Oj03uhyyJfaewr~=Jac5esqv?J30su{Gy`i(;kZM zvz?j-%f=DmPXAys01cLa))g zyiE)mg9Al*4P02rP9LC&^GyPviineD$1!ZKlWf7;7Z0EftYWL9kDy{ihkm62o$YmL zt*@sn7)0WtA5ut(6=vq8(*v;;X4q2b8zueq;qrhR3{yC79p@B=Q*V8y`DTv@zRi{@ nlrp&oCUb_-f4Ba-GV98-v72h)R;5S>Fp!V4wa<3ZqG&difxA5cKXDQwWT-W&dyqC1fy0V3d zExpy)HFc(q_TKe-Os4O4St?v4Gs*R>#@hX+hGuQbrXTj)c5!!R_wVtn=`4L(Zn$_I8IA%HVHRK=bvxw|8>s9Oz5l8enMld^n-DJESN{j7d<4L4=)+ol8`hMVNzu11JXs3wxgXHSG*uF2E!W zlosa}7Zera6yt|UuY8xCtU6cwl>n0zP+FK*SX5M$TT~b(&3{#B>D^eXuL4YxKxuvj zer-_^IT1~mbWv(rF%K{nL;Qr)Ure-NW#kdzXXWRH=_=mx`?|bDRs$yd;m_Jsxjh07Kw)kPZn))} zW96Oq>%H~|3QI6b@WWKcdCg(Ia{EgtGpcH!D|qr{_?LdBO?I7sJy2MLLxdORmBLF4*Rcy|Hv+>^o=Kh$X7+be?vFn5 zuiAjZQjAjY;JxlP|HWROIXxg(vU2mnT)-nDz#$-j~QKgoh=Mh#Zp~7ff%1uIAbDS2;6*ilq6ZWno_75s~MYmxJ+O zih;oZN`kQX+kffifq={Tn}GJpTgiLCRIk|ieVXCJxBGy?AdkU>-xlxQwz@+7A;^_{ z+~P1-a;^Dr)@IhfXF&h5bF&M>gn>Loc1;A2i;0U1#)Abc&^e$a4|5JIaDc*~qz)6F zP_^r@)WO1^AXfr|ALg7|y9J+wDqDU7h2>P_OkrLuO3g_GDJd>WE_Meo#6biENWd5j z3}SF5qsXzcTk|(|icMn`mJk&aXAp%;fs0EhFF7|QM-a&7<>zN&Wnp9IVCLi&;NoHA GV*miu=gA}h diff --git a/.cache/clangd/index/coil.hpp.679854B715F05634.idx b/.cache/clangd/index/coil.hpp.679854B715F05634.idx index a72632b62ab2250c33a22b891b7702479c132a17..950db7b8cfd57fce9555f9b600144d0c97805ee8 100644 GIT binary patch literal 1312 zcmY+DYe*DP7>3WD-PM_KoH@H=yPK<-l4(lWjWF$Mp{aRojS@4=%t|eCrB>*!Y-FYt z7+o}zNLiDJE|^iI1wrA`4^wM3=!d8jMT%)ZqB>{tqgvQ^=DZK*JD2aB%*6P3iyonM zI};rx1!Z|Ugpfl2_OjAFkLfd8gOH=XE z?|r&Ic6H~~xbbmZ9u<5i;BB1qZe`Ykik^^y)`+U~panLcrNyrG>z9;OUbLM}bw;{A zWGp|G@FhHU_SCERl((Mj+Vo3}4|4rlH!k*j(ebP9nrA`7kIUR1N{-t(RvLxp`^Xeyv@AYz&CY47sX=GVK8j`@S6eeUB}c`D;O8oqUC z$X;HuqlfN)%NZxmk*obBti^~^W+)a_5J%5Pe~F&vPmZl?=SbL#V&Y3IssIj7tUaE2 zdGA7ROiOWsmmsKucy+Rd*YE4BYH@z5S}I{3D^ClyY@Bvk;9 zSi9Wrj4ek@ScBDyh%@O-9N?dY-Oj+n}q>vc;e~)|7jKy)ph}dEU=O^2w=mC%%%YVd;j2tv4k8=47K%~ zo=jInxk>ffHv`cU9{pU=?Y=tvHZZ!OV8-Tpfk}NE+64anJ3klee4{Eb;fDO5z zHVXyVkO#UX%K_Ms18TGWgAM(sHtRdsLfcpOiYq^dbs|S}M1;$x*T|a;a40$oGKKv! ziZR8(2!ccFvcN!HxEE@(pnzRkP@Ko^)n1x!k76%>K3n#N1XWex_|IAS6^4)&t-yOD H@4w(Td9qbk literal 958 zcmWIYbaUIr%)sEB;#rZKT9U}Zz`!63#Kk2=nX`cOFCea%Gqry&-ys8@mcK@8wniD2 zwzSHs9Eq@8X6QBhgx`a&o%aa|xcx)8R&ix+k_96JgXgVfuPY)Q zRrr{gnHX63dHE&41Oo@q~r zrWJPp!z9E{Nd3h`8&)PB76DEHewc@NSVTBQ_+e(i0-2Eu9JsJRh0#pVK!t=K0}nU^ zVUlrPbC|E({t^nZKtMnm$pQfpX_y7DSYYHt(OaGIcMeOdL^9A`77i8xsQC=ANC66i zVgzOr%xIu6C?;USut)$3gJJ+C3=4dqFev0tSQ!8bk^#m5 diff --git a/.cache/clangd/index/main.cpp.40336BE2C71C0AAD.idx b/.cache/clangd/index/main.cpp.40336BE2C71C0AAD.idx index 0e4a6a2b34d04a117cdbb6fa4513377cb489fd9b..8830485541f917e33c202355cb0a2275f717ed30 100644 GIT binary patch literal 2880 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 z za$*yNH9>y~H$zx6jaxz93JSt6ho{fPHb|CmJ6PML;32&b_q->+CrRj%pOTn!y38|$ zQ}eQWe_Iw6PA*!~yU_Rk^W-mtEEpz0T82tXgS6}?EsfGL*tG;v^=DvJS7yg&9s&Bm qkWfRvU}F#y=#n!*(sFYCl)T>mLGV;6S$D2aUzwX+!FwR^V*U>(mnlpD diff --git a/.cache/clangd/index/segment.hpp.C426421540A83234.idx b/.cache/clangd/index/segment.hpp.C426421540A83234.idx index 798e13e4f280f34558dae4794f159be17fbe8afe..d0e2e74f55a8971f7e8bd4d177de7b7855ebe820 100644 GIT binary patch literal 1884 zcmYjR4NOy47=69GLT`ER_0kp!Z7Gy3K_ONm8=1^sHXvQdi1@S32~jo}KSP$55KxG) zDGMXOz(u1V7`Kq=a2ht5Y?8@z2HhN!Kw@IDh4Et$1+qvoH+8%3ZKtkDzxJNb3MLB%dn5CjYV`YU|Jll-?rCkR!YTeF8sE+t9hBX{jL`Zl-R zt90D`(0ud8vXb73n^(4d*MFwFz5Vl`r`BFwSnGY~Wpk=4zQt%dUsk{4`0D4T*N^Gl ziOq%XZ7Y&zJu_!IujS>A4tVyKhQIdl+(bhC>o49f&X=+jzqdPUdzBdIuOnqBdOZ?uds@*Nubtmt{_BU<1G&fuO!{Bt=x!WiDGixuGJ2RI` zZ@-tT8(FnS-S4^%;73}u4}IOu6cR-Q%4Fuyf?(kHz(1$b?Srf4ddv#3bDGLDObejp zlA|998_Jg}B!bhDL6Wrqnx5_2w>{x>A|s)^mHMG>*=+^=LAh(^;mN;K8IeKTL+ufu z{qt%2NV$H!LLzx_Q>e+J1<;ERPZzi@uniGJhisc@Gl9-~sWWKo*8Qy^gin)(1c!ua zL7>_`bX1?Ya(UtxGiiB@Sdkw^qXOM07HbOEICs9qNHAzCwML9C`?Tm-&e9=9!jT^;nxo%ZX+lZ=EQ+eKXt(5h!O7+2dqb4;TBx(>123)*EZOmqcd|?7!NfkdTLHxY0s(ir6;!mq$2b}h2O3l>4 zTO0Kfr6QGZ7Ks`~qXaGTzE0cIsK8f=w&W+PI5AGb1*0r6{_C0l&cRdu*AxEXTTy+3 z9QcOAs$T%ZFC12V0vLPa$5c%MIOZ8c&6Zb3n>eg9=pu2Cp6?UwJu~y|qC}aJS|g#xGH~=$0@bz6y6oV+G&wU8sITJNS*aQ_Th#KI2cT{sIht@uyXD0mgVateOfi z{KSi>J^~CMaX6Oy2Qd7@VbwQ);TsOCegO=>a9H&TU}Nv%^)*Ky&k%{qqAcNbe0-U< yY)l-p=DDhgkc(U7uxcK_g0JB1UFsP8zBl|f^-nwhA1_+2Ipz2tD;9+#@{4HFY1_zouj;M{2#Xz5j=w zhI;~|?VI19P9Lk?GoBIpnO?iv-$gI%c9f5;_;W+|$(|y2Q};^GY{R*@)`!A$^z)h` z|JhxqH`GV-Ce2p@cMddO4Ap$I?dX2bkg2|-KQO%Mj?rPq$2HB{`(7^dy(hMC)sb*=88#w$46UAbF(+s&p$hoX=x4KuXlEYo9ikg zgyZ7dAItk<;IOI?op4l@RgV!kE6fhphwI#fxqn18g}A^LWii1BXv;MR-{4jUmnp;n zwq%uLBcQ!I=-qPQ*P8_@kq9UD@`=5C8g)x<9TUQH{^v>1^q@kVP;ZlL4kMs_>H5(s z?+JCalkiZVBB!{hF6cJ2->f~5dHOriuM#WR1H3lCFQqABN)jeitnZHde(LXy76PY8 zEoMuC5jfG9ji;u-ie#*nbZVFE zZnV!2-iUqn%6(^4Vgox{%XU&t)MT{R{l2&IRIKf+O5(td@>-PlP?zY^FyXle-uX*w ze(7J8$dJ&-JNx)d>XAKOOyELQ+rp!_5z148OgvL06J&-Z%19*03`dlg6z_YXG*Xij zCsLEyL>CW}<0NVotXA9!iR!BEKpin9No{Fd{bQ)>i? zih?NNOG}grR6>4W-DEujJHV4q&%-BV9Qrb{u`k{UT_pPdfuQ!b#gT5PWmIDgQVlYr z8D)GM7>uEea_ZgIma*9N!oLxTdIXPzhl{@eSc!3u zEs=X@$)HCWd53I9Im$>m$c%23k#1%W%fpP}PpDZ12LMC&D`W63@coMW<&6hYqir Jc!ZDV{sStq*cJc) diff --git a/.cache/clangd/index/utils.cpp.9EA3B96F5F89167F.idx b/.cache/clangd/index/utils.cpp.9EA3B96F5F89167F.idx index eea7dd77e446f30f9252f40831bbde5e623b3f05..9078e7b0f61e7b22695cd780360c3a02196fcb79 100644 GIT binary patch delta 557 zcmew%+#^ySy08{5SO4Hn}fO^!O<3dorPoF>dAYP!;~S9`*N}k_%5fsL?MrGBx5l)-RTQ z!OQ*Ffe*{3$*!EG^JMdcm{wsUu9*hM4JD^cyY%Uh<4g&wq7VBbUA>d}^CgANRkz*B z_wu=A_+ojSU!+vt#v`!@Cup{X$0?$&SX zC;8v1eX9Qc`17yq)#dlEi$9y*urun;=cb>%Q7bHG#7)=Qa9VZYyX=6juR4=O<`j5J zzj6D&VX;zMOS9jOn_1nO+}k$&-Y=lpchF4Lj3>p&#_JLL%W^-n;>z5~^^C^qoJ!(C zN|nrW#pivrcGF5825ANcA$B%)2{1AFCZjfE$7WWhV~or|)sxRLpXPumoxG4` zCcoZMZK-9?-c4fU5mI7M;+Sm2+8_>7z{mwQ17^kMO{|@alY`is;U;Xp%RYy3auug1 bhoo4}%6i#=Ym-lNs&a5~3vlu<@-YAaE4$n6 delta 533 zcmeAX`5{~%J8YiZWvu85qtoGcZ)l>78`Yk6BTm zty0pT*JoSR#U**;%FwjSr@-h4Yy%!!~M@f&S&2Nzy6IP#%YP2J!y!}}|bjV3gwsnn-0+-9NjB1S*hMAhiiv0gFn z3r_CG4t!WNMRw(kGfyT>kbZk(PBEvGn@?g7+tQ^wb{GVz{g`I;BSyb@>Bjc{mWi*0 zq~2b$bh&HzVp*J@r_{PlM`GRPYy4QUtfWI?d2RYm2hGo|0e4q>oqZ^=_J3L5tmKw{ z*PG&h`{&NDnjPO4Gg zwSsrs;_6$0V$Me#-DC2%9-YAwee-X8hlE@HYnd!IA;~<|kKEec{?Wygs~Jtzd6lGv zlz;><*uh{Y!z`vEhW=|j3_u|vc6N42FfsW$qc&sVW@e^ijLbmQlg}`p=71@kJfCIe zWPjF*&G%S48TnzNj9d_n@$B7jm771Y&taV0%jw18WqxN8_k4}7lkan?a&U4BaPctm GF#rJ8ch++N diff --git a/.cache/clangd/index/utils.hpp.66E4232BF41BB544.idx b/.cache/clangd/index/utils.hpp.66E4232BF41BB544.idx index 880aea64d0e67540ad4be94f79a807f7e4917157..7e1faefa7affd56ae6e61bb561136b509ed8a809 100644 GIT binary patch literal 710 zcmWIYbaUIs#K7R3;#rZKT9U}Zz`!63#Kk2=nWl^k3?@LiiaEW3r?Uqddi zvNM+Sea@+hn6j&T=4Y}G9cDL%O` zfA-rYNBFJo@2YT8EZDE#l@(m;d_m*fq2(vDj55qb%^tXZS&+O#uE9`DG0NX$=f1$} zSFFRb7kiznOpZR<>-6B4;gAkAh0=%58oPrFTY)lLi+zgvz<(>EIz4qq;2RT@po0D6dfs=)W zL7bC;&x+6cXziwzJPe{>y+GZpY^)LtoUDutf?NzYr*BjV{Iv8Q4}%Cynw^JTgn^Tt znL&($p(r)2cm_}c<_1Pih}}@NFuQ@mU^}70!JMvpb5jNSn0R>ES=qVacJQ)Gu`9rM zdPlXTmOXnniIInwn}M4HW)#f5KqJBKgc=Fc1r!Fm4=P-gnv)1(78fNKTZ0(9UAwO> d(Da;I!otJHFTlVD5`zGK7=wX90Kw!zFaZXpgV#QViWHm84kXU||+zWl&Dh2Avwjmqzq|6X*(Y%OnE zbgGbC+RYMs{gwSQKXZtj_}0!|cuCfCgVg!&0;MM(tjsrFo>cy1=drTQZ%%c_pI58- zWB*@a!JM%9qMv(8d3VPKhOEw7%j9UwF<-s=WaQ>m3xfCc#Rc+Q=RYOEtrd0NWcR*e z^E=UoHGU>38>R%6l{H^d(0IA$uVaT}Q}L&6vmF~!RK6xma=R(D)PF*``FS>eBUhuu z1AB_!8O?6mU$MVdXaCLJKWk-X_Olk4*FT(eG}!JuH>dQytGb60lNWvE+Ti)D)IG33 z#IG`@)N3*Sp~aWH%Y^PNi@SdDn$CmV;;Kw2m>cO zGlLihLs4p4aU)Oy<_1Pih}}@NFuQ@mU^}70!JMvpb5jNSn0WZuS=qVacJQ%Fu`9rM zFoyy4f*l0a3zG&4gB=1D2D&6C5yUPoN-nkrG5B&POkbENl(UhAmtR1TfgdCW0Rk`v M1A`!f$%|kD0O2##LI3~& diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..10efcb2 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "lldb", + "request": "launch", + "name": "Debug", + "program": "${workspaceFolder}/", + "args": [], + "cwd": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index b622d94..9095e13 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,7 @@ project(TimeCoil) include(FetchContent) +SET(CMAKE_BUILD_TYPE Debug) SET(PROJECT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp src/glad.c ${CMAKE_CURRENT_SOURCE_DIR}/src/coil/coil.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/coil/segment.cpp diff --git a/build.sh b/build.sh index eb5b42b..bee13f6 100755 --- a/build.sh +++ b/build.sh @@ -1,2 +1,2 @@ #!/usr/bin/env bash -cd build && cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_C_FLAGS="-g -v -da -Q -O0" .. && make && ./TimeCoil > ../points.csv && python ../tools/build_3d.py ../points.csv +cd build && cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_C_FLAGS="-g -v -da -Q -O0" .. && make && ./TimeCoil # > ../points.csv && python ../tools/build_3d.py ../points.csv diff --git a/shaders/shader.vert b/shaders/shader.vert index a287f1b..06e3b69 100644 --- a/shaders/shader.vert +++ b/shaders/shader.vert @@ -1,10 +1,15 @@ #version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 col; + +uniform mat4 model; +uniform mat4 view; +uniform mat4 projection; + out vec3 frag_col; void main() { frag_col = col; - gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); + gl_Position = projection * view * model * vec4(aPos, 1.0); } \ No newline at end of file diff --git a/src/coil/coil.cpp b/src/coil/coil.cpp index def6554..c57988a 100644 --- a/src/coil/coil.cpp +++ b/src/coil/coil.cpp @@ -1,15 +1,18 @@ +#include #include #include +#include #include #include #include -Coil::Coil(uint32_t currentYear, uint32_t amountOfSegments) - : currentYear(currentYear) { +Coil::Coil(uint32_t currentYear, uint32_t amountOfSegments, uint32_t sliceDetalization, float radius, float width) + : radius(radius), width(width), currentYear(currentYear) { for (short i = amountOfSegments / -2.; i < amountOfSegments / 2.; i++) { uint32_t year = this->currentYear + i; - segments.push_back(CoilSegment(this, year, segmentHeight, i, 3,false)); + + segments.push_back(CoilSegment(this, year, segmentHeight, i, sliceDetalization,false)); } }; @@ -17,20 +20,47 @@ std::vector &Coil::getSegments() { return segments; } -double Coil::getWidth() { +float Coil::getWidth() { return width; } -void Coil::render() { - prepareShaders(); - uint64_t VBO; - glGenBuffers(1, (unsigned int*) &(VBO)); - glBindBuffer(GL_ARRAY_BUFFER, VBO); - for (CoilSegment segment : segments) { - double* vertices = segment.getVertices(); - uint64_t verticesLength = segment.getVerticesLength(); - glBufferData(GL_ARRAY_BUFFER, verticesLength, vertices, GL_STATIC_DRAW); - +float Coil::getRadius() { + return radius; +} +void Coil::initGLBuffers() { + + glGenVertexArrays(1, &VAO); + glGenBuffers(1, &VBO); + glGenBuffers(1, &EBO); + + glBindVertexArray(VAO); + + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); + + // glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); + + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*) (3 * sizeof(float))); + glEnableVertexAttribArray(1); + + glBindVertexArray(0); +} + +void Coil::render() { + glBindVertexArray(VAO); + std::cout << "Rendering a coil." << std::endl; + for (CoilSegment segment : segments) { + std::cout << "Rendering " << segment.getYear() << std::endl; + segment.fillVBO(); + uint64_t indicesCount = segment.fillEBO(EBO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); + // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + // glDrawArrays(GL_POINTS, 0, segment.getVerticesLength()); + glDrawElements(GL_TRIANGLES_ADJACENCY, sizeof(unsigned int)*indicesCount, GL_UNSIGNED_INT, 0); } + glBindVertexArray(0); } \ No newline at end of file diff --git a/src/coil/coil.hpp b/src/coil/coil.hpp index f4b5d75..c06eb5e 100644 --- a/src/coil/coil.hpp +++ b/src/coil/coil.hpp @@ -1,5 +1,6 @@ #include #include "segment.hpp" +#include #ifndef COIL_HPP #define COIL_HPP @@ -9,18 +10,22 @@ class Coil { // distance between coil center and nearest to it coil edge - double radius; + float radius; // distance between coil slices edges - double width; - double segmentHeight; + float width; + float segmentHeight; uint32_t currentYear; std::vector segments; + GLuint VBO, VAO, EBO; + public: - Coil(uint32_t currentYear, uint32_t amountOfSegments); + Coil(uint32_t currentYear, uint32_t amountOfSegments, uint32_t sliceDetalization, float radius, float width); std::vector &getSegments(); - double getWidth(); + float getWidth(); + float getRadius(); void render(); + void initGLBuffers(); }; #endif // COIL_HPP \ No newline at end of file diff --git a/src/coil/segment.cpp b/src/coil/segment.cpp index da5e022..1f2267b 100644 --- a/src/coil/segment.cpp +++ b/src/coil/segment.cpp @@ -1,8 +1,10 @@ +#include #include #include #include #include #include +#include #include #include @@ -44,11 +46,12 @@ CoilSegment::CoilSegment( void CoilSegment::init () { verticesLength = DAYS_IN_YEAR * FIELDS_IN_POINT * (sliceDetalization+2); - vertices = (double *) calloc(verticesLength, sizeof(double)); + vertices = (float *) calloc(verticesLength, sizeof(float)); if (vertices == NULL) { cerr << "Allocation failed" << endl; exit(-1); } + calculate(); // cout << "Initialized CoilSegment" // << "(year: " << year // << ", height: " << height @@ -69,9 +72,19 @@ void CoilSegment::printVertices() { } -double *CoilSegment::calculateSlice() { - uint32_t size = (/*start and end of a slize*/2 + sliceDetalization) * FIELDS_IN_POINT * sizeof(double); - double *slice = (double *)malloc(size); +float *CoilSegment::calculateSlice() { + uint32_t size = (/*start and end of a slize*/2 + sliceDetalization) * FIELDS_IN_POINT * sizeof(float); + float *slice = (float *)malloc(size); + mat4 transform = mat4(1.); + transform = glm::scale( + transform, + vec3( + coil->getWidth(), + 10, + 1 + ) + ); + vec3 point = vec3(cos(0), sin(0), 0); // Start of a slice slice[0] = cos(0); slice[1] = sin(0); @@ -80,7 +93,7 @@ double *CoilSegment::calculateSlice() { slice[4] = 1; slice[5] = 1; - double degreeByPoint = -180. / (sliceDetalization + 1); + float degreeByPoint = -180. / (sliceDetalization + 1); for (uint32_t i = 1; i <= sliceDetalization; i ++) { uint32_t offset = FIELDS_IN_POINT * i; @@ -94,7 +107,7 @@ double *CoilSegment::calculateSlice() { } // End of a slice - uint32_t endIndex = (size / sizeof(double) - FIELDS_IN_POINT); + uint32_t endIndex = (size / sizeof(float) - FIELDS_IN_POINT); slice[endIndex + 0] = round_to_presicion(cos(radians(180.)), 5); slice[endIndex + 1] = round_to_presicion(sin(radians(180.)), 5); slice[endIndex + 2] = 0; @@ -105,17 +118,15 @@ double *CoilSegment::calculateSlice() { return slice; } -void CoilSegment::constructSegment(double *slice) { - - double degreesPerDay = 360.f / DAYS_IN_YEAR; +void CoilSegment::constructSegment(float *slice) { + float degreesPerDay = 360.f / DAYS_IN_YEAR; for (uint32_t day = 0; day < DAYS_IN_YEAR; day ++) { float daysDegree = day * degreesPerDay; - // TODO: replace hardcoded value to coil->getWidth(); vec3 daysPosition = vec3( - cos(radians(daysDegree)) * 200, + cos(radians(daysDegree)) * coil->getRadius(), 10* daysDegree/360., - sin(radians(daysDegree)) * 200 + sin(radians(daysDegree)) * coil->getRadius() ); mat4 transform = mat4(1.); @@ -150,14 +161,78 @@ void CoilSegment::constructSegment(double *slice) { vertices[currentPointOffset + 1] = point.y; vertices[currentPointOffset + 2] = point.z; - memcpy( - vertices + currentPointOffset + 3, - slice + slicePointOffset + 3, - 3 - ); + vertices[currentPointOffset + 3] = 0.5; + vertices[currentPointOffset + 4] = 0.5; + vertices[currentPointOffset + 5] = 0.5; + + // memcpy( + // vertices + currentPointOffset + 3, + // slice + slicePointOffset + 3, + // 3 + // ); } } } +void CoilSegment::fillVBO() { + // printVertices(); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * verticesLength, vertices, GL_STATIC_DRAW); +} +uint64_t CoilSegment::fillEBO(uint64_t EBO) { + uint64_t indicesLength = 6 * (sliceDetalization+2) * DAYS_IN_YEAR; + uint64_t currentIndex = 0; + uint64_t* indices = (uint64_t*) calloc(indicesLength, sizeof(uint64_t)); + for (uint64_t day = 0; day < DAYS_IN_YEAR; day ++) { + for (uint64_t pointOfSlice = 0; pointOfSlice < (sliceDetalization+2); pointOfSlice ++) { + // cout << currentIndex << endl; + uint64_t dayOffset = day * (sliceDetalization+2); + uint64_t offset = dayOffset + pointOfSlice; + //First triangle + indices[currentIndex] = offset; + currentIndex ++; + indices[currentIndex] = offset + (sliceDetalization+2); + currentIndex ++; + indices[currentIndex] = offset + 1; + currentIndex++; + //Second triangle + + if (pointOfSlice % (sliceDetalization+1) == 0 && pointOfSlice != 0) { + indices[currentIndex] = offset - (sliceDetalization+2); + currentIndex++; + indices[currentIndex] = offset + 1; + currentIndex++; + indices[currentIndex] = offset; + } else { + indices[currentIndex] = offset + 1; + currentIndex++; + indices[currentIndex] = offset + (sliceDetalization+3); + currentIndex ++; + indices[currentIndex] = offset + (sliceDetalization+2); + } + currentIndex ++; + } + } + + // for (uint64_t i = 0; i < indicesLength; i ++) { + // cout << indices[i] << ","; + // } + // cout << endl; + // cout << indicesLength << endl; + + if (currentIndex != indicesLength) { + cerr << "currentIndex == indicesLength assertion failed" << endl; + cerr << currentIndex << " " << indicesLength << endl; + } + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned long) * indicesLength, indices, GL_STATIC_DRAW); + free(indices); + return indicesLength; +} + +// void testEBO(uint64_t *EBO, uint64_t length) { +// for (uint64_t i = 0; i < length; i ++) { + +// } +// } // Sample layout of 2 slices with 3 points. // |x |y |z |r |g |b | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 @@ -165,45 +240,48 @@ void CoilSegment::constructSegment(double *slice) { // | slice | slice | // void CoilSegment::calculate() { - double *slice = calculateSlice(); + float *slice = calculateSlice(); constructSegment(slice); exportSegmentToCsv(); } -double *CoilSegment::getVertices() { - return vertices; -} +float *CoilSegment::getVertices() { return vertices; } -uint64_t CoilSegment::getVerticesLength() { - return verticesLength; -} +uint64_t CoilSegment::getVerticesLength() { return verticesLength; } + +uint16_t CoilSegment::getYear() { return year; } void CoilSegment::render() { } +void CoilSegment::exportSliceToCSV(float *slice) { + cout << "Exporting slice to csv" << endl; + std::ofstream outFile("./slice_export.csv"); -void CoilSegment::exportSliceToCSV(double *slice) { - cout << "x,y,z" << endl; + outFile << "x,y,z" << endl; for (uint32_t i = 0; i < sliceDetalization+2; i ++) { uint32_t offset = FIELDS_IN_POINT * i; - cout + outFile << slice[offset + 0] << "," << slice[offset + 1] << ",0" << endl; } } void CoilSegment::exportSegmentToCsv() { - cout << "x,y,z" << endl; + cout << "Exporting segment to csv" << endl; + std::ofstream outFile("./segment_export.csv"); + + outFile << "x,y,z" << endl; for (uint16_t day = 0; day < DAYS_IN_YEAR; day ++) { uint64_t dayOffset = day * (2+sliceDetalization) * FIELDS_IN_POINT; for (uint32_t point_in_slice = 0; point_in_slice < (2+sliceDetalization); point_in_slice ++) { uint32_t sliceOffset = point_in_slice * FIELDS_IN_POINT; - cout << vertices[dayOffset + sliceOffset + 0] << "," + outFile << vertices[dayOffset + sliceOffset + 0] << "," << vertices[dayOffset + sliceOffset + 1] << "," << vertices[dayOffset + sliceOffset + 2] << endl; } diff --git a/src/coil/segment.hpp b/src/coil/segment.hpp index 9de3dba..2f4f5cd 100644 --- a/src/coil/segment.hpp +++ b/src/coil/segment.hpp @@ -13,23 +13,26 @@ class CoilSegment { int shift; uint32_t sliceDetalization; bool isLeap; - double *vertices; + float *vertices; uint64_t verticesLength; void init(); - double* calculateSlice(); - void constructSegment(double *slice); + float* calculateSlice(); + void constructSegment(float *slice); public: CoilSegment(Coil* coil, uint16_t year, uint16_t height, int shift, uint32_t sliceDetalization, bool isLeap); void calculate(); void printVertices(); - double *getVertices(); + float *getVertices(); uint64_t getVerticesLength(); - void printSlice(double *slice); - void exportSliceToCSV(double *slice); + void printSlice(float *slice); + void exportSliceToCSV(float *slice); void exportSegmentToCsv(); void render(); + void fillVBO(); + uint64_t fillEBO(uint64_t EBO); + uint16_t getYear(); }; #endif // COIL_SEGMENT_HPP \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 1e3b595..a7b5a76 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,11 +3,23 @@ #include #include #include +#include +#include +#include +#include +#include -#include "coil/coil.hpp" -#include "coil/segment.hpp" +#include +#include +#include -#define RAND_0_1 ((double)rand()) / RAND_MAX +using std::cerr; +using std::cout; +using std::endl; + +#define RAND_0_1 ((float)rand()) / RAND_MAX +#define DISPLAY_WIDTH 800 +#define DISPLAY_HEIGHT 600 void framebufferSizeCallback(GLFWwindow *window, int width, int height) { glViewport(10, 10, width-10, height-10); @@ -19,28 +31,108 @@ void processInput(GLFWwindow *window) { } } -void updateVertices(double (&vertices)[24]) { - // if (RAND_0_1 < 0.99f) return; - double a[] = { - -1.0f, 1.0f, 0.0f, RAND_0_1, RAND_0_1, RAND_0_1, // upper left - -1.0f, -1.0f, 0.0f, RAND_0_1, RAND_0_1, RAND_0_1, // bottom left - 1.0f, 1.0f, 0.0f, RAND_0_1, RAND_0_1, RAND_0_1, // upper right - 1.0f, -1.0f, 0.0f, RAND_0_1, RAND_0_1, RAND_0_1 // bottom right - }; - - // vertices = a; - memcpy(vertices, a, sizeof(a)); -} int main () { - Coil c = Coil(2025, 1); + + Coil c = Coil(2025, 1, 5, 50, 10); + + srand(time(0)); + glfwInit(); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); +#ifdef __APPLE__ + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); +#endif + + GLFWwindow *window = glfwCreateWindow(DISPLAY_WIDTH, DISPLAY_HEIGHT, "TimeCoil", NULL, NULL); + if (window == NULL) { + cerr << "Failed to create GLFW window." << endl; + gracefulExit(-1); + } + + glfwMakeContextCurrent(window); + glfwSetFramebufferSizeCallback(window, framebufferSizeCallback); + + if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { + cerr << "Failed to initialize GLAD." << endl; + gracefulExit(-1); + } + + uint64_t shaderProgram = prepareShaders(); + glUseProgram(shaderProgram); + + glm::mat4 projection = glm::mat4(1.0f); + projection = glm::perspective(glm::radians(50.0f), (float)DISPLAY_WIDTH / (float)DISPLAY_HEIGHT, 0.001f, 2000.0f); + + unsigned int projectionLoc = glGetUniformLocation(shaderProgram, "projection"); + glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection)); + + + c.initGLBuffers(); + + // float vertices[] = { + // // positions // texture coords + // 05.5f, 0.5f, 0.0f, 1.0f, 1.0f, // top right + // 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // bottom right + // -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, // bottom left + // -0.5f, 0.5f, 0.0f, 0.0f, 1.0f // top left + // }; + // unsigned int indices[] = { + // 0, 1, 3, // first triangle + // 1, 2, 3 // second triangle + // }; + // unsigned int VBO, VAO, EBO; + // glGenVertexArrays(1, &VAO); + // glGenBuffers(1, &VBO); + // glGenBuffers(1, &EBO); + + // glBindVertexArray(VAO); + + // glBindBuffer(GL_ARRAY_BUFFER, VBO); + // glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); + // glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + + // // position attribute + // glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); + // glEnableVertexAttribArray(0); + // // texture coord attribute + // glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); + // glEnableVertexAttribArray(1); + + while(!glfwWindowShouldClose(window)) { + processInput(window); + + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glm::mat4 model = glm::mat4(1.0f); + glm::mat4 view = glm::mat4(1.0f); + model = glm::rotate(model, glm::radians(5.0f), glm::vec3(1.0f, 0.0f, 0.0f)); + view = glm::translate(view, glm::vec3(0.0f, 0.0f, -89.0f)); + + unsigned int modelLoc = glGetUniformLocation(shaderProgram, "model"); + unsigned int viewLoc = glGetUniformLocation(shaderProgram, "view"); + + glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); + glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); + + c.render(); + // glBindVertexArray(VAO); + // glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); + + glfwSwapBuffers(window); + glfwPollEvents(); + } // CoilSegment cs = CoilSegment(10, 0, false); - for (auto segment : c.getSegments()) { - // segment.printVertices(); - } + // for (auto segment : c.getSegments()) { + // // segment.printVertices(); + // } // cs.printVertices(); - return 0; + gracefulExit(0); // srand(time(0)); // glfwInit(); // glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); @@ -66,10 +158,10 @@ int main () { // unsigned int shaderProgram = prepareShaders(); -// double *vertices = cs.getVertices(); +// float *vertices = cs.getVertices(); // unsigned int amountOfVerticies = cs.getVerticesLength(); // std::cout << amountOfVerticies << std::endl; -// // double vertices[] = { +// // float vertices[] = { // // -1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, // upper left // // -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // bottom left // // 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // upper right @@ -92,10 +184,10 @@ int main () { // glBufferData(GL_ARRAY_BUFFER, amountOfVerticies, vertices, GL_STATIC_DRAW); // // glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); -// glVertexAttribPointer(0, 3, GL_DOUBLE, GL_FALSE, 6 * sizeof(double), (void*)0); +// glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0); // glEnableVertexAttribArray(0); -// glVertexAttribPointer(1, 3, GL_DOUBLE, GL_FALSE, 6 * sizeof(double), (void*) (3 * sizeof(double))); +// glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*) (3 * sizeof(float))); // glEnableVertexAttribArray(1); // glBindVertexArray(0); @@ -108,8 +200,8 @@ int main () { // glUseProgram(shaderProgram); -// // double time = glfwGetTime(); -// // double greenValue = sin(time); +// // float time = glfwGetTime(); +// // float greenValue = sin(time); // // int vertexColorLocation = glGetUniformLocation(shaderProgram, "MyColor"); diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index 8b0b629..a6df396 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -5,7 +5,7 @@ #include #include -double round_to_presicion( double value, int precision ) { +float round_to_presicion( float value, int precision ) { const int adjustment = pow(10,precision); return floor( value*(adjustment) + 0.5 )/adjustment; } @@ -32,7 +32,7 @@ void gracefulExit(int code) { exit(code); } -unsigned int prepareShaders() { +uint64_t prepareShaders() { unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); diff --git a/src/utils/utils.hpp b/src/utils/utils.hpp index 29f684d..ffdbe53 100644 --- a/src/utils/utils.hpp +++ b/src/utils/utils.hpp @@ -3,10 +3,10 @@ #include #include -double round_to_presicion( double value, int precision ); +float round_to_presicion( float value, int precision ); std::string readFile(std::string path); void gracefulExit(int code); -unsigned int prepareShaders(); \ No newline at end of file +uint64_t prepareShaders(); \ No newline at end of file