From e4455222664ed02f9e5ae67f6205e8899dfab64d Mon Sep 17 00:00:00 2001 From: Wang Yuyang Date: Sun, 21 Nov 2021 17:25:57 +0800 Subject: [PATCH] add-new-NPCs --- bin/Scene/Objects/Copyleft.class | Bin 2440 -> 2440 bytes bin/Scene/Objects/NPC2$1.class | Bin 0 -> 1712 bytes bin/Scene/Objects/NPC2.class | Bin 0 -> 10792 bytes bin/Scene/Objects/Player$2.class | Bin 1500 -> 1730 bytes bin/Scene/Objects/Player.class | Bin 12845 -> 12947 bytes bin/Scene/Scene$1.class | Bin 811 -> 811 bytes bin/Scene/Scene$2.class | Bin 794 -> 794 bytes bin/Scene/Scene$3.class | Bin 921 -> 921 bytes bin/Scene/Scene$4.class | Bin 1073 -> 1073 bytes bin/Scene/Scene$5.class | Bin 754 -> 754 bytes bin/Scene/Scene.class | Bin 6899 -> 7723 bytes bin/Scene/base/SceneObject.class | Bin 6116 -> 6391 bytes bin/base/obj/OBJLoader.class | Bin 6703 -> 6336 bytes bin/main/Engine.class | Bin 9591 -> 9545 bytes bin/main/Main$1.class | Bin 2717 -> 2717 bytes bin/main/Main$2.class | Bin 1352 -> 1352 bytes bin/main/Main$3.class | Bin 878 -> 878 bytes bin/main/Main.class | Bin 4682 -> 4465 bytes bin/main/ShaderLoader.class | Bin 3762 -> 3762 bytes res/shaders/invert.fsh | 14 + res/shaders/invert.vsh | 20 + src/Scene/Objects/Copyleft.java | 7 +- src/Scene/Objects/NPC2.java | 705 +++++++++++++++++++++++++++++++ src/Scene/Objects/Player.java | 6 + src/Scene/Scene.java | 94 +++++ src/Scene/base/SceneObject.java | 11 +- src/base/obj/OBJLoader.java | 9 - src/main/Engine.java | 230 +++++++++- src/main/Main.java | 25 +- src/main/ShaderLoader.java | 1 + 30 files changed, 1091 insertions(+), 31 deletions(-) create mode 100644 bin/Scene/Objects/NPC2$1.class create mode 100644 bin/Scene/Objects/NPC2.class create mode 100644 res/shaders/invert.fsh create mode 100644 res/shaders/invert.vsh create mode 100644 src/Scene/Objects/NPC2.java diff --git a/bin/Scene/Objects/Copyleft.class b/bin/Scene/Objects/Copyleft.class index 9811835658f133ba1814e3b5779ad5f8389ef814..a3bf8e2a675c8e56caee1f84ce639d2926fa7bc5 100644 GIT binary patch delta 89 zcmeAW?hxLf%FZdnz|J7aAjBX$S&u!7Q-OgK$P-~uoV<{I0;dWCH;^aBpgP%#RAO*zhrs6g9=*n1yk4}GrPDVOyA4QoEsY+q5XtqTmC5p9jST_Q@L#a zyaIL1DRQ&Myk(1-T4hnVbH-wsD=m4)G|KaaYsvZcqAK@PpyzB`xMO9*^8}~KI{3Xq zJVMy5*&I`HBZZh<`4wZ;$dnCxIg_(};kvb|FN)*WOi}eM$7V<*C;_)HYpyHoonnNA zElW`1eU`VcU|+#E%q!DIH8>hes~}!*YOX1=mOOtv$f$Iu7EHj_1&&qZ>Us4r4&Wf{u4^LB~bBtKi_G;fc(IYg9{?>Fv~cp4E2T zqf0v8!}~Jql8(#xK!c%U5vGDePtR6IQSKykEMZwk2^M?#WGj1z6g2H3J>H%D*`Wiogp%&sL@2#q z-9$Lu7TJWFet^i`ASlH#${?VOevZiis1s?t$Qc17(`i@m5(XZFE8jqaPTMaHld;jh zhCAQk+bu+oMdY9*we&rNL@Tt)D7Elfx3%7i7*+M_E8Xkzzubz1GszXDkAeFZr1l#c zE=akB#?_XlmBe2C0h;flMWV-&v1EkU&)ohV?eQ(_-$49$qCIgRZGm~?(cc@7sxmgQ z103GMfi1Kz+~wh~<1?%=#V};rm(a%1VZv3Y_>ga37me`H3ZE6O;UrcufvYIs8XwP( zu|mCqPv~`>zZ=B*oM@loCbh5d1#aU@+~Mp8+``XT56U^oQr$!Z84Myp^fe5zixKW| z1H;rbqV?cqYB5>R?XrjP6Td94@Wd*9#H+N1ag6pPqW?k-s}E68Rh6&**P{PG3(@*I Xtsxx82&Kvo#7P{X7AHanC9nSgs?&a! literal 0 HcmV?d00001 diff --git a/bin/Scene/Objects/NPC2.class b/bin/Scene/Objects/NPC2.class new file mode 100644 index 0000000000000000000000000000000000000000..6c9d9b2649019187c23eef8dda54647829b6ee32 GIT binary patch literal 10792 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 delta 591 zcmXYu%TE(g6vlruo#~|0OC6=HRz!J-6s+Q-P(@J$m8ys@w4fx$7+tt9aqGr~@wGIg zpyDI0x-%g$rePt8OLy*ExbeSmBlz9Mdo$;e@0@SGbMCj6U+Loa)#a~1nYk1>4q7v8 z%^_xg#Y1MJY;~&mI z`HW$bvxco~Gi;(@*i4&Y3+;vu`U0j5=QwY;z{P+|hG{OxH{I^&iUn(i8Dxx3XkjyrmE}i0XvH=|cJo z8=7!^?RR}`zW*~$xu4 zbDKr(@{W7F=RO~J%*W;cRRZBY{p=*oI@Oo75TC3Two6f<-FLBDQOb_+e^8f446sKE xJRY)FXo7vh^CbT=z4A#eqk1-lF~B=6~|53oZ~D2klC&Og58Qbqs( diff --git a/bin/Scene/Objects/Player.class b/bin/Scene/Objects/Player.class index 7084acf16f08cb154609d5d917384872c1d88cbf..4e844362a5c48e72bccc0e9d73f9a1438bef2061 100644 GIT binary patch delta 2336 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 diff --git a/bin/Scene/Scene$1.class b/bin/Scene/Scene$1.class index 143955a89bc0ac4e987b2b88c62668e5498af18b..89a882619d0ab9f6c6c99538a539070b00d5aafa 100644 GIT binary patch delta 41 wcmZ3@wwi52J`)oY+vGx~a4{xs1}-LE20kVM20=;TDEFfk@c22Lhv23{sP1_34+208FZL*7)+UT8SI%17@V1m8Qho* R8QhtS7`&N`Cwnpn002|w3BdpW delta 61 zcmV-D0K)&72bl-3kpcn%#FLW(j4A=h01yGm02Tqv03QL(04xE{05t*606ziJ07C)Q T07e1R07n7T080VYlSuf!S24*Jz$+gUpLQKI7Y)l~x{7j(?qD+wt5=>E(Uod+D E0Qi#$rvLx| delta 48 zcmV-00MGxi2(bvTI|Bj%?UOwNItBso00RN>lYIkO5&`u91_AZ}4*~Z86#@GI7y3)@%l5rku$cOs=d2Kvp4;B|G^%lQICtgbCOH delta 37 qcmeyw`iXUeIuj$;WDO>3R$c~XCceoTOs=d#K$b9&B|G^%lQICLUI+pJ diff --git a/bin/Scene/Scene.class b/bin/Scene/Scene.class index 665a6a8367bad4421ba260ef9acadc5305517178..1576e0be3a34d9c6fa2fc3f671f6ca323278c318 100644 GIT binary patch delta 2571 zcma)830xFa9RA+y+nwFn0dW8;(*!CjJV+D7P(g4B@Ip-#FYv%j@<`Om!o{*v3w6{q z&8y6cQekm1x4ZyF#nSFm?a)dqugdbO|C`xG)a>UjzyI~V_x+DIZlpzE zhDXK*1)9+B@aiT>w8D$PU1TW;Gq-M(;Zxjb3=glqeG7PX0}?J0g7;nSqL_^LxN8aR zPUU;SQ#uRsNW!~zM-X(@a*9zxUQG}gn-oNggqwNFQ~_)$oGl7sXhT?HtLI46Q7K2+%<3ucybLzTnR;#p`9S>fUPnrxvS(L_;%`ocZm=HvDxJ- zB0!=5RPib!N2*9&%~Oa(LAuCq3}*qMD+O_taI46b-PkT;hk`y>qo6lxgxD!#mx3&D z1iKXs5V}^uK*70(ryj{A&cVWYUqO!8wjLiS*o%D*YU@JJ8E(=urKY;YmSGii zzvw+|H|Y7cv{3De4Q=&O+pYFu{Ho$N%Ddl|bNw+KmvKVHNz7Jp3ct(vL&cvst@o2} zzU_IupyDt5EqKqUIE!-(K_;sqZ;4g$44&1O$;~6ri;$jN}~hVn{R6*60dY zO39Egm!!=IhC?S?H3681`Q(K=umCSoh;|3Jp+yTJYCQRBd$~ch57F5^ShKY@nnP== zPY-Gu>4QDnNuLTREh=!A7eRz-89=o%QBej;b!rY1*3N{*1Ymx$%VDu5%%3yvnsUZz zm*;H%Upec@LIS1vVX^wM&{-^=dW+Eahc+T>Us!8>PS`jWKQ}y%+?`=9!)8cq^@T)g zw1e5f9opSa+7T9=poM51#ViD?>U3(I%;cTTPW`pC7>te7cYbjdS0K4n^D6OPSBYl^;$1~v zA9_K9Le*7LxayH2Rj(AKR!MQ{4k^CB zafKpav6rzbEW{$ZV02&b5*Aab!dilt={7AT#{uaa!OpNsGM5D|83CMP6LRT!8fYG& z(|DTn8WVUy}nX zu+qHgv?3d*3@RdrhMn8Oi(zGuyck}F5nha31VMC`?;xOC#Grq5z+tOw(K7*DlM5R-Fi4{8%>MqU(fFD4lw@dBm5WOIFr={=-9 z?8PGuS+EyVy?E3E$z;j&)3nmY{x8jA0h(l@2?-0ZFdqu3mT4Z05@Vxg_58-Y+rLS+ cgc3|A9ZmnX<&zdaCpmsSz^}9Xx{s;<1%dHU>;M1& delta 2005 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 literal 6116 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 diff --git a/bin/base/obj/OBJLoader.class b/bin/base/obj/OBJLoader.class index 6021c6573b357e5294e59dbdb54a0b184b286f55..4ba52ad1ef9c4f7d0f5d03905f79e82bcf1aa76a 100644 GIT binary patch literal 6336 zcmb_g33yc175?wMH}hU5k1Y_w1ciVs2?3(G0D~I@BGD{h02?FfOY)KoOlIQDB!K(A z?>o4!qqw2P1dX-sR_$V|cCodsT5Dap*V@XG{`W1DnHcr^+J2dN@7{Co`R}>^Irp49 zd3Dc|PXjnW%nhOe*Xp<~i0g4f5I178d~DHhQxE~%tmBp-ZpCdHZVw`eJLKa|4R>j{ zJBX3ECx{WaS3^38F}PNC?$dF<#M-Lk0V#Yih@JeFN4dQ3`xsG2* zu(x&mQpc}!yd&{{t>HI8RO7cg-j)6LBpvVT_??aqq{Y9N!Vfk4LBmG^frBHlNa|1l zrL=5~fLa-EwFE}hL}FH5cW1MeSYY9$s4ev075`M8z8WwSOBy)F>^H%YR9kCU4wyvcTA;;l>1)6jl6g;+L}=W9s6G zPBSWyXPZ`Kwh&r%UPg5+W+f`4W-@7UPqRvo{W5IX;6`i7Q*@eCrI7_O8@D>v8fmeT zixUZxtNNO%1%e%B(pi+4;#k_zMiqA=6?<%Uaur83q|BD}wPu&ivW62itf$FQ@@lUt zP~vhKiC0ubq853~IKZAklLB1{t1Ti)XcHLeY{i?-(S#+PBrqW}vZTAM%}Q9UN82Mr z5S;>}hXUKDDy`vTZf)7d7ON{2iN}%}J`orr4P0eyOm!2*HB?EoHxs4POj!(^s5G|D z>?G+%wun4rcO46|=Ez_a7-9RY)`b$#2b-ZGW=`{lxQ#J6YR>9HIwK{pHzQM;TN#fh zS|c$+=XzqS6_e54&>4@XIvP4m&S~f2Xz5NQtXRrhgz118fP^%}yAv&z+$1T_oP@bD zat*A)YA#wr>I{5}KWg}sfj{Ff2L6h_2~7I>gCN!aPW1{6|1j_w{>iYy!Vo?w z_4ULIp-8cX;|!t7R#f;6v>{@MfZTdfE^fv}hR}pApmnCA(MWR%HM8xbp54vL8cVt( zQO2$z@D4P|6}80(#UxEk zHbjY-!kpMtyQ*ew$?DkpSbRgQM22vrPsZebdBr$saea^u+9EiWbZu z(_bGH^V;NYXHvI~^GhY!t3(;QNeL2fYcs?wQErIYVh(+tAwLtAJeGsZ);F(X%FPiu zDVlNSxud#1bKnL1$*yRG3Nwex>cb}FQG=^hF;h@i>oKF^$WI1TJQnEtIxCogG<=h(TJ2>u-t1lO!paOqq#P@|Z}fV~7!63FhPx z)LvoAl;-5F(ViKD1!EMaEN)K5qunWMg(<-TW>=RLqakyKWA;mAxTlu;(Nl3RwsKhU z3?i`xSM#!~O`c1xO~P_B*}>u{Q~Mw@u8`a3!4z1KZIerPmPwuizAU1vlU-IzchpQ& z#;vxtNK1sYkRr3QS+*+UQ6_nwvL?pf$ib9mbb!MVgb3?2m8I828 zuZWX0-gewNS!3Uo9A~;BfupjGcUf^Pr9ZMVk9&RkI((9(xiwB;s(st~hUr;Jp4QB!xaV&d5 zSw~&vYvJb~FmG0YuNO*9xjJtL)L!_PmHXXRRe8W|El~RrXq+~^NbQ5Rjatr1<86ew z&}hmS?2C!mkH0?V*()F5pkpnL=X{O!oPZO#_84x*L^Ba4q6jT)Dbz90%9ctCSmlr^}=dM&8SKTMzA}nTW36`Rg5ww(-rDfQFDx8hw89J77{yMCuBY;Z~MJL~~C7sA)hI0|46Me*5 zfjH+W=;C-j#BQ9e;Uo1POf55%VQ>kT?TkJWsFfI@I`RK*$KFkRR zyd^^c$B|*pT`ZheFgF|wY0{rz{UxzAq)RtCOMb#mh27aV6fBra*KENkx`n+^UN81L zhU2aw!349q~Jiwl?#2pUjhw`@LKqZv#WwVvGKn>-4 zNzD=XL-}5ATbUj>lIjNy12lgq(EOo5^K*d&ffft{v~VcU!l6J5bAa~jAW+x_stn~7 zEb7O>bkA41$fGagsXiRC1BX72!_s?VkKu6FvjvN#Kc!RY&t5D^?^&7S1$u8vdiQG# zi%NUxVtdpJl3px*22<A-_lXfQlT)d)QNG4cg z#9U0`-uGv{J`wrcvDZp_E!6n(SZ|JJElP^_SgSYizIdK^olI|H?cO5#aXv?N^6)Y) zz(uShSBvLa%Z^8oJ6>d8(EQwYg?&K_aQFMz7c`9=6xkOvoeX&MKFZAd%$r9}+<9bV zj)O;Drtk*Qi~!jw#HDO$}3*%W`2Y46G*Kk!v>=a!` zLZYr@9~j_PzH*kW;mn&nzGNqsd!OpP1~3->A?N_-tgt^z_TWb6ro_wAF4XclfZ|~^ iiVhdStQ&xj=R{t+uixX1yd1bKWw;r~a$OelQHpa4rW$R%_SdOeZ$(3|hTC>^} zyDQlyO`8x%h?12_zew7Z4)}L>wp$6iCuEBz>e!+ayg>0)3aJjj`2#=I&kX zDgu9B+fUkiXU@#|=gfcRoHHxEbpEL`05*&5K^(+qgZLaiUxFYWl8=Yw;|nIf7(^Cd z3gQu*l8-MN_)3r?Up4WyAij=A4Llaad^|26-!O36z!O1~V?2m5OcY1TfTHvC#K0ED%lYK|RojdllCG7zx)g(}w za?(y}%-LyYY=KZsYi-*Rd&~|eV##nzJZWckj7Fnsrk;-7z%@jxfN7`I7-3h}v?Wu6 z;rP)bgYocaCKeBmIsKVrD%`DJo1#s%y)D!l6R5t>Oj91UA>Ww#4nk zV7M!jiX{e{YA+0;$H|K%Lv5r`nFJm?euKcG-nqsEmlV?0Bc)Zl}`@si>|3&l5Q1>$U|Y*wV+^* z3=M&K%4h94D4yGyW@wg~tGyv^qpV2HU0q0LWCSkZ$&}_cCzGjxSc1^So>=50WbAbf zCzF|>t|6Oq1{tdTqp6gW$asq|IWZrRkgnuts^5{DB<1d> zV6loLo`hn5(*@puwBL1sR4J7Yi~A|YwZuFzpDVAj!~(I<5@n*?!XSnWvB(k^iG@7= zV+l)CNb&U;vczK9IwmSDq%dlUCFl{TEXK@x%@QF|C14C^;_+BtH7O~yje4qEkPCK< z#^OBAmRKq-w!|f3z9p84<(8;si{`Ho0O1nOQ6g4bVx?GRh}D)@Bi1sBbfhU-C*7d! zwb`r@wX!Ltb#8Nj&3f4k4BI2`**n1DeI3_$cI2X}H8C=pVP13WVMDC9#0Ig^5@B(v zA>Lt$2C<1rySM$?w!_s264xb?M-$cZR7a`}vDp%rNfV9HwBy=$x!5B4L14zPeQ(8~JBNyaItKLY;rNIXXHb#oPkIrI5~8OszB z`5Lq1qfRH&+nTvh3bMCSAP>Q)tbyH9jeOM9vOEN8T3T9U87`Z_Z%t&JL75y)l{(nv z=H^<0`Q51LZS8H90DiU<(CpmIu|+d7H?o@KOq09}xVi13np~wWIMg&a;9NgyOAd>c zcRkZoE33(%laU2hmL0m(Ls6x>Etbv@W4_v0Uc!yr13bY&YUT@*$&M^##2_ui_4mh< zX_6F7XY5oaeK3|8nq`Dn!8v&zwfEUFBf67BzORy>19ti{#585Vnv+g68tadd7E)vn_sLdsGR_*oh?Li;`7={p>AZnh zG|DXC%~~rXidk#GKAH%p&%=;U~i%EIaXXt>5qaemAiet z9X?4iawSq=rMj$LV0u9U={layIJ`q>PKrCO$eXZ_SHE1MBz``Z6o|R%h@2FcIhno` zSX;QKx1+y;({oJB6m^~fKjU1+Tm|oAbB(W5aopSbmKO;Xu>HwI#*QV3x3tip<{>-P z#ZYw;yba3msZ2YWqD#Xrb&ud_*J}>dc4Gy<*c{}SFTiAB;?021L+pk5X03w1ZUW*l zHhk#iGoXa^_#L(_cLEOM-RuSN9=w;5BIT+{_#U0594=C}(WjLAF_2SkhOU4^fu{pK zTHR@A`+Ic0^!+`4zWn=V18yn+48cKE0rCcr1H1=*{s0Yi<$-Y+ZS{J?B+PM??5g+Y zS}pZ~T&q!^La=A`no4~Fr86rnRtQ^Qppjn!ufS47_=T)Vt-RSqM+`@}iotJv*CEce z%SbM7S7dG}D&-Xm8gP7UBo>!F)nAaK7^SYiOuj~q@ zFu!L*h(1~HsA^7Np>&R>4rLw51g_!Mca!o~x@8Zp!d~n|8xHWxa1$XPT`3c zTXX!}J%zHKDU|mxY!*%M%kdN{dM2>Ay?z{(Jsr;@xj_-AHAouDmy9EH5`paW&)KO` zor~6wW9f!TT>K<1@!?<=5e_ZO4=v|VwKue!Lo3u!1+`Z4vx>v3bHmejaM3mEXL#C% z1>8e77Bb>_>m^r*cvyRJ8Chv$81G;pcQK3)GmsOo$x0tikiFY^oxYQYRR+C0?Dd@U zLGmQIyPK?ji0_4b-h`XU-4gQkVSI$dEaUN!e7f9KA#e^$4BTSiqvx>PzzP0VRs9A_ zedHY~>Te^dw|k@-zhckgz=^jabqZ@q?z#>|ZbW}xKkRZ^qd0w?o!W8Kob*+(B|~3t zi1?>aM+enYZ++c3HjHEAIKuK6heLio#&PKc-Vq6SONIijBO^v`u}DdILnIh7q(39( z^Ws#5Sl&R_+>Zrx%jQrpR5Fgs4stwaNHC9=ojy(R{2t+rfso(hy3q*vJ(?R$qAitWq%u%xRGKU#xrjX1Lzq4PJHX|00-6Ne zs{pUOpoO%G>8M>cgiik%ALY#u_Tce&G|{4Td!C?FR_89owFdOnr{e*C`9 zh`}}Yox~L(L(8K{`k3+!JrCzeX7F5zLeq%Gk6-JINM2V-G;;v=1Qo% zQr3=8AY_J&4HMX(W8my_-1j>r181LPt7{zB-p^c-g|1!hUthtja3Fj3!Qxyhx>;Gk z3bBwSehIT>HUE54$CAF8e^l6l3=8lmtIrtHtQ|MAy4=Bfau+k>XIMwFct1|Dc${XY zJHt%+5_9K|m_2{WnXlo)!iSFt3%7_0d{nH(39$vYiru(P9Kh}3-MB*}@iFlMd|cd# zJH-RIOJs4kn8ZEeMSMd17@ris#J%Dy?(@yVN#8Qu>syCU`F7#~-#$F(JAlvn`tUj5 zaeUtQAw1-}4G;V7!xwxHW z2|mWk;zwHi3?C&*77l1-auUbwTrU z-(ht@3vl$gKj3V$q TI6nRdqk?fH{{vEidrU?8xMs4S3P^>pPAo$Roz`xU0q#W-E+9+ z#hUo8qmMlSV1Vi4N*7m3TEGL9zh{_IiWtfMl9c8%M9HB5$VU#CT zGCGSs@e?|ztuY?^N9*8N)g0$abqH8}s~SF0VZ6cwg^4%p>k_XC%cQW>dNNt2xN?$* z!8%Dorh0^FQ8`(rsqA!xQxr~Bn4vIJCz$2QY?-5z{#^Th;Z&6X%FX4pmsAq2n4}I& zRCv-EMMrh?G=+H)#FxqG&WXiU@MOL$aH?;~a0_(-XDHM;)x%apxig*TDCay&5ocuW z?meopNa2^xldEAx7OT~>6wZ#wIdZNiOJu1wm#KkYd2*io+8Lt`()05@Za{pw4zE!7 zjV|H>75uGoD-~8nIm&m0aR>|+w`tKuhnXK{Ta=F5jE9I)FTrJlq ztaasDSFZE0Qm*&p23e;n36;Lllbd9{!YpS@d|AesKd9|L>f{>~HhOZi+@c=bsylOA zST=>__ORTcgLi6v+@;)~T)ErB_0mln_qeiIH|<_++~>;u9@b|@9?+f#6&`X%?B2ac zxrY`09GO6TMA=6bk_z<-Tbz-NG2N=olryTshK_US+quA^%7` z{)+jPi}o$U%YgQkG~-0%e%VJ244=yd%nD{_CAmgeK`m=KT^wwRN!M@KG8-IAugZl z;AblKANkyuFQ|$JBwhK^m#^e&U%ruVeeBR!J+ANsfdhwq`A!Gk)x~@-Klt*aeC`U( z{v^4Ky)Q@Qm~TKQ@GN$^MtozaWkQ_QIP5lACfi?XTod;39lrPRBp&vqqk7hcZkmX1 zJQa&dp&)wh{KZQutCuWVyrj-Iz7)Eqjc;;HTMCsb%1(k_8UdP0H{=hc-)$d)V!pEabrk-uOW!Gbipdhg~RN(nIKs{_l zDzU6h@x-UGQ}>GSjKXsY&nvv3@S?&lg}*B7R@kHPlETXh|5TU$jeYg6wYlBYU)JvC zES~5GS>#Glgop4j1b=4B;1Raz5BVa{A4};4X+*P=a@(!kV{CK3Z9jL}Qf{=R+-pm@ zGnPJOX&77u+hJV@5GTXM*beTrrCgV#T$-g^ouyo$rCg(>T&AU5sij=3rChJ2Tr#PL zSM0xNW*5^+)UeM1WBRQz)}_jOIZ^vWm&M4 zduu7voHWL$u|N>tXX_{&ev!DfV0rulwg;gN@jUjO0Uve9!jI2{*aJ}#nE93N7vlv?xoJBW|Ki;J3v@G+@!pU?-f+^6IWJ|iE%9HWtti~oo~ za$J1wa3jCKmlSwEv8gb>le&~`6)$bv>aQsAHNH{z6MGButf)gd}j(dg)D_^pH9q~slzG! zJn?47qKIvU*;-dz6t|5C8!FOxatQc$<)q+fj%+a6Ilr1@5B8-ITwVTK8ZWHe(d-LpAQlBs>tuG#28yEWe9c zJeITQUc$0_IZOXFEW0mkYuzinEBEpmc$LNe zHGW^`?ehlq^CJ3?CG1nSzGd-0f;Yv*TXgts>5O-z6#HcW;_u2x9FQ8kCo}NAEWih{ z1P5g~K9cM3v8=}@@-RM=t*jV(@P)jJFXc0QZG3!V@^IKx;yW`K-ch$W2BFvjH|e$vul;*Hg*(oAI)JjO_}CM`g&7NwyuEJ`j5mbfAg-?_XqGlvxe zNwt!>nN#>ESz~L9r)DXbEg?IhpAl=EM%ZgjB!24DIX<^V%@z*HrkV?1!pN0KEA_l) zb*IS#xtpud@^duf0c%Ap2r<*sIL-1AJu>r>I6Z~=8{ykp(t9%^mRS(1l2}~jr&Hc0 z*#Bf`t;z(F#KJVruvXdBLX>G3JKZUEfV?nM!%YptMx?3XXbv|uvV*#2uYwKgmSLr_ zZjo7#DC<%jpJ9bVvA~o!O~#tjTZ3iO8>gXwG4>g(wtUXV(24oeQ*u!$`4}jL7%d$z zONy|FZ?N;F3sy@B)=F1wl;f~jx*;h&&>%hWjP$}TsbK!~!6B){Vd;yXB;LO{Q}kxc z++MSAk7O~eg%9o$?$b_gv)*1&IF(sP!2c_5784}gv^`9oOoA{bXVUvcEnA(V+a?1M zl0k4~aI0+&+sUFFm5A_v6)(4`C57={29ttGEU~?Dbb6q{Ul%{YFtL(XD zNu0eMOAIp1Qp3|Zy4~P{3JBLtC-7 zboLg^rR4mrn5+C+=XCbAY*rB;abTToYo?(Wt8;~!jv?k$j5RY_IW(>@(=_TK$Pf$< zOL3EHa#U^bfUIlR&R*`bVEJXH6SrN8jbqfaAQ4gYQTE-{~>W(x5An~+5+eE z2IVh{KiG0EL_(;KYoiH=3Q*9ky@o&n|s;Q zJjZRew`t}k*-g#8tz~a-w$R$kJHmSVs|D+1bXtMVH`~<}+-b+O-wEzYTu0w%uSu>& z?Cus5_vms6%_cSn_ttB6URIC$g8S>iTwPO-2XxaiZ{<0x06;lktQ82*4<+c&lQR@m zyhdkWIF@1ruH@rk6MMFvfYJQFHZLm?-m5Bdd6*R^v2T!((`4Gen8A*8bL22b4tJ!)#Y58Fl^)VFjK$JRp;Vzvp|>M_TtuX=EB&OuBLiHt zQR#j%Ff4C; z=g9FchUs!^04Y`C$aU4vx8$7(HKs9tHK6de51l9S8kKvs|B}f0PYCMoguj^BzNoJ zJ(>`kmD}RTy)M>BcWvC~$o(3d2ek2^BM-T_B{T8|?Ri+?k>IFZyLOYSk%YFB3R@K( zRY)mpQ%DC#H~MtDHXjR)>9lUWat*<;FJzqkcyQ9V8te8a9CfA<(11Y$`z=~HPY|e?GRcvTJ=rgxtci4t?L^v> zPj!P&dGeY3&6Cen_Y3*ECtuFAkGhC`h_Q)s$4rpPm0O);bInQm&#Vdn7oC~wfj z64Tw0r#;g{RePFVo+&kDj_K{0K5ATFT4VaDN$+5b%u*Uf8rCeOT!WQ+oNdP6_A~01GVqo%_LeeI zmNG?2L*S+?<-ULzJGeL7!N6O}ZCc8mTFT8@%Kci(EnCW6Tgr`F%Dr34?ORF@kh=Jb zUD(BIjr8?K`UYuC1$efsAdjAp=lwM=KAb!f$Aq4r0`11UvvCr5Zf*j&P_RWEZxyZ#SD8#8K!Pyvq#TbrrQH%3% z63(Z@GD<8*Jyzgv)GDLaTz)>s7vQyt)A4tFNvhmev_UNQ4{`=yllNhM;UobE--tkB z4*nTrAiu={3aD{~Rs{$q&_%Z(P!qFl??sKF|Bf2p;~@Jo8io>9qv%1>)*6>k@`wK= z*)=1X*E0DkMuRm^Cyh&|F0Dqc<|I7$c4Tm;66-TxJ&5aws}aHV^zaSVA04=jAll+5 z>-Pv#OmmPW2S3yA*5JSadYQg5mj~16;rB|TG+My~FH56$5`Ciil1AS&`nAbL|6B}g z(>51_(L#}`LQAXk!cLA+Kfi(=&`ej?;II+jGX9oNer_Ky2WGQ5OG-vh<9ZumSr6EV9JPPrX#ZQY! zs8J;R|3$)$BCZvQa29^D{F6CNWNNH&DOZIaVakvmH^*4LH?Rub&g#8|_4`3yDJh1qfz|t2*6*EooVUp?ULm`AWxR?vcwOve zq1?wJ`6*s!_1MF5@Fq{tTVn9GSEn*cgEMg9A6h{IKOmd$#g3wjx`#$`mZGF2k}N|&NoU5lD6H=Hn=Hh5gJy#!jR=QgWn zHx(JVo4e40d?;f9D@@c6@MNSh$MRu4VsjHXC52Ph!?P8rbTh)1IW1Zt(U{6lqrA|!C?0rYgDN^%ceL^Mm`fgo6ZXJYd{2D#6u6}QGdSI%Ed>ev`4Mv zVxHt-iFCqBDZsVT8SDAb+{}kvLb{?sim^iu!%NbW`PPf+REmRAhMy(Yr#VyfD$QJX zwYWzd-uc28PqBo^Wv;sjg8j38!gY>>vzQ@nQ+Rl%W)g%xIfK^EZwYl94V&~wfZ6WI zz*b=n*~R#55Q%V0ncHs*~ATfU&BvNU`Yx~tLTGss}ndcg=Hx$ zpVD_b&KFjuA!Jqv-|`m>4|WPZgA3OqR@{ki11ep_%v}ecm#Atk>74>g-^$IuJfFbD zDO|#6OiCMyGv$Q1*V|*WG zl3w&nP~*hc&@!EPJadf)x~@JK-EQ23z76naZbN(jx)k!*zdD8MQ^@D4Wr0Vrx@;yz zDLMC1)G5C@IETG0!75;#ge*f_S&m+EJ~M6w>W0aM7$+CCScLJ72I&Jc02zjm6g62U zhjb3kvZh@-`#!j#0c&VdJc%0{uy$r767ja-rX+4|z%A@w7hiOE$JqM+arq{3Yo-!b z>)lSsQsBkS`z|xEQ3nWF3fUY@qP}?|y`uTC@|$e0Ufg>9H}&4u+#4TU;`eNN9W)K! z{;R1nZ-yl9h*y;4#qJC>y(g?;8I_ri+IE*6((a&tck^nQv3u;8+VNj%n_FhwqB|nc z^o-iQ{(VVJ&?}O--+v&9E0;1^lXy@AmwA29LI?7_`1~#9lfN&D(T}HR2r6(Srei2y z4#RL2M(~|6lFx)ud<=}?1E7M>?@AWxaV)swdC53Bq7=ZETeaR7vlJt!1XR?SUHS`X+1924+A@OaYEmgL^ASxl0YY@lT&C-`p5*XDB|5Sd1jhSYDV&mZ>zE$%-F2GnYF{g_Zi*XduQ~gZyg9n+UEx Rvr~tP#yMz`KQ|rB$OCQME#?3K delta 178 zcmWNGy=uY$7y$44lt>n9p^my|>LM0&@D1u4h)*Fxz^FBgw*GfBXi*0-iWmxZ>;rTv zxVpN!W-{D#cV5~{9}0%lgQ8JW$L4_s85}H{Wx{T=I@y>=1zUlMJ zfIo(uqjO=*l?gYdgnUYjnHYGIVlFQ%q{5fDEX8Lf|Ewisqp;ODdrf5V)nup1NFF)r R6M0OJ4}0OSBO0OkNU z0O0Pg^G0Pz5M0Q3NS0P+BS0P_HY0QHl{ F1c5BZAXoqZ delta 99 zcmV-p0G$8G3djnup#uTglcEFEQQQCn0Nnrv0Nwxz0N?-*0O0@=0O9}|0OJ5N0ObHT z0O$ZZ0OkNZ0OtTf0O|u9c@6-Gd$+aBZg5C5fq6uAte;iTv!wY7Zh;|w_M95LEAvHrpU@{6Gu$Z zEX%?L6K855$8fJSvqjTf%aRt$%69z>JNL2VmwfP_?Z5Awd+#}y12Gq)T?gv6)c{Du zWgDzmqM$^_SS;1x*04;61*OWl+>*vL9WP*o@~yOCG|H5=O2KLcFDl*|4KGi;f`<`NvS&GG+Z)=SabNIGsGaUouv^0(9Yay767AKnPe(4^RbPHj!}~f$ zs(SXT+$;~MZLs{nyN?zK%R#2QGc03*9>Bc@?om*PB6o!)BB2l;8n_d8X*guyBYbS& z6BHTv6cY>_#t{RbDf6g;S-6`J=?<5Xx>|qCz~?ybjOH6CQ$s3%|n9%9Rehv8xmFSc&sjR*lC z9t8W)#{dtvh8>15!g|)c>fv8>rjNvm3D$LY7F^dbtU?a=Sb%kMdkg@GVncQk)mZLx!TJd>L903tein{vVc0vLW-Bglpq&T7g<7yaxHa}>#2v_L`kxO zy30z|z0^x?r#|u^CCkHJrK@>rv$W&_1| z3~-5Jnu3LVbR-tjSUka+z>|FZ?a}NXQL14P|Hd^>C9C=iNhMpPvx9TGhNra23LJr0 zjHl}d4-w`_@(b>PsN`>uy3WR-W#%*2F!=9CvrSLILM}-C@KlcEQ5)q&Xp`2; zkJ0SA-HTw!lhV+Z^#hY$FEaheW6BsWM3YA9MKO!Z<$c=Nh~oFC9hxH=ZEz!F3_9W_ lZnpN^ZZ~sVb>t$RW1hhC7{@Z4TQ!9xxYVQu$^R*p{V$)CthoRH delta 2202 zcmZux2|!d;6g~I9H+=Yf1jYq4T)>6gKm<{78$m!66nAhJ($L(sGNH!QO06s#BO$ZR zB-_Lp19D1DvBklQKPCQNys= zVAfNC*kYgpPpj}&MSRAR6gQi=NkK76TpMImTru7^ zF$*{7_`t-6IAr1@l$iJ!1tvbhrzQ?7^N50ZnD06!V*-ounTezL+-2IjwEx1ym-x!W zY|Jt7HIC^xZsHr9FfmtozQqYb2Un=At!tUhCceW-*D6~=d@;T^aY`lq0jEuzQQD6R zenJT$c+Rw$bK`Ru+9jI!8E0K5Z7t(|!LKG3W08*EOq^4n{f_e{Zp0!J3s7WYq0;_P zh5v~HS7JbPzy(|+M7ku@E%JG!%eP$d-od*q-iZ&p-=Y zkD|-*nS2|3RLl)h`?VzR(vo~QEDcqOCAk<&a>175GA+r6&-s?bu%Y1={(!GUIefN_ zb-o(LTU`r`W{J14KY%T8DNaVy(rs9V+t~`ja;#8XCN1Xnl-x9HJUfj<%^7TOSq*y? zT8(pqya>y;Cj|TZH02Anck}o8c=qo8&MU+=S0}W0wS53u3DR^N<xu(!4+ zyUv=8DcNNUiE;K+OGo*Z@uF9LHF{@zk;1Z1ju(CNJ6EG$75dj;Ksja9z~M${6$ZMY zS0RW)|WXA**F?nf0Dz3gRR0FSD@Jyr+v83>xQ)iVlKyWFUP{`Hh3^1oSa1- zj0_95mTly>U8{mPH*&bh@=LtSQTgFPQ^RFtHAdH9O#NnZD(cP*>sp0z6?G?k)ViY< zHNX)r_?G@f-Rq<7w9YPXJ2aUrojEcWW92ltL>BXK5#a8l0_1V0b>SJ?6-^O`YY>li z=!Q;6U`$3TdLxskVJ`ac4C;%?=*KUyKkk47sU5^@?KtLW=P^$hm@ismiHOBv5s!-^1$DxKOCpURvWUcR(!@k+Bnl~1 z%%E^Fm+WFWIh%+z)KqMu2(g7C#SUsNyc8vBsiinf(c(0<7w4#h45W^-5p|MHsH=>k zI2lXbWLHX%$&@HFC`sl}Pnko2FPWsub@o1 znzF37o#cc~j^IbUk`GVFk_JsZYTSvt01-=tScTOf5l<7ahBXa$^YwH<R?L|87)e97a1!67ks~;GMvPKCfcSEb>90aG|v|;M~|3{^Isvi@9 zSXV!>ILS&bNd54u&F7~$-h*bBwdP(-VBbU!LIuAhU)$C{sKH7s^kAqLlbAEv1D+;6 zjka?_Qq9Qw3}S4}W3vsKAR4U@!@q6O(Q3)|=!sZvxof$I2bib9g{drCa4V;=1ecoP IlfCNYKXc~NGXMYp diff --git a/bin/main/ShaderLoader.class b/bin/main/ShaderLoader.class index 531a349575d8a2960786fa4606937082fc7d74a7..8e2065e230296a28a49ae7880b4574943edcba00 100644 GIT binary patch delta 315 zcmWNHO)CQc9EYF3msnb94ho}eth{7snMKR;(!4A)Y?}9y;vkY*WG-A3<+2M&inPnx zQgTts!3Xdi+{)kvPQLARkoW!h_X>&1S_2LFbt%))7GHyO5tW%v|T|i$@T}WM69FdR8 z$HZ~@gnWuwOB1(E=4_jU?K5u~7VV6rdCp1MHA|KwZFel&BP;gIs^wX;Z`SRHjZ&2} FZ~s4tIBfs` delta 315 zcmWNHO)CQc9EYEumsnb94hmCjEKQ8O%uC*hdEM4n<}D?~K_s=vT(~I8WfzhZX_vL7 z=58ykv`vU%#Ur*2P$+>gx?2)6`O$D|2W5;ems*WP+DZ_&cFV!^IHsYg+5Po7b zvqc9xbg@Sd2Xu2tkfiYmEu7NI1pzK;HwH|8D++ zK0Z_Q^Thza4DrXX3Ykp#1^v$|{*vOYS GGx`S-05~E5 diff --git a/res/shaders/invert.fsh b/res/shaders/invert.fsh new file mode 100644 index 0000000..356b3dc --- /dev/null +++ b/res/shaders/invert.fsh @@ -0,0 +1,14 @@ +#version 110 + +uniform sampler2D DiffuseSampler; + +varying vec2 texCoord; + +uniform float InverseAmount; + +void main(){ + vec4 diffuseColor = texture2D(DiffuseSampler, texCoord); + vec4 invertColor = 1.0 - diffuseColor; + vec4 outColor = mix(diffuseColor, invertColor, InverseAmount); + gl_FragColor = vec4(outColor.rgb, 1.0); +} diff --git a/res/shaders/invert.vsh b/res/shaders/invert.vsh new file mode 100644 index 0000000..2fe497c --- /dev/null +++ b/res/shaders/invert.vsh @@ -0,0 +1,20 @@ +#version 110 + +attribute vec4 Position; + +uniform mat4 ProjMat; +uniform vec2 InSize; +uniform vec2 OutSize; + +varying vec2 texCoord; + +void main(){ + vec4 outPos = ProjMat * vec4(Position.xy, 0.0, 1.0); + gl_Position = vec4(outPos.xy, 0.2, 1.0); + + vec2 sizeRatio = OutSize / InSize; + texCoord = Position.xy / OutSize; + texCoord.x = texCoord.x * sizeRatio.x; + texCoord.y = texCoord.y * sizeRatio.y; + texCoord.y = sizeRatio.y - texCoord.y; +} diff --git a/src/Scene/Objects/Copyleft.java b/src/Scene/Objects/Copyleft.java index 3f1a3b1..2aa2012 100644 --- a/src/Scene/Objects/Copyleft.java +++ b/src/Scene/Objects/Copyleft.java @@ -4,14 +4,15 @@ import Scene.base.SceneObject; import base.GraphicsObjects.Point4f; import base.GraphicsObjects.Vector4f; import base.objects3D.DisplayListTexCube; +import main.Engine; import org.lwjgl.opengl.GL11; import org.newdawn.slick.Color; import org.newdawn.slick.opengl.Texture; import java.util.HashMap; -import static org.lwjgl.opengl.GL11.GL_NEAREST; -import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; /** * @Author: WangYuyang @@ -46,11 +47,13 @@ public class Copyleft extends SceneObject { Color.white.bind(); //bind texture getTextures().get("copyleft").bind(); +// glBindTexture(GL_TEXTURE_2D, Engine.shadowTexture); ; // GL11.glDisable(GL11.GL_LIGHTING); // switch lighting off GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL_NEAREST); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); cube.DrawTexCube(); +// glBindTexture(GL_TEXTURE_2D, 0); // GL11.glEnable(GL11.GL_LIGHTING); // switch lighting off ; diff --git a/src/Scene/Objects/NPC2.java b/src/Scene/Objects/NPC2.java new file mode 100644 index 0000000..a4fcbcd --- /dev/null +++ b/src/Scene/Objects/NPC2.java @@ -0,0 +1,705 @@ +package Scene.Objects; + +import Scene.base.SceneObject; +import base.GraphicsObjects.Point4f; +import base.GraphicsObjects.Utils; +import base.GraphicsObjects.Vector4f; +import base.objects3D.DisplayListCylinder; +import base.objects3D.DisplayListOval; +import base.objects3D.DisplayListTexSphere; +import main.Engine; +import org.lwjgl.opengl.GL11; +import org.newdawn.slick.Color; +import org.newdawn.slick.opengl.Texture; + +import java.util.HashMap; +import java.util.Random; + +import static org.lwjgl.opengl.GL11.GL_NEAREST; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER; + +/** + * @Author: WangYuyang + * @Date: 2021/11/6-19:33 + * @Project: Assignment3 + * @Package: Scene.Objects + * @Description: + **/ +public class NPC2 extends SceneObject { + public static int angle_target = 0; + public static int angle = 0; + // basic colours + static float black[] = {0.0f, 0.0f, 0.0f, 1.0f}; + static float white[] = {1.0f, 1.0f, 1.0f, 1.0f}; + static float grey[] = {0.5f, 0.5f, 0.5f, 1.0f}; + static float spot[] = {0.1f, 0.1f, 0.1f, 0.5f}; + // primary colours + static float red[] = {1.0f, 0.0f, 0.0f, 1.0f}; + static float green[] = {0.0f, 1.0f, 0.0f, 1.0f}; + static float blue[] = {0.0f, 0.0f, 1.0f, 1.0f}; + // secondary colours + static float yellow[] = {1.0f, 1.0f, 0.0f, 1.0f}; + static float magenta[] = {1.0f, 0.0f, 1.0f, 1.0f}; + static float cyan[] = {0.0f, 1.0f, 1.0f, 1.0f}; + // other colours + static float orange[] = {1.0f, 0.5f, 0.0f, 1.0f, 1.0f}; + static float brown[] = {0.5f, 0.25f, 0.0f, 1.0f, 1.0f}; + static float dkgreen[] = {0.0f, 0.5f, 0.0f, 1.0f, 1.0f}; + static float pink[] = {1.0f, 0.6f, 0.6f, 1.0f, 1.0f}; + DisplayListTexSphere s1 = new DisplayListTexSphere(0.5f, 32, 32, getTextures().get("warped_door_bottom")); + DisplayListTexSphere s2 = new DisplayListTexSphere(0.5f, 32, 32, getTextures().get("warped_door_bottom")); + DisplayListTexSphere s3 = new DisplayListTexSphere(0.25f, 32, 32, getTextures().get("default_stone")); + DisplayListTexSphere s4 = new DisplayListTexSphere(0.2f, 32, 32, getTextures().get("default_stone")); + DisplayListTexSphere s5 = new DisplayListTexSphere(0.2f, 32, 32, getTextures().get("default_stone")); + DisplayListTexSphere s6 = new DisplayListTexSphere(0.25f, 32, 32, getTextures().get("default_stone")); + DisplayListTexSphere s7 = new DisplayListTexSphere(0.2f, 32, 32, getTextures().get("default_stone")); + DisplayListTexSphere s8 = new DisplayListTexSphere(0.2f, 32, 32, getTextures().get("default_stone")); + DisplayListTexSphere s9 = new DisplayListTexSphere(0.25f, 32, 32, getTextures().get("default_cobble")); + DisplayListTexSphere s10 = new DisplayListTexSphere(0.25f, 32, 32, getTextures().get("default_cobble")); + DisplayListTexSphere s11 = new DisplayListTexSphere(0.3f, 32, 32, getTextures().get("default_cobble")); + DisplayListTexSphere s12 = new DisplayListTexSphere(0.25f, 32, 32, getTextures().get("default_cobble")); + DisplayListTexSphere s13 = new DisplayListTexSphere(0.25f, 32, 32, getTextures().get("default_cobble")); + DisplayListTexSphere s14 = new DisplayListTexSphere(0.3f, 32, 32, getTextures().get("default_cobble")); + DisplayListTexSphere s15 = new DisplayListTexSphere(0.5f, 32, 32, getTextures().get("awesomeface")); + DisplayListCylinder c1 = new DisplayListCylinder(0.15f, 0.7f, 32); + DisplayListCylinder c2 = new DisplayListCylinder(0.15f, 0.7f, 32); + DisplayListCylinder c3 = new DisplayListCylinder(0.1f, 0.7f, 32); + DisplayListCylinder c4 = new DisplayListCylinder(0.15f, 0.7f, 32); + DisplayListCylinder c5 = new DisplayListCylinder(0.1f, 0.7f, 32); + DisplayListCylinder c6 = new DisplayListCylinder(0.15f, 0.7f, 32); + DisplayListCylinder c7 = new DisplayListCylinder(0.15f, 0.7f, 32); + DisplayListCylinder c8 = new DisplayListCylinder(0.15f, 0.7f, 32); + DisplayListCylinder c9 = new DisplayListCylinder(0.15f, 0.7f, 32); + DisplayListOval shadow = new DisplayListOval(3f, 32); + Random random = new Random(); + private float delta; + private Boolean isWalking = false; + private long walkStartTime; + private int stopCount = 0; + private Boolean isJumping = false; + private float jump_height = 0f; + private float timePassed = Engine.getTimePassed(); + + public NPC2(Point4f origin, Point4f position, Vector4f scale) { + super(origin, position, scale); + } + + public NPC2(Point4f origin, Point4f position, Vector4f scale, HashMap textures) { + super(origin, position, scale, textures); + } + + public void walk() { + stopCount = 0; + if (isWalking == false) { + isWalking = true; + walkStartTime = Engine.getTimePassed(); +// System.out.println(walkStartTime); + } + if (isWalking) { + this.delta = (Engine.getTimePassed() - walkStartTime) / 10000f; + } + } + + public void jump(int speed) { + float g = 9.8f; + if (!isJumping) { + isJumping = true; + long start_time = System.currentTimeMillis(); + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + double h = 0; + long t = 0; + while (h >= 0) { + long start = System.currentTimeMillis(); + long current_time = System.currentTimeMillis(); + t = (current_time - start_time) / 10; + h = (speed * t - 0.5 * g * t * t) / 10000; + jump_height = (float) h; + setShadowOffset(new Vector4f( + -jump_height * 90, + 0, + -jump_height * 90, + 0 + )); + long end = System.currentTimeMillis(); + while (end - start < 16) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + end = System.currentTimeMillis(); + } + } + jump_height = 0; + isJumping = false; + + } + }); + thread.start(); + } + + } + + public void stop() { + if (stopCount > 5) { + isWalking = false; + this.delta = 0; + stopCount = 0; + } + stopCount++; + } + + public void setAngle(float angle) { + this.angle_target = (int) angle; + } + + @Override + public void draw(Integer frame_delta) { + timePassed = Engine.getTimePassed() / 10000.0f; + float speed = frame_delta / 160f; +// System.out.println(speed); +// walk(); +// if((int) (timePassed % 4) == 0){ +// move(new Vector4f(speed,0,0,0)); +// angle_target = 90; +// +// } +// if((int) (timePassed % 4) == 1){ +// move(new Vector4f(0,0,-speed,0)); +// angle_target = 90 + 90; +// } +// if((int) (timePassed % 4) == 2){ +// move(new Vector4f(-speed,0,0,0)); +// angle_target = 90 + 90 + 90; +// } +// if((int) (timePassed % 4) == 3){ +// move(new Vector4f(0,0,speed,0)); +// angle_target = 90 + 90 + 90 + 90; +// } + GL11.glTranslatef(0, jump_height, 0); + Boolean GoodAnimation = true; + + float theta_face = (float) (delta * 2 * Math.PI); +// float angle = -(float) (180 * (theta_face) / Math.PI); +// System.out.println(angle); +// + GL11.glRotatef(angle + 180, 0, 1, 0); + + float theta = (float) (delta * 2 * Math.PI) * 8; + //a variable for anim sync + float LimbRotation; + LimbRotation = (float) Math.sin(theta) * 60; + + float Rotation = (float) Math.toDegrees(Math.sin(Engine.getTimePassed() / 200f) * Math.PI); + if (random.nextDouble() > 0.8) { + jump((int) (random.nextDouble() * 800)); + } + + +// //a sphere for drawing +// Sphere sphere = new Sphere(); +// //a sphere with texture +// TexSphere texSphere = new TexSphere(); +// //a cylinder for drawing +// Cylinder cylinder = new Cylinder(); + + //Start to draw + GL11.glPushMatrix(); + { + // move to pelvis + GL11.glTranslatef(0.0f, 0.5f, 0.0f); + //set up TEXTURE + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + //bind a color texture + Color.white.bind(); + + getTextures().get("warped_door_bottom").bind(); + //Enable TEXTURE + + //set texture Parameters + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL_NEAREST); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + s1.DrawTexSphere(); + + //Draw finish Disable TEXTURE + + +// sphere.DrawSphere(0.5f, 32, 32); // pelvis sphere + + // chest + GL11.glColor3f(green[0], green[1], green[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(green)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.5f, 0.0f); // move to chest + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); //bind color + //bind texture + getTextures().get("warped_door_bottom").bind(); //set texture + //Enable TEXTURE + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL_NEAREST); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + s2.DrawTexSphere(); + ; //disable texture + + +// sphere.DrawSphere(0.5f, 32, 32);// chest sphere +// GL11.glRotatef((float) (Rotation * 0.1), 0.0f, 0.0f, 1.0f); +// System.out.println((Rotation)); +// GL11.glRotatef((float) (LimbRotation * 3), 1f, 1f, 0f); + + // neck + GL11.glColor3f(orange[0], orange[1], orange[2]); //set color + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(orange)); //set material render mode + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.0f); + GL11.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); + // GL11.glRotatef(45.0f,0.0f,1.0f,0.0f); + + c1.DrawCylinder(); + + // head + GL11.glColor3f(red[0], red[1], red[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(red)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 1.0f); + + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("awesomeface").bind(); //set texture + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GL11.glRotatef((float) (Rotation * 0.1), 0.0f, 0.0f, 0.0f); + s15.DrawTexSphere(); + ; + + +// sphere.DrawSphere(0.5f, 32, 32); + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + + + // left shoulder + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glRotatef((float) (LimbRotation * 0.5), 0f, 1f, 0f); + + GL11.glTranslatef(0.5f, 0.4f, 0.0f); + //set texture Parameter + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_stone").bind(); //set texture + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s3.DrawTexSphere(); +// sphere.DrawSphere(0.25f, 32, 32); + + + // left arm + GL11.glColor3f(orange[0], orange[1], orange[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(orange)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.0f); + GL11.glRotatef(20, 0f, 0f, 1f); + GL11.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + + GL11.glRotatef((float) (-Rotation * 0.2), 1.0f, 0.0f, 0.0f); + // GL11.glRotatef(27.5f,0.0f,1.0f,0.0f); + + c2.DrawCylinder(); + + + // left elbow + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glRotatef((float) (LimbRotation * -0.5), 0f, 0f, 1f); + GL11.glTranslatef(0.0f, 0.0f, 0.75f); + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_stone").bind(); + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s4.DrawTexSphere(); + ; +// sphere.DrawSphere(0.2f, 32, 32); + + //left forearm + GL11.glColor3f(orange[0], orange[1], orange[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(orange)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.0f); + GL11.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + // GL11.glRotatef(90.0f,0.0f,1.0f,0.0f); + GL11.glRotatef((float) (Rotation * 0.2), 0.0f, 1.0f, 0.0f); + c3.DrawCylinder(); + + // left hand + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.75f); + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_stone").bind(); + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s5.DrawTexSphere(); + ; +// sphere.DrawSphere(0.2f, 32, 32); + + + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + + + // to chest + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glRotatef((float) (LimbRotation * 0.5), 0f, 1f, 0f); + + GL11.glTranslatef(-0.5f, 0.4f, 0.0f); // move to right arm + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_stone").bind(); + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s6.DrawTexSphere(); + ; +// sphere.DrawSphere(0.25f, 32, 32); + + + // right arm + GL11.glColor3f(orange[0], orange[1], orange[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(orange)); + GL11.glPushMatrix(); + { + GL11.glRotatef(-20, 0f, 0f, 1f); + GL11.glTranslatef(0.0f, 0.0f, 0.0f); + GL11.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + + + GL11.glRotatef(-LimbRotation, 1.0f, 0.0f, 0.0f); + + // GL11.glRotatef(27.5f,0.0f,1.0f,0.0f); + c4.DrawCylinder(); + + + // right elbow + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glRotatef((float) (LimbRotation * -0.5), 0f, 0f, 1f); + GL11.glTranslatef(0.0f, 0.0f, 0.75f); + GL11.glRotatef((float) (-Rotation * 0.2), 1.0f, 0.0f, 0.0f); + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_stone").bind(); + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s7.DrawTexSphere(); + ; +// sphere.DrawSphere(0.2f, 32, 32); + + //right forearm + GL11.glColor3f(orange[0], orange[1], orange[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(orange)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.0f); + GL11.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + // GL11.glRotatef(90.0f,0.0f,1.0f,0.0f); + GL11.glRotatef((float) (-Rotation * 0.2), 0.0f, 1.0f, 0.0f); + c5.DrawCylinder(); + + // right hand + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.75f); + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_stone").bind(); + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s8.DrawTexSphere(); + ; +// sphere.DrawSphere(0.2f, 32, 32); + + + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + + //now chest + + + } + GL11.glPopMatrix(); +// GL11.glRotatef(LimbRotation * 3, 0.0f, 1.0f, 0.0f); +// GL11.glRotatef((float) (LimbRotation * -0.2), 0.0f, 1.0f, 0.0f); + + +// GL11.glPushMatrix(); +// GL11.glTranslatef(0,-1.8f,0); +// glDisable(GL_LIGHTING); +// glDisable(GL_TEXTURE_2D); +// Color.black.bind(); +// shadow.DrawOval(); +// Color.white.bind(); +// glEnable(GL_TEXTURE_2D); +// glEnable(GL_LIGHTING); +// GL11.glPopMatrix(); + // pelvis + // left hip + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.5f, -0.2f, 0.0f); + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_cobble").bind(); + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s9.DrawTexSphere(); + ; +// sphere.DrawSphere(0.25f, 32, 32); + + + // left high leg + GL11.glColor3f(orange[0], orange[1], orange[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(orange)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.0f); + GL11.glRotatef(0.0f, 0.0f, 0.0f, 0.0f); + + + GL11.glRotatef((-LimbRotation / 2) + 90, 1.0f, 0.0f, 0.0f); + // GL11.glRotatef(90.0f,1.0f,0.0f,0.0f); + + c6.DrawCylinder(); + + + // left knee + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.75f); + GL11.glRotatef(0.0f, 0.0f, 0.0f, 0.0f); + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_cobble").bind(); + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s10.DrawTexSphere(); + ; +// sphere.DrawSphere(0.25f, 32, 32); + + //left low leg + GL11.glColor3f(orange[0], orange[1], orange[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(orange)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.0f); + // GL11.glRotatef(120.0f,1.0f,0.0f,0.0f); + // GL11.glRotatef(0.0f,0.0f,0.0f,0.0f); + + c7.DrawCylinder(); + + // left foot + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.75f); + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_cobble").bind(); + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s11.DrawTexSphere(); + ; + +// sphere.DrawSphere(0.3f, 32, 32); + + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + + // pelvis + // right hip + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(-0.5f, -0.2f, 0.0f); + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_cobble").bind(); + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s12.DrawTexSphere(); + ; + +// sphere.DrawSphere(0.25f, 32, 32); + + + // right high leg + GL11.glColor3f(orange[0], orange[1], orange[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(orange)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.0f); + GL11.glRotatef(0.0f, 0.0f, 0.0f, 0.0f); + + + GL11.glRotatef((LimbRotation / 2) + 90, 1.0f, 0.0f, 0.0f); + // GL11.glRotatef(90.0f,1.0f,0.0f,0.0f); + + c8.DrawCylinder(); + + + // right knee + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.75f); + GL11.glRotatef(0.0f, 0.0f, 0.0f, 0.0f); + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_cobble").bind(); + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s13.DrawTexSphere(); + ; +// sphere.DrawSphere(0.25f, 32, 32); + + //right low leg + GL11.glColor3f(orange[0], orange[1], orange[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(orange)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.0f); + // GL11.glRotatef(120.0f,1.0f,0.0f,0.0f); + // GL11.glRotatef(0.0f,0.0f,0.0f,0.0f); + + c9.DrawCylinder(); + + // left foot + GL11.glColor3f(blue[0], blue[1], blue[2]); + GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, Utils.ConvertForGL(blue)); + GL11.glPushMatrix(); + { + GL11.glTranslatef(0.0f, 0.0f, 0.75f); + GL11.glTexParameteri( + GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, + GL11.GL_REPEAT); + Color.white.bind(); + getTextures().get("default_cobble").bind(); + ; + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + s14.DrawTexSphere(); + ; +// sphere.DrawSphere(0.3f, 32, 32); + + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + + } + GL11.glPopMatrix(); + + } + } +} \ No newline at end of file diff --git a/src/Scene/Objects/Player.java b/src/Scene/Objects/Player.java index c775a05..07339d4 100644 --- a/src/Scene/Objects/Player.java +++ b/src/Scene/Objects/Player.java @@ -145,6 +145,12 @@ public class Player extends SceneObject { t = (current_time - start_time) / 10; h = (speed * t - 0.5 * g * t * t) / 10000; jump_height = (float) h; + setShadowOffset(new Vector4f( + -jump_height * 90, + 0, + -jump_height * 90, + 0 + )); long end = System.currentTimeMillis(); while (end - start < 16) { try { diff --git a/src/Scene/Scene.java b/src/Scene/Scene.java index b3fa022..92171fc 100644 --- a/src/Scene/Scene.java +++ b/src/Scene/Scene.java @@ -329,6 +329,55 @@ public class Scene { textures )); + sceneManager.addSceneObject(new BookTable( + new Point4f(1000, 90f, -500, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90f, 90f, 90f, 0), + new Vector4f(0,0,0, 0), + textures + )); + sceneManager.addSceneObject(new Book( + new Point4f(1000, 250f, -500, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90f, 90f, 90f, 0), + new Vector4f(0,1,0, 90), + textures + )); + + sceneManager.addSceneObject(new BookShelf( + new Point4f(1000, 90f, -500, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90f, 90f, 90f, 0), + new Vector4f(0,1,0, 90), + textures + )); + + + sceneManager.addSceneObject(new BookTable( + new Point4f(-1000, 90f, -500, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90f, 90f, 90f, 0), + new Vector4f(0,0,0, 0), + textures + )); + sceneManager.addSceneObject(new Book( + new Point4f(-1000, 250f, -500, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90f, 90f, 90f, 0), + new Vector4f(0,1,0, -90), + textures + )); + + sceneManager.addSceneObject(new BookShelf( + new Point4f(-1000, 90f, -500, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90f, 90f, 90f, 0), + new Vector4f(0,1,0, -90), + textures + )); + + + for (int i = -9; i < 10; i++) { sceneManager.addSceneObject(new BookTable( new Point4f(500 * i, 90f, 4500, 0), @@ -421,6 +470,51 @@ public class Scene { textures )); +// sceneManager.addSceneObject(new NPC( +// new Point4f(-2700, 130, 2500, 0), +// new Point4f(0, 0, 0, 0), +// new Vector4f(90, 90, 90, 0), +// textures +// )); + sceneManager.addSceneObject(new NPC2( + new Point4f(400, 130, -2000, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90, 90, 90, 0), + textures + )); + sceneManager.addSceneObject(new NPC2( + new Point4f(800, 130, -2000, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90, 90, 90, 0), + textures + )); + sceneManager.addSceneObject(new NPC2( + new Point4f(1200, 130, -2000, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90, 90, 90, 0), + textures + )); + sceneManager.addSceneObject(new NPC2( + new Point4f(-400, 130, -2000, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90, 90, 90, 0), + textures + )); + sceneManager.addSceneObject(new NPC2( + new Point4f(-800, 130, -2000, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90, 90, 90, 0), + textures + )); + sceneManager.addSceneObject(new NPC2( + new Point4f(-1200, 130, -2000, 0), + new Point4f(0, 0, 0, 0), + new Vector4f(90, 90, 90, 0), + textures + )); + + + new Thread(new Runnable() { @Override public void run() { diff --git a/src/Scene/base/SceneObject.java b/src/Scene/base/SceneObject.java index 7565261..9c0232e 100644 --- a/src/Scene/base/SceneObject.java +++ b/src/Scene/base/SceneObject.java @@ -28,6 +28,7 @@ public abstract class SceneObject implements IDrawable, IMovable, IScalable, IHi private Vector4f rotation = new Vector4f(); private HashMap textures = new LinkedHashMap<>(); private DisplayListOval shadow; + private Vector4f shadowOffset = new Vector4f(); public SceneObject(Point4f origin, Point4f position, Vector4f scale) { this.origin = new Point4f(origin.x, origin.y, origin.z, 0); @@ -130,7 +131,7 @@ public abstract class SceneObject implements IDrawable, IMovable, IScalable, IHi GL11.glTranslatef(position.x, position.y, position.z); GL11.glScalef(1 / scale.x, 1 / scale.y, 1 / scale.z); GL11.glTranslatef(0, -origin.y, 0); - GL11.glTranslatef(-140f, 2f, -140f); + GL11.glTranslatef(-140f + shadowOffset.x, 2f + shadowOffset.y, -140f + shadowOffset.z); GL11.glRotatef(-45, 0,1,0); GL11.glScalef(2f, 0f, 1f); @@ -203,4 +204,12 @@ public abstract class SceneObject implements IDrawable, IMovable, IScalable, IHi public Vector4f getRotation() { return rotation; } + + public Vector4f getShadowOffset() { + return shadowOffset; + } + + public void setShadowOffset(Vector4f shadowOffset) { + this.shadowOffset = shadowOffset; + } } diff --git a/src/base/obj/OBJLoader.java b/src/base/obj/OBJLoader.java index d922ad1..86b606a 100644 --- a/src/base/obj/OBJLoader.java +++ b/src/base/obj/OBJLoader.java @@ -42,15 +42,6 @@ import static org.lwjgl.opengl.GL15.*; public class OBJLoader { - - private static FloatBuffer reserveData(int size) { - return BufferUtils.createFloatBuffer(size); - } - - private static float[] asFloats(Vector3f v) { - return new float[]{v.x, v.y, v.z}; - } - private static Vector3f parseVertex(String line) { String[] xyz = line.split(" "); float x = Float.valueOf(xyz[1]); diff --git a/src/main/Engine.java b/src/main/Engine.java index c28954b..13d2b37 100644 --- a/src/main/Engine.java +++ b/src/main/Engine.java @@ -12,6 +12,7 @@ import org.lwjgl.LWJGLException; import org.lwjgl.Sys; import org.lwjgl.opengl.*; import org.lwjgl.util.vector.Matrix4f; +import org.lwjgl.util.vector.Vector3f; import org.newdawn.slick.Color; import org.newdawn.slick.opengl.Texture; @@ -22,11 +23,14 @@ import java.util.LinkedHashMap; import static main.Main.camera; import static main.ShaderLoader.loadShaders; +import static org.lwjgl.opengl.ARBFramebufferObject.*; +import static org.lwjgl.opengl.ARBFramebufferObject.GL_FRAMEBUFFER; import static org.lwjgl.opengl.ARBShadowAmbient.GL_TEXTURE_COMPARE_FAIL_VALUE_ARB; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; -import static org.lwjgl.opengl.GL14.GL_DEPTH_TEXTURE_MODE; -import static org.lwjgl.util.glu.GLU.gluPerspective; +import static org.lwjgl.opengl.GL14.*; +import static org.lwjgl.opengl.GL14.GL_COMPARE_R_TO_TEXTURE; +import static org.lwjgl.util.glu.GLU.*; /** * @Author: WangYuyang @@ -150,7 +154,7 @@ public class Engine { glEnable(GL13.GL_MULTISAMPLE); // Display.setResizable(true); glClear(GL_COLOR_BUFFER_BIT); - shadowTexture = glGenTextures(); + GL11.glMatrixMode(GL_PROJECTION); GL11.glLoadIdentity(); @@ -246,6 +250,8 @@ public class Engine { spec.rewind(); direction.put(new float[]{0f, 0f, -1f, 0}); direction.rewind(); + +// setUpFrameBufferObject(); } public void enterModelView() { @@ -303,7 +309,219 @@ public class Engine { Display.destroy(); System.exit(0); } - +// /** +// * Sets up the OpenGL states. +// */ +// private static void setUpFrameBufferObject() { +// final int MAX_RENDERBUFFER_SIZE = glGetInteger(GL_MAX_RENDERBUFFER_SIZE); +// final int MAX_TEXTURE_SIZE = glGetInteger(GL_MAX_TEXTURE_SIZE); +// /** +// * Cap the maximum shadow map size at 1024x1024 pixels or at the maximum render buffer size. If you have a good +// * graphics card, feel free to increase this value. The program will lag +// * if I record and run the program at the same time with higher values. +// */ +// if (MAX_TEXTURE_SIZE > 1024) { +// if (MAX_RENDERBUFFER_SIZE < MAX_TEXTURE_SIZE) { +// shadowMapWidth = shadowMapHeight = MAX_RENDERBUFFER_SIZE; +// } else { +// shadowMapWidth = shadowMapHeight = 1024; +// } +// } else { +// shadowMapWidth = shadowMapHeight = MAX_TEXTURE_SIZE; +// } +// // Generate and bind a frame buffer. +// frameBuffer = glGenFramebuffers(); +// glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); +// // Generate and bind a render buffer. +// renderBuffer = glGenRenderbuffers(); +// glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); +// // Set the internal storage format of the render buffer to a depth component of 32 bits (4 bytes). +// glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32, shadowMapWidth, shadowMapHeight); +// // Attach the render buffer to the frame buffer as a depth attachment. This means that, if the frame buffer is +// // bound, any depth texture values will be copied to the render buffer object. +// glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderBuffer); +// // OpenGL shall make no amendment to the colour or multisample buffer. +// glDrawBuffer(GL_NONE); +// // Disable the colour buffer for pixel read operations (such as glReadPixels or glCopyTexImage2D). +// glReadBuffer(GL_NONE); +// // Check for frame buffer errors. +// int FBOStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER); +// if (FBOStatus != GL_FRAMEBUFFER_COMPLETE) { +// System.err.println("Framebuffer error: " + gluErrorString(glGetError())); +// } +// // Bind the default frame buffer, which is used for ordinary drawing. +// glBindFramebuffer(GL_FRAMEBUFFER, 0); +// } +// +// private static void generateTextureCoordinates() { +// glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +// // Compare the texture coordinate 'r' (the distance from the light to the surface of the object) to the +// // value in the depth buffer. +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); +// // Enable 's' texture coordinate generation. +// glEnable(GL_TEXTURE_GEN_S); +//// // Enable 't' texture coordinate generation. +// glEnable(GL_TEXTURE_GEN_T); +//// // Enable 'r' texture coordinate generation. +// glEnable(GL_TEXTURE_GEN_R); +//// // Enable 'q' texture coordinate generation. +// glEnable(GL_TEXTURE_GEN_Q); +// textureBuffer.clear(); +// textureBuffer.put(0, depthModelViewProjection.m00); +// textureBuffer.put(1, depthModelViewProjection.m01); +// textureBuffer.put(2, depthModelViewProjection.m02); +// textureBuffer.put(3, depthModelViewProjection.m03); +// +// glTexGen(GL_S, GL_EYE_PLANE, textureBuffer); +// +// textureBuffer.put(0, depthModelViewProjection.m10); +// textureBuffer.put(1, depthModelViewProjection.m11); +// textureBuffer.put(2, depthModelViewProjection.m12); +// textureBuffer.put(3, depthModelViewProjection.m13); +// +// glTexGen(GL_T, GL_EYE_PLANE, textureBuffer); +// +// textureBuffer.put(0, depthModelViewProjection.m20); +// textureBuffer.put(1, depthModelViewProjection.m21); +// textureBuffer.put(2, depthModelViewProjection.m22); +// textureBuffer.put(3, depthModelViewProjection.m23); +// +// glTexGen(GL_R, GL_EYE_PLANE, textureBuffer); +// +// textureBuffer.put(0, depthModelViewProjection.m30); +// textureBuffer.put(1, depthModelViewProjection.m31); +// textureBuffer.put(2, depthModelViewProjection.m32); +// textureBuffer.put(3, depthModelViewProjection.m33); +// +// glTexGen(GL_Q, GL_EYE_PLANE, textureBuffer); +// } +// +// /** +// * Generate the shadow map. +// * +// * @param renderProgram +// */ +// private static void drawShadowMap(RenderProgramStatement renderProgram) { +// /** +// * The model-view matrix of the light. +// */ +// FloatBuffer lightModelView = BufferUtils.createFloatBuffer(16); +// /** +// * The projection matrix of the light. +// */ +// FloatBuffer lightProjection = BufferUtils.createFloatBuffer(16); +// Matrix4f lightProjectionTemp = new Matrix4f(); +// Matrix4f lightModelViewTemp = new Matrix4f(); +// /** +// * The radius that encompasses all the objects that cast shadows in the scene. There should +// * be no object farther away than 50 units from [0, 0, 0] in any direction. +// * If an object exceeds the radius, the object may cast shadows wrongly. +// */ +// float sceneBoundingRadius = 1500; +// /** +// * The distance from the light to the scene, assuming that the scene is located +// * at [0, 0, 0]. Using the Pythagorean theorem, the distance is calculated by taking the square-root of the +// * sum of each of the components of the light position squared. +// */ +// float lightToSceneDistance = (float) Math.sqrt(lightPosition.get(0) * lightPosition.get(0) + +// lightPosition.get(1) * lightPosition.get(1) + +// lightPosition.get(2) * lightPosition.get(2)); +// +// /** +// * The distance to the object that is nearest to the camera. This excludes objects that do not cast shadows. +// * This will be used as the zNear parameter in gluPerspective. +// */ +// float nearPlane = lightToSceneDistance - sceneBoundingRadius; +// if (nearPlane < 0) { +// System.err.println("Camera is too close to scene. A valid shadow map cannot be generated."); +// } +// /** +// * The field-of-view of the shadow frustum in degrees. Formula taken from the OpenGL SuperBible. +// */ +// float fieldOfView = (float) Math.toDegrees(2.0F * Math.atan(sceneBoundingRadius / lightToSceneDistance)); +// glMatrixMode(GL_PROJECTION); +// // Store the current projection matrix. +// glPushMatrix(); +// glLoadIdentity(); +// // Generate the 'shadow frustum', a perspective projection matrix that shows all the objects in the scene. +// gluPerspective(fieldOfView, 1, nearPlane, nearPlane + sceneBoundingRadius * 2); +// // Store the shadow frustum in 'lightProjection'. +// glGetFloat(GL_PROJECTION_MATRIX, lightProjection); +// glMatrixMode(GL_MODELVIEW); +// // Store the current model-view matrix. +// glPushMatrix(); +// glLoadIdentity(); +// // Have the 'shadow camera' look toward [0, 0, 0] and be location at the light's position. +// gluLookAt(lightPosition.get(0), lightPosition.get(1), lightPosition.get(2), 0, 0, 0, 0, 1, 0); +// glGetFloat(GL_MODELVIEW_MATRIX, lightModelView); +// // Set the view port to the shadow map dimensions so no part of the shadow is cut off. +// glViewport(0, 0, shadowMapWidth, shadowMapHeight); +// // Bind the extra frame buffer in which to store the shadow map in the form a depth texture. +// glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); +// // Clear only the depth buffer bit. Clearing the colour buffer is unnecessary, because it is disabled (we +// // only need depth components). +// glClear(GL_DEPTH_BUFFER_BIT); +// // Store the current attribute state. +// glPushAttrib(GL_ALL_ATTRIB_BITS); +// { +// // Disable smooth shading, because the shading in a shadow map is irrelevant. It only matters where the +// // shape +// // vertices are positioned, and not what colour they have. +// glShadeModel(GL_FLAT); +// // Enabling all these lighting states is unnecessary for reasons listed above. +// glDisable(GL_LIGHTING); +// glDisable(GL_COLOR_MATERIAL); +// glDisable(GL_NORMALIZE); +// // Disable the writing of the red, green, blue, and alpha colour components, +// // because we only need the depth component. +// glColorMask(false, false, false, false); +// // An offset is given to every depth value of every polygon fragment to prevent a visual quirk called +// // 'shadow +// // acne'. +// glEnable(GL_POLYGON_OFFSET_FILL); +// // Draw the objects that cast shadows. +// renderProgram.renderScene(16); +// +// /** +// * Copy the pixels of the shadow map to the frame buffer object depth attachment. +// * int target -> GL_TEXTURE_2D +// * int level -> 0, has to do with mip-mapping, which is not applicable to shadow maps +// * int internalformat -> GL_DEPTH_COMPONENT +// * int x, y -> 0, 0 +// * int width, height -> shadowMapWidth, shadowMapHeight +// * int border -> 0 +// */ +//// shadowTexture = glGenTextures(); +//// glBindTexture(GL_TEXTURE_2D, shadowTexture); +// glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, shadowMapWidth, shadowMapHeight, 0); +//// glBindTexture(GL_TEXTURE_2D, 0); +// +// +// // Restore the previous model-view matrix. +// glPopMatrix(); +// glMatrixMode(GL_PROJECTION); +// // Restore the previous projection matrix. +// glPopMatrix(); +// glMatrixMode(GL_MODELVIEW); +// glBindFramebuffer(GL_FRAMEBUFFER, 0); +// }// Restore the previous attribute state. +// glPopAttrib(); +// // Restore the view port. +// glViewport(0, 0, Display.getWidth(), Display.getHeight()); +// lightProjectionTemp.load(lightProjection); +// lightModelViewTemp.load(lightModelView); +// lightProjection.flip(); +// lightModelView.flip(); +// depthModelViewProjection.setIdentity(); +// // [-1,1] -> [-0.5,0.5] -> [0,1] +// depthModelViewProjection.translate(new Vector3f(0.5F, 0.5F, 0.5F)); +// depthModelViewProjection.scale(new Vector3f(0.5F, 0.5F, 0.5F)); +// // Multiply the texture matrix by the projection and model-view matrices of the light. +// Matrix4f.mul(depthModelViewProjection, lightProjectionTemp, depthModelViewProjection); +// Matrix4f.mul(depthModelViewProjection, lightModelViewTemp, depthModelViewProjection); +// // Transpose the texture matrix. +// Matrix4f.transpose(depthModelViewProjection, depthModelViewProjection); +// } public void render(RenderProgramStatement renderProgram) { glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); GL11.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); @@ -320,7 +538,6 @@ public class Engine { // glPushAttrib(GL_ALL_ATTRIB_BITS); // { // generateTextureCoordinates(); -// // drawShadowMap(renderProgram); // // @@ -357,9 +574,8 @@ public class Engine { GL11.glLoadIdentity(); //Placing 0,0 at the center of the screen // GL11.glOrtho(1200 / 2 - OrthoNumber, OrthoNumber / 2, (800 / 2 - (OrthoNumber * 0.66f)), (OrthoNumber / 2 * 0.66f), 100000, -100000); -// GL11.glOrtho(1200 - OrthoNumber, OrthoNumber, (800 - (OrthoNumber * 0.66f)), (OrthoNumber * 0.66f), 100000, -100000);F +// GL11.glOrtho(1200 - OrthoNumber, OrthoNumber, (800 - (OrthoNumber * 0.66f)), (OrthoNumber * 0.66f), 100000, -100000); gluPerspective((float) 60, Display.getWidth() / Display.getHeight(), zNear, zFar); - // GL11.glOrtho(-600 - OrthoNumber, 600 + OrthoNumber, -100 - OrthoNumber * 0.66, 700 + OrthoNumber * 0.66, 100000, -100000); enterModelView(); // } diff --git a/src/main/Main.java b/src/main/Main.java index 6505e0b..00e621a 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -15,6 +15,7 @@ import java.util.ArrayList; import static org.lwjgl.opengl.GL11.glLoadIdentity; import static org.lwjgl.opengl.GL11.glPointSize; +import static org.lwjgl.opengl.GL20.glUseProgram; /** * @Author: WangYuyang @@ -91,18 +92,18 @@ public class Main { key_positions.add(new Vector4f(-3000, 100, 5000, 2000)); key_rotations.add(new Vector4f(0, -180, 0, 2000)); - - key_positions.add(new Vector4f(0, 7000, 0, 2000)); - key_rotations.add(new Vector4f(90, 0, 0, 2000)); - - key_positions.add(new Vector4f(0, 7000, 0, 2000)); - key_rotations.add(new Vector4f(90, 180, 0, 2000)); - - key_positions.add(new Vector4f(0, 7000, 0, 1000)); - key_rotations.add(new Vector4f(90, 180, 45, 1000)); - - key_positions.add(new Vector4f(0, 7000, 0, 1000)); - key_rotations.add(new Vector4f(90, 180, -45, 1000)); +// +// key_positions.add(new Vector4f(0, 7000, 0, 2000)); +// key_rotations.add(new Vector4f(90, 0, 0, 2000)); +// +// key_positions.add(new Vector4f(0, 7000, 0, 2000)); +// key_rotations.add(new Vector4f(90, 180, 0, 2000)); +// +// key_positions.add(new Vector4f(0, 7000, 0, 1000)); +// key_rotations.add(new Vector4f(90, 180, 45, 1000)); +// +// key_positions.add(new Vector4f(0, 7000, 0, 1000)); +// key_rotations.add(new Vector4f(90, 180, -45, 1000)); key_positions.add(new Vector4f(0, 500, -1000, 4000)); diff --git a/src/main/ShaderLoader.java b/src/main/ShaderLoader.java index 59247df..a44267d 100644 --- a/src/main/ShaderLoader.java +++ b/src/main/ShaderLoader.java @@ -24,6 +24,7 @@ public class ShaderLoader { public static void loadShaders() { loadShader(0, "shader.vs", "shader.fs"); +// loadShader(1, "invert.vsh", "invert.fsh"); System.out.println("Shaders load ok.");