From 7e7939e1ad1b9576dc518e0fadbf4a3c1eb989df Mon Sep 17 00:00:00 2001 From: ianband <32182222+IanBand@users.noreply.github.com> Date: Mon, 17 Oct 2022 02:36:53 -0700 Subject: [PATCH] Add DrawCapsule(Wires) (#2761) * Add DrawCapsule & DrawCapsuleWires * Add DrawCapsule & DrawCapsuleWires to example Co-authored-by: Ian Band --- examples/models/models_geometric_shapes.c | 3 + examples/models/models_geometric_shapes.png | Bin 33973 -> 22450 bytes src/raylib.h | 2 + src/rmodels.c | 278 ++++++++++++++++++++ 4 files changed, 283 insertions(+) diff --git a/examples/models/models_geometric_shapes.c b/examples/models/models_geometric_shapes.c index 294c88252..90261ad21 100644 --- a/examples/models/models_geometric_shapes.c +++ b/examples/models/models_geometric_shapes.c @@ -66,6 +66,9 @@ int main(void) DrawCylinder((Vector3){1.0f, 0.0f, -4.0f}, 0.0f, 1.5f, 3.0f, 8, GOLD); DrawCylinderWires((Vector3){1.0f, 0.0f, -4.0f}, 0.0f, 1.5f, 3.0f, 8, PINK); + DrawCapsule ((Vector3){-3.0f, 1.5f, -4.0f}, (Vector3){-4.0f, -1.0f, -4.0f}, 1.2f, 8, 8, VIOLET); + DrawCapsuleWires((Vector3){-3.0f, 1.5f, -4.0f}, (Vector3){-4.0f, -1.0f, -4.0f}, 1.2f, 8, 8, PURPLE); + DrawGrid(10, 1.0f); // Draw a grid EndMode3D(); diff --git a/examples/models/models_geometric_shapes.png b/examples/models/models_geometric_shapes.png index 6076b429714060a4653e7d77970932bcd8874dc0..765abe1979f097640f6fa909ba61312a41585ae0 100644 GIT binary patch literal 22450 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYU_8vh#=yXE$G$F?fq{Xg*vT`5gM)*kh9jke zfq_A?#5JNMI6tkVJh3R1Aw4fYH&wSdxhOR?uQ(&W@O^_nzqSVBa%=|os zkj&gvhTzgX1w%6h|Kt({BLgEN1w%tCBLgdAQw2xg3k;1}3=9eko-U3d6?5L+_3ubM zKJ~#vjmN&}rY2|Cv}C&I&SFel&l7owEif~qCp`FWuVC&5G2YAFjOI&Qxh0LSbR65^ zp&t_Qpp|`(MsuqG8!yj{v;#9mwiMXiGDuK%`=WI5P=%q%y&tLPmtEAkG*MKtQt6S) zogIbB@BY>*XuaP1Tm7E*$-d(AmV(>A{r;;C@;-yqk1Lm$85kHCHpsFlfaqC@42%p6 z3>SD9IT#oi8qzo%K%yqj3``6R3=1Tg1VG%g0u3N4qm6-ufq}un7**?;(sAenM5EhW#*IbuzqI$AKWi}MUVL?2hE0kY$i6D50yL9P zzGL+Kns?@|abVT|OYYxs#K28ZXMh&sGWtR~{$eMW}ZpICbL`6l*-`=5dq%_pY5h0U)Qp&n4fB&uu*Jv3}=qxxGa$k=MFp zYASwzVqf?(hRZ`QZjm?(LzNRhN5iT+2M+V{Wx~6c|<&oSy6SG;pPY%9OJlrmJ=zU$SF$hG0j}YpvgkohdFLf7zdC zV3=`+O@8B>wy9idMSat~);c{dU{W16@z=5$@gtTS`JpKM}q04dZ^n;PwVvY@4} z@V>E|_=_LcxxUU2Xz6(z_05^fLCBFaQh?zF^Xde~6KZSoo_?>&@cb)fxBt2F^NQc) z+vATM&5BIkv2oVavd+89&zpBAy6P~zU}ofK&@uaP;oZZBUZx9vA9Q?ERj2UiJ?EqU zcjX@Md(P&|qV#u{&fZT|)?OR*IT%VBaa!%b$-@oOHK$xP5>;8)8&#M1rUoyN@y5*eR z=h%;>n#@YFkM|!h+FL6){jTcdjhx%}|16qOMDm&YwU5`IeZ8Cc^RIUY?)>|8UaF7B!Iwqh2FoV7pH2tc z(>U)$YS~~~-I`m9y>!Oy`)?n}adZ!>&^CQQ=Nr9=Soq=U` z^63o%Vy9~)l-U_Az2E=heemw}Kl^=?)7787%iovE_wSkb^*Ha;Ag9Nd-)!moc0|YZ z<*V>RJ5wBgO_Z+qamS%0fklGZRw2Sx^S7g$%Ddn3cG|Ogru#kE`uwKCqepY6pFMd0 z&!bo8=k#*+cBZ@hdC<}J6dJFClo1WAgVt^M=K;M4{&0WKviz2n(DkrS3qnG*d}Nt@|QF9XYJw`I!y ztG=8P&3;q%zeiSk?rh;5KfZ5d?E2kr^6bLvf2PI9n_f0K9-Q)N^##)xteJV|*0eu) zzwhJqFI^0>N(=|pF0w0m`<_WY?v*2^q&|DntUvevp54A~+CAIfXUf-4dwjJ|dHKt` z|D45^EVSGtFPP$ZD`VnU4@CjSUyck-SCxKGbdM@COPBAxQn+y0rwNmumOH<1pLW~# zq^$9>NEHbMZlm2xnfc|te=?m`W;m!NSo7rP)pEW?t6io}Fyh;GL~HA%soL9hPVZe- zwtmu$wl1BMx7{{;yfee)K39 z%Rhk%v!mAf@wflpnU?ajFWA`ae|p%FS?7CY&lfKZJK-gByes1CmUo|5yll_^e?=lW z!jXH1BqK+dy7~$QhMgv<*Yh*47oM$?*?F+Z@R`<+f@TqWg_Bb^^K&?!u$gqTpR=*` z*N)}q&m4Vxe))O#D<=-N_b;t!{29>1nloqF7LVIK>rOiDuwM9lP2bb$ML!>Fzr4<| zwoY|#yX4k4hcoUx*(YjiGV{7yrI^8de|=kq13cX zN$+OuIgohD@A>rSlUP^2H2N)Qnb3DYVFIgV#pCHIjz%|oj?ZG^zn`j5^wT&}Z~-5a z07JObL65apH#mJiqkFpOc-r(wTT>%;CSNsMm8`bZdiHrUu`0(c*Fy4^rZx*Q2_{H+ zZP*|ceLiJM$JF?rtNoXr+OR})-4>J7$h--Gr}7K<*KU{^CDFdWZl1KTXCHETEF2N#KApr&wE<@$ZdWeNL_4R~#@$*C4HGnd0%g_iJ7oF$m7F zv0iy;L0(Tx)>Nx`Mr&+V-Rqxpb$yye`s>|`cc+GLTXRCf*;$-Uq9|LRlZUNj}gW_uK?=Bm&g+h($M z`Y!mphGX*E=NxtnvfmgP{~dVOwU2e>U;8`uv6r}l-wExt{9T{%?VrK2bN}T3*(RUn z`knN<<$~~{<@e$rzua8OJ}I;NcT>jqtsBn11Qq$$y|!#SQOC|A-@qp+z|;B0y>`~6 z#TT-|7VdR25iZS*4C|d_kg0rV%7yYrb!n$Ih*atB&DwkW7ekTy#pw6Ko~&}y-%nI! zjbTwZz}EUpGUngp{}BuVTuMbulPphdN;>@_>-_YvLrJb{Y$8v;+s4PHad=nSsXF=S z*TOdsrL#P9VrY6e;qMIpjPT;$-=~C_DT_V%u{6ds?8Pjhf{gFXhR-%F>9w1{ksEL^ z(=5sR?2D~xm$TmsFTBGwqm6;Zd8YM`4Ydl{d<98=<@a4$(_-d5;najBzwDQ>$;{fg zQT~L<-F&MIAFB^HJ;YM_?w-3Y(IHU7a9OZ{VaKAAQBUHu(+|mI*Gz9(xRa?dVx{Q8 z_IX+7`NP|9@@I2LPOwzJn$6+jCTD#?I_%&fgKP676bkgehuN#biAKIcF@B4K99Me;;BF$bqeqg-f$j0&^XCaTa zyTNOZO^x`~Rud zJ-_HW^9+8~2!_0Z)9X|&<-M?!7HTUCj`uqGti|$pzVEkZwYE8SD|lvH+h&-!`jU2U zoS9iluwz19io=Dys+;7qbq}AKYw&zsl4zCf6xqz1*^0djO>R5)dpPBNOJ0(5^3)~; zTfa@y@7$PhfH|X?hhu}|tOH8s))P-vv}{t|x><2y+RsZpt{JI%P5d_xwr`&<=VY0x zmZlpyVcsTrq1l3&Q$-bjFx*mPZd$k2kbC2lIe+cFGJabJ-JA$5>sSA>U*eFKm7tL8 zHsjVq+38*1{=6vpd~n6o6i2sNIp=SxUy6Ruxq+2M;f2`2YUfq-?Oo2pVBoU?f9z!)&iMRzwX#`{OFtSjBbt$Oe|~G z@~3$HoOplAI$oV3_4nb{3#`|BE)CK3cs%`IpZDsMbs5J^D#TKbJUDD>Dxmn9QKy@M zB{u5vk^Sbg7ATm#{N6k%>h!y5J;741k6K4=@4Oc+TrXiZtMQ)bV?2h6QE`ICR~ zL=_z~$q-BFot*#nSR0GHgFJ`Bg}L)K$!BXGK9%dBe=_UHCf0X`-rqu6!nT~!Tsmpi zv+XgrYb9$$ScGh+#fwVla&KDp#=RqCp6f}`3*t-yB`@D>j*qJ1xcdqz_`?%XR=ve3jx$=AU$9CG zF0$VCW~KPv-sSGM&ay1!<@7eQEjj<)dj+U1TKw_c>7&y8zaE#a*G+XdTWiu0koRNz z4AFN_?)_fY9DU$DLq#7C$A%))-}YOcXBn|Cyrf<)s-64tip&yU&cE}wX9ayrW|?WL zwKv`IL>losZVrKkLht`i36IZGF{_+phg) zTu{%V@ZwTb*!)+He*Vs9)qgL&+0?xMXDg`kxSIEDq0kD=>PC;pysS#mv426fOu4$A z>)4HKv6RyX*?C_$%;#`mU}aiVR6I?$b)9%rs`gfXkDQ)=)zN3`MD%y>W|d6?J4n#? z#euG^Z~m_+e7mz+J14m+>*d`GI}I*3_fKq^esA_uQ4TwXFC7dlcay%Z{F=43DkNj6 zPVzc-<)Gy1oSx{|zpozj#{2C)z@_#@bMpShT@j@#^;wz^6i-QD^irOd*jgp2q8nbe zDsq}=c9{O&vaFbB-ThKp)q&0@pTAwg(|t*s!B&}>DZ%j8UuUOCo@(CxYhJxEzHeGy z|9S12jW@Ehk8N@do%g0+;($m>Zq4LS_h6bL+Qxe~nS$}qacJI>R6Vqn>IKGL0YniQo?DPBo z9$k4;HaX99PIdjBvupYdms!lPsCYd6*_ZYI_I^qzIZ+pr#2L3Bo<-rnsW)ZT#T6A9 z`~Ju0uluqjHmOW=W#N>bK;bPvr1_7n`?~Y+?7#Bgtm6;e`Mz%3$0p_ znWx|Jti1N-@4&Cy7y@J&Id++QU1NNj^T5!(-t}bOn}RDGGHy3(43-r9@y_u%A^d;e z-G9H%pZRw@KC(*Uz@rz8jA1L5|FyrClD#@UG<%tx<&PPQK0aUeo%w(Uhl4@Oyjd5k zrMmO`isr0c_v;CFEq}J&{#!W@9?bq=dnHEj^@k4^-YD^Uq}Vg`G%>J5ESw{{b{e07 zQ?0zJ_seN>*1xS+{2iE~yE=YqU7wqy%uRj3-%6`x8 zT2L~P;AG@zyBPd3*gtur*XhElSqn}G3 zrZql!%)h3!mW6-MUHNC#tINN(PKl2cwmTmaIpK6_`OFMv32sJ?4U7vtzg_bGHvL|` zOY!@q`xigUvRkV@`BTi&_lNRb)PG2D@7I4I#K_Th32blS>GfIuFRFFBXJr*Pwldx9 zZ|QV&d8@;*G@QZBm4PWIqW@s4w1iJAr?>J~*(0acPm5_P7faE37W(t|(@d*|K*0tE z?MavaZ!BS3;QBLEr(xlrSG$_|^RMrH5Y;@hbLQNrNP$iA3~p`=O%K0>{JPS7)wVVN z0GrrKhGgxt&#y`^xgJp$>b>+p&l~oJiGmFb!e7LATIap`9+B1Bx5hNuu$}Av)hi9} zU%aiKYs1D6A;ieBA<)v%^KH$gvaD=&fhP!A$iA=S4S$`KkEIvO8mChx5G0|-t3n#na3O<%_NY(nlw4{|K3TRBUo{QcUEGq1weNoj}Y7JglQ=)BLjWV^lk2eWzh`yY^C5@3)%cuziYN|LF|H)aM7 z2ZMcar#3|O9@gI<75%?mWqZG}>KEHD^ZxGmyIX(O?ft(W>0F-|)3tT!C+*b_j3@tP zU#XXyLClEq&iWHfi*-v4`%VSQfD&$)m8{qz67GKXQQwsmgi*VUTy?2Mmn z{8tdRk7+|#ibKP}qiV1JP5yUJ{hN1`mUYTzDN|$VrPmjWtafno6ursMu)~F+DfEVy zq}b~CsUN*}EOA&<`t$0Xry>7ri{1r?bZve5rv2OI%fA^J!Z{oodT0DTz{ssKT7NI#7R6( zS$P3F3U}V*XNa(75=cl;W)bzC7N2=0vhHf~gNI&h?o;Q#Ss$ju4GPpe1qMbogRMVn zuKcxMHi=38|JFNi+P{@wtp4zjtJn1BlX;(3KWA!W1Npdd%f5Gnn1;lBML`!k1G9EEZ!%+Nj`TYi@t#vlR$zRi<87mi4ehx z7b!LVIaVAA-Fa`n|Ms6I$70aF`F!2UJAc2PZGc zUMs!6_S5$K8PWDtHZOOX%KrWN+M7QyO#T0-Yg_l<|NWTHILm+j*I=P?c?u)b3diTGey69S1m8#{h&)3iX^Z) zQtgHR&9kXZ)03;emtnn4Z?pX7J`RRmE}UWpi

koCoK$HC(qe^nMfSbXe;dz`?6 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 s!tHr?KgD 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 J%Q~loCIA+y*02Bo diff --git a/src/raylib.h b/src/raylib.h index 34b8cce4c..4c353ac53 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1423,6 +1423,8 @@ RLAPI void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, f RLAPI void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder with base at startPos and top at endPos RLAPI void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires RLAPI void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder wires with base at startPos and top at endPos +RLAPI void DrawCapsule(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color); // Draw a capsule with the center of its sphere caps at startPos and endPos +RLAPI void DrawCapsuleWires(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color); // Draw capsule wireframe with the center of its sphere caps at startPos and endPos RLAPI void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ RLAPI void DrawRay(Ray ray, Color color); // Draw a ray line RLAPI void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) diff --git a/src/rmodels.c b/src/rmodels.c index 342ba33b6..80205d499 100644 --- a/src/rmodels.c +++ b/src/rmodels.c @@ -817,6 +817,284 @@ void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, fl rlEnd(); } +// Draw a capsule with the center of its sphere caps at startPos and endPos +void DrawCapsule(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color) +{ + if (slices < 3) slices = 3; + + Vector3 direction = { endPos.x - startPos.x, endPos.y - startPos.y, endPos.z - startPos.z }; + + // draw a sphere if start and end points are the same + bool sphereCase = (direction.x == 0) && (direction.y == 0) && (direction.z == 0); + if (sphereCase) direction = (Vector3){0.0f, 1.0f, 0.0f}; + + // Construct a basis of the base and the caps: + Vector3 b0 = Vector3Normalize(direction); + Vector3 b1 = Vector3Normalize(Vector3Perpendicular(direction)); + Vector3 b2 = Vector3Normalize(Vector3CrossProduct(b1, direction)); + Vector3 capCenter = endPos; + + float baseSliceAngle = (2.0f*PI)/slices; + float baseRingAngle = PI * 0.5 / rings; + + rlBegin(RL_TRIANGLES); + rlColor4ub(color.r, color.g, color.b, color.a); + + // render both caps + for (int c = 0; c < 2; c++) + { + for (int i = 0; i < rings; i++) + { + for (int j = 0; j < slices; j++) + { + + // we build up the rings from capCenter in the direction of the 'direction' vector we computed earlier + + // as we iterate through the rings they must be placed higher above the center, the height we need is sin(angle(i)) + // as we iterate through the rings they must get smaller by the cos(angle(i)) + + // compute the four vertices + float ringSin1 = sinf(baseSliceAngle*(j + 0))*cosf(baseRingAngle * ( i + 0 )); + float ringCos1 = cosf(baseSliceAngle*(j + 0))*cosf(baseRingAngle * ( i + 0 )); + Vector3 w1 = (Vector3){ + capCenter.x + (sinf(baseRingAngle * ( i + 0 ))*b0.x + ringSin1*b1.x + ringCos1*b2.x) * radius, + capCenter.y + (sinf(baseRingAngle * ( i + 0 ))*b0.y + ringSin1*b1.y + ringCos1*b2.y) * radius, + capCenter.z + (sinf(baseRingAngle * ( i + 0 ))*b0.z + ringSin1*b1.z + ringCos1*b2.z) * radius + }; + float ringSin2 = sinf(baseSliceAngle*(j + 1))*cosf(baseRingAngle * ( i + 0 )); + float ringCos2 = cosf(baseSliceAngle*(j + 1))*cosf(baseRingAngle * ( i + 0 )); + Vector3 w2 = (Vector3){ + capCenter.x + (sinf(baseRingAngle * ( i + 0 ))*b0.x + ringSin2*b1.x + ringCos2*b2.x) * radius, + capCenter.y + (sinf(baseRingAngle * ( i + 0 ))*b0.y + ringSin2*b1.y + ringCos2*b2.y) * radius, + capCenter.z + (sinf(baseRingAngle * ( i + 0 ))*b0.z + ringSin2*b1.z + ringCos2*b2.z) * radius + }; + + float ringSin3 = sinf(baseSliceAngle*(j + 0))*cosf(baseRingAngle * ( i + 1 )); + float ringCos3 = cosf(baseSliceAngle*(j + 0))*cosf(baseRingAngle * ( i + 1 )); + Vector3 w3 = (Vector3){ + capCenter.x + (sinf(baseRingAngle * ( i + 1 ))*b0.x + ringSin3*b1.x + ringCos3*b2.x) * radius, + capCenter.y + (sinf(baseRingAngle * ( i + 1 ))*b0.y + ringSin3*b1.y + ringCos3*b2.y) * radius, + capCenter.z + (sinf(baseRingAngle * ( i + 1 ))*b0.z + ringSin3*b1.z + ringCos3*b2.z) * radius + }; + float ringSin4 = sinf(baseSliceAngle*(j + 1))*cosf(baseRingAngle * ( i + 1 )); + float ringCos4 = cosf(baseSliceAngle*(j + 1))*cosf(baseRingAngle * ( i + 1 )); + Vector3 w4 = (Vector3){ + capCenter.x + (sinf(baseRingAngle * ( i + 1 ))*b0.x + ringSin4*b1.x + ringCos4*b2.x) * radius, + capCenter.y + (sinf(baseRingAngle * ( i + 1 ))*b0.y + ringSin4*b1.y + ringCos4*b2.y) * radius, + capCenter.z + (sinf(baseRingAngle * ( i + 1 ))*b0.z + ringSin4*b1.z + ringCos4*b2.z) * radius + }; + + // make sure cap triangle normals are facing outwards + if(c == 0) + { + rlVertex3f(w1.x, w1.y, w1.z); + rlVertex3f(w2.x, w2.y, w2.z); + rlVertex3f(w3.x, w3.y, w3.z); + + rlVertex3f(w2.x, w2.y, w2.z); + rlVertex3f(w4.x, w4.y, w4.z); + rlVertex3f(w3.x, w3.y, w3.z); + } + else + { + rlVertex3f(w1.x, w1.y, w1.z); + rlVertex3f(w3.x, w3.y, w3.z); + rlVertex3f(w2.x, w2.y, w2.z); + + rlVertex3f(w2.x, w2.y, w2.z); + rlVertex3f(w3.x, w3.y, w3.z); + rlVertex3f(w4.x, w4.y, w4.z); + } + } + } + capCenter = startPos; + b0 = Vector3Scale(b0, -1.0f); + } + // render middle + if (!sphereCase) + { + for (int j = 0; j < slices; j++) + { + // compute the four vertices + float ringSin1 = sinf(baseSliceAngle*(j + 0))*radius; + float ringCos1 = cosf(baseSliceAngle*(j + 0))*radius; + Vector3 w1 = { + startPos.x + ringSin1*b1.x + ringCos1*b2.x, + startPos.y + ringSin1*b1.y + ringCos1*b2.y, + startPos.z + ringSin1*b1.z + ringCos1*b2.z + }; + float ringSin2 = sinf(baseSliceAngle*(j + 1))*radius; + float ringCos2 = cosf(baseSliceAngle*(j + 1))*radius; + Vector3 w2 = { + startPos.x + ringSin2*b1.x + ringCos2*b2.x, + startPos.y + ringSin2*b1.y + ringCos2*b2.y, + startPos.z + ringSin2*b1.z + ringCos2*b2.z + }; + + float ringSin3 = sinf(baseSliceAngle*(j + 0))*radius; + float ringCos3 = cosf(baseSliceAngle*(j + 0))*radius; + Vector3 w3 = { + endPos.x + ringSin3*b1.x + ringCos3*b2.x, + endPos.y + ringSin3*b1.y + ringCos3*b2.y, + endPos.z + ringSin3*b1.z + ringCos3*b2.z + }; + float ringSin4 = sinf(baseSliceAngle*(j + 1))*radius; + float ringCos4 = cosf(baseSliceAngle*(j + 1))*radius; + Vector3 w4 = { + endPos.x + ringSin4*b1.x + ringCos4*b2.x, + endPos.y + ringSin4*b1.y + ringCos4*b2.y, + endPos.z + ringSin4*b1.z + ringCos4*b2.z + }; + // w2 x.-----------x startPos + rlVertex3f(w1.x, w1.y, w1.z); // | |\'. T0 / + rlVertex3f(w2.x, w2.y, w2.z); // T1 | \ '. / + rlVertex3f(w3.x, w3.y, w3.z); // | |T \ '. / + // | 2 \ T 'x w1 + rlVertex3f(w2.x, w2.y, w2.z); // | w4 x.---\-1-|---x endPos + rlVertex3f(w4.x, w4.y, w4.z); // T2 '. \ |T3/ + rlVertex3f(w3.x, w3.y, w3.z); // | '. \ | / + // '.\|/ + // 'x w3 + } + } + rlEnd(); +} + +// Draw capsule wires with the center of its sphere caps at startPos and endPos +void DrawCapsuleWires(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color) +{ + if (slices < 3) slices = 3; + + Vector3 direction = { endPos.x - startPos.x, endPos.y - startPos.y, endPos.z - startPos.z }; + + // draw a sphere if start and end points are the same + bool sphereCase = (direction.x == 0) && (direction.y == 0) && (direction.z == 0); + if (sphereCase) direction = (Vector3){0.0f, 1.0f, 0.0f}; + + // Construct a basis of the base and the caps: + Vector3 b0 = Vector3Normalize(direction); + Vector3 b1 = Vector3Normalize(Vector3Perpendicular(direction)); + Vector3 b2 = Vector3Normalize(Vector3CrossProduct(b1, direction)); + Vector3 capCenter = endPos; + + float baseSliceAngle = (2.0f*PI)/slices; + float baseRingAngle = PI * 0.5 / rings; + + rlBegin(RL_LINES); + rlColor4ub(color.r, color.g, color.b, color.a); + + // render both caps + for (int c = 0; c < 2; c++) + { + for (int i = 0; i < rings; i++) + { + for (int j = 0; j < slices; j++) + { + + // we build up the rings from capCenter in the direction of the 'direction' vector we computed earlier + + // as we iterate through the rings they must be placed higher above the center, the height we need is sin(angle(i)) + // as we iterate through the rings they must get smaller by the cos(angle(i)) + + // compute the four vertices + float ringSin1 = sinf(baseSliceAngle*(j + 0))*cosf(baseRingAngle * ( i + 0 )); + float ringCos1 = cosf(baseSliceAngle*(j + 0))*cosf(baseRingAngle * ( i + 0 )); + Vector3 w1 = (Vector3){ + capCenter.x + (sinf(baseRingAngle * ( i + 0 ))*b0.x + ringSin1*b1.x + ringCos1*b2.x) * radius, + capCenter.y + (sinf(baseRingAngle * ( i + 0 ))*b0.y + ringSin1*b1.y + ringCos1*b2.y) * radius, + capCenter.z + (sinf(baseRingAngle * ( i + 0 ))*b0.z + ringSin1*b1.z + ringCos1*b2.z) * radius + }; + float ringSin2 = sinf(baseSliceAngle*(j + 1))*cosf(baseRingAngle * ( i + 0 )); + float ringCos2 = cosf(baseSliceAngle*(j + 1))*cosf(baseRingAngle * ( i + 0 )); + Vector3 w2 = (Vector3){ + capCenter.x + (sinf(baseRingAngle * ( i + 0 ))*b0.x + ringSin2*b1.x + ringCos2*b2.x) * radius, + capCenter.y + (sinf(baseRingAngle * ( i + 0 ))*b0.y + ringSin2*b1.y + ringCos2*b2.y) * radius, + capCenter.z + (sinf(baseRingAngle * ( i + 0 ))*b0.z + ringSin2*b1.z + ringCos2*b2.z) * radius + }; + + float ringSin3 = sinf(baseSliceAngle*(j + 0))*cosf(baseRingAngle * ( i + 1 )); + float ringCos3 = cosf(baseSliceAngle*(j + 0))*cosf(baseRingAngle * ( i + 1 )); + Vector3 w3 = (Vector3){ + capCenter.x + (sinf(baseRingAngle * ( i + 1 ))*b0.x + ringSin3*b1.x + ringCos3*b2.x) * radius, + capCenter.y + (sinf(baseRingAngle * ( i + 1 ))*b0.y + ringSin3*b1.y + ringCos3*b2.y) * radius, + capCenter.z + (sinf(baseRingAngle * ( i + 1 ))*b0.z + ringSin3*b1.z + ringCos3*b2.z) * radius + }; + float ringSin4 = sinf(baseSliceAngle*(j + 1))*cosf(baseRingAngle * ( i + 1 )); + float ringCos4 = cosf(baseSliceAngle*(j + 1))*cosf(baseRingAngle * ( i + 1 )); + Vector3 w4 = (Vector3){ + capCenter.x + (sinf(baseRingAngle * ( i + 1 ))*b0.x + ringSin4*b1.x + ringCos4*b2.x) * radius, + capCenter.y + (sinf(baseRingAngle * ( i + 1 ))*b0.y + ringSin4*b1.y + ringCos4*b2.y) * radius, + capCenter.z + (sinf(baseRingAngle * ( i + 1 ))*b0.z + ringSin4*b1.z + ringCos4*b2.z) * radius + }; + + rlVertex3f(w1.x, w1.y, w1.z); + rlVertex3f(w2.x, w2.y, w2.z); + + rlVertex3f(w2.x, w2.y, w2.z); + rlVertex3f(w3.x, w3.y, w3.z); + + rlVertex3f(w1.x, w1.y, w1.z); + rlVertex3f(w3.x, w3.y, w3.z); + + rlVertex3f(w2.x, w2.y, w2.z); + rlVertex3f(w4.x, w4.y, w4.z); + + rlVertex3f(w3.x, w3.y, w3.z); + rlVertex3f(w4.x, w4.y, w4.z); + } + } + capCenter = startPos; + b0 = Vector3Scale(b0, -1.0f); + } + // render middle + if (!sphereCase) + { + for (int j = 0; j < slices; j++) + { + // compute the four vertices + float ringSin1 = sinf(baseSliceAngle*(j + 0))*radius; + float ringCos1 = cosf(baseSliceAngle*(j + 0))*radius; + Vector3 w1 = { + startPos.x + ringSin1*b1.x + ringCos1*b2.x, + startPos.y + ringSin1*b1.y + ringCos1*b2.y, + startPos.z + ringSin1*b1.z + ringCos1*b2.z + }; + float ringSin2 = sinf(baseSliceAngle*(j + 1))*radius; + float ringCos2 = cosf(baseSliceAngle*(j + 1))*radius; + Vector3 w2 = { + startPos.x + ringSin2*b1.x + ringCos2*b2.x, + startPos.y + ringSin2*b1.y + ringCos2*b2.y, + startPos.z + ringSin2*b1.z + ringCos2*b2.z + }; + + float ringSin3 = sinf(baseSliceAngle*(j + 0))*radius; + float ringCos3 = cosf(baseSliceAngle*(j + 0))*radius; + Vector3 w3 = { + endPos.x + ringSin3*b1.x + ringCos3*b2.x, + endPos.y + ringSin3*b1.y + ringCos3*b2.y, + endPos.z + ringSin3*b1.z + ringCos3*b2.z + }; + float ringSin4 = sinf(baseSliceAngle*(j + 1))*radius; + float ringCos4 = cosf(baseSliceAngle*(j + 1))*radius; + Vector3 w4 = { + endPos.x + ringSin4*b1.x + ringCos4*b2.x, + endPos.y + ringSin4*b1.y + ringCos4*b2.y, + endPos.z + ringSin4*b1.z + ringCos4*b2.z + }; + + rlVertex3f(w1.x, w1.y, w1.z); + rlVertex3f(w3.x, w3.y, w3.z); + + rlVertex3f(w2.x, w2.y, w2.z); + rlVertex3f(w4.x, w4.y, w4.z); + + rlVertex3f(w2.x, w2.y, w2.z); + rlVertex3f(w3.x, w3.y, w3.z); + } + } + rlEnd(); +} + // Draw a plane void DrawPlane(Vector3 centerPos, Vector2 size, Color color) {