From 382cbda3dec3a8c9a45febbd14bc6f95e9c6a841 Mon Sep 17 00:00:00 2001 From: skullbulb Date: Sat, 9 Nov 2024 19:34:09 +0000 Subject: [PATCH] Added [models] example - skybox loading and drawing --- examples/models/skybox/main.go | 125 ++++++++++++++++++++++++++++++ examples/models/skybox/skybox.fs | 19 +++++ examples/models/skybox/skybox.png | Bin 0 -> 10992 bytes examples/models/skybox/skybox.vs | 24 ++++++ 4 files changed, 168 insertions(+) create mode 100644 examples/models/skybox/main.go create mode 100644 examples/models/skybox/skybox.fs create mode 100644 examples/models/skybox/skybox.png create mode 100644 examples/models/skybox/skybox.vs diff --git a/examples/models/skybox/main.go b/examples/models/skybox/main.go new file mode 100644 index 0000000..f43d633 --- /dev/null +++ b/examples/models/skybox/main.go @@ -0,0 +1,125 @@ +package main + +import ( + "fmt" + "path/filepath" + "unsafe" + + rl "github.com/gen2brain/raylib-go/raylib" +) + +func main() { + skyboxFilename := "skybox.png" + + rl.InitWindow(800, 450, "raylib [models] example - skybox loading and drawing") + + camera := rl.NewCamera3D( + rl.NewVector3(1.0, 1.0, 1.0), + rl.NewVector3(4.0, 1.0, 4.0), + rl.NewVector3(0.0, 1.0, 0.0), + 45.0, + rl.CameraPerspective, + ) + + // load skybox shader and set required locations + skyboxShader := rl.LoadShader("skybox.vs", "skybox.fs") + + setShaderIntValue(skyboxShader, "environmentMap", rl.MapCubemap) + + // load skybox model + cube := rl.GenMeshCube(1.0, 1.0, 1.0) + skybox := rl.LoadModelFromMesh(cube) + + skybox.Materials.Shader = skyboxShader + + // load cubemap texture + skyboxImg := rl.LoadImage(skyboxFilename) + + skyboxTexture := rl.LoadTextureCubemap(skyboxImg, rl.CubemapLayoutAutoDetect) + + rl.UnloadImage(skyboxImg) + + rl.SetMaterialTexture(skybox.Materials, rl.MapCubemap, skyboxTexture) + + // limit cursor to relative movement inside the window + rl.DisableCursor() + + // set our game to run at 60 frames-per-second + rl.SetTargetFPS(60) + + for !rl.WindowShouldClose() { + rl.UpdateCamera(&camera, rl.CameraFirstPerson) + + // load new cubemap texture on drag&drop + if rl.IsFileDropped() { + droppedFiles := rl.LoadDroppedFiles() + + // only support one file dropped + if len(droppedFiles) == 1 { + switch filepath.Ext(droppedFiles[0]) { + case ".png", ".jpg", ".bmp", ".tga": + skyboxFilename = droppedFiles[0] + + rl.UnloadTexture(skyboxTexture) + + img := rl.LoadImage(skyboxFilename) + + skyboxTexture = rl.LoadTextureCubemap(img, rl.CubemapLayoutAutoDetect) + + rl.UnloadImage(img) + + rl.SetMaterialTexture(skybox.Materials, rl.MapCubemap, skyboxTexture) + } + } + + rl.UnloadDroppedFiles() + } + + rl.BeginDrawing() + + rl.ClearBackground(rl.White) + + rl.BeginMode3D(camera) + + // we are inside the cube, we need to disable backface culling + rl.DisableBackfaceCulling() + rl.DisableDepthMask() + + rl.DrawModel(skybox, rl.NewVector3(0, 0, 0), 1.0, rl.White) + + // restore depth and backface culling + rl.EnableBackfaceCulling() + rl.EnableDepthMask() + + rl.DrawGrid(10, 1.0) + + rl.EndMode3D() + + rl.DrawText( + fmt.Sprintf("File: %s", skyboxFilename), + 10, + int32(rl.GetScreenHeight()-20), + 10, + rl.Black, + ) + + rl.DrawFPS(10, 10) + + rl.EndDrawing() + } + + rl.UnloadModel(skybox) + rl.UnloadTexture(skyboxTexture) + rl.UnloadShader(skyboxShader) + + rl.CloseWindow() +} + +func setShaderIntValue(shader rl.Shader, name string, value int32) { + rl.SetShaderValue( + shader, + rl.GetShaderLocation(shader, name), + unsafe.Slice((*float32)(unsafe.Pointer(&value)), 4), + rl.ShaderUniformInt, + ) +} diff --git a/examples/models/skybox/skybox.fs b/examples/models/skybox/skybox.fs new file mode 100644 index 0000000..25ae075 --- /dev/null +++ b/examples/models/skybox/skybox.fs @@ -0,0 +1,19 @@ +#version 330 + +// input vertex attributes (from vertex shader) +in vec3 fragPosition; + +// input uniform values +uniform samplerCube environmentMap; + +// output fragment color +out vec4 finalColor; + +void main() +{ + // fetch color from texture map + vec3 color = texture(environmentMap, fragPosition).rgb; + + // calculate final fragment color + finalColor = vec4(color, 1.0); +} \ No newline at end of file diff --git a/examples/models/skybox/skybox.png b/examples/models/skybox/skybox.png new file mode 100644 index 0000000000000000000000000000000000000000..36a79b2de5bee79b932730011d25e1e5f6209d48 GIT binary patch literal 10992 zcmeHN3sh5A);@^>;tQ)I-~&Rd1uaED1XLcuM}1U5ejkG^U{DmSfI(4t1#T?upyg$y z77ztyoK~x&;SCBQ5hMr#0Z||zgc_O<2!s&wGB@|kjgFm}KGt8?{AztX3X957`Y~QwdHvlv6sv(#$4gYz%Wj_V~Aw=!ox)I!IT`I;K z(?d6SZvdbuV-|YQ0B>`Bckcawr+~akY(R;1Phvd^*sFlg6tE93O4zT2k0-FU3G9&! zYaGYwq}ao8taSqGkYinw*fRy*AA2ChI8v-dhCP*Id?kD$$G8(%(>T_rzm#}cfhjai|-rT-0y@3|b+9%iR{ zt*_GLD~q&8^cyEEzy^W&e@F$rSGUaf2zt& z3>y_4GBaY=#br{)m4Pnj>{p3{Z)HX~cg5wO%Eqo`jvc#LFO zHGOW9jQfQyw5l2TV|fB_uT<~JH#za5Q9WDYD9B%=<+|j+=5Q5=sr*paH&`Ou-tEUB zyD9TW9U+f5Oo)^YTey*g{pvLm8$muv%k9jDXt)gQ7blY|UeIXP$_p~?m%7j$%}9EA zG+25&3t?EKaqIgXv5$&jc(R83xN|PO#IdgIO6o37jUyI|KmA<8?I@p1Piy91_0l$} zLz}RYIYROt|Mg%jjc{kAL#FAr<&gc9`F0NQZci&=yfK^q!rgDuay7;)hC8`vXqc@L z``Z`Ng}Y`mkyNBcLe6x8njQ{eTw~sE9pia}8H~!y3gONcG&Fpc5j)ATDlJC4dVWT_ z^sehsdvll?u?z%&2q8JNg9Iqy11d5@m1A};n=HsLv71hxRe%ddyqGp{I5muTJ#Xnr zWh&BIJ`b#-yU6p)8cpae9$<34&6v?;S3!Q6cpBTFEd-OhCA*-!SSH*_8RIu+@+ zHUVZ{xf<@XCr0cZdr;KOQ*UhkQpW8aBn%LbI>DS=HRv8%=EYFO(7x-7Qx7;Z{&?cN z4DbKy{oUMQ5F?k$f+j#U0#B*PhH*4y-LgQkVq_)5942PJ|8fj0n{U^G8uj7Yt%)_% zF76zerkC$+;Ui$>9YO`m;)5=NNJ47H<{YSg=-G`D#>Y!!CPjAF8U9gzeTsq0DNJ-^ zC5PoFsDNR`&@UU&0yV8zl(1jeem$R7qfo}V*QgifrPTquyk}LGI_J@-fDJj1q#G{lSEuE1kzXE4VJGy4*TS9`D)x zd26zaQcBVfuMlSCzz>+yf>uR?IoB!a(y;fq9J6~HM#+R!cu{B0(y`pMNREc`*bRg% zr1Nvv5~XSOQJM0t)*6}%hMsl89w`r@N;sxRgzyeDBS}W=i&j0KXNm;zy_MH&M1rut z4a5{vgSVtY>nKZH;Sw#hl(V)Eg8inO-5eYHytbOq zk&*|5!VwX@vY#Uu;W2Hwy6TG^HUb9eeF3XJynzbIU+Gw9HT=Is0vbEvo!(NOA?=Ll z5n8XFo!q3RI(Oilngm1YVXWdLkTe-076NgKb7IHoi}BZlb!w_BSKr|vq#nd7qJZR~ zFfUU)v?>}ygE%GzJRqPP`Wokm#K!m>G%FJCP-QzHW(pi@w>GH0M!$GyVj_267mvN* zdU{w&D{pmtg4iBuNJY+nl+MTaYz$c;r#x>nq5J2V$2M3pu`J}w4@+n#A4x+!S&!rF z^K?VkY^C>-k`k>h$n2dOa4cawXcCG&TB;^El-PWFZ%Au%ozUU8PTs_|D*_#N~xD zd*?b_yNUGSYBON>U#EG3ROBu%4Yx5s z+&@NF@lihqmWJv8LeLd$y#a|lp-8}7uLE>v>zGBLc3W1O6ZS)h zE9PxTpA~d>T0bJE+((71BCz&j)hF}M2zOudUP4!KSJ5!}5$*>?e-dS3Nci_ZtVlx^ zmMnonBHN(wi=;kWsu7p^Gd`1^Bb6%yX-gk|mI0U?afDt*MPUrLm$K-G&}hdb8TCCp zyF{OG&{DDJ)yW#_a*#JB5RmQHdmw`PawjE6^q2j0&bxwTO^v7E!XPxdOfI8Z>t#;Q z)60}=HPm-NCoS!>@-(u?V7s?T@YP{5F%_BPW(l|G0sTqG#{o6m5wXsKZWY>FWM<#m z%0J%Ls7bN!q7@9;WgLoy(Fa`btGkK?GO87>JB+8&xk7~`1`9J{cX(i8?#`?HD($At z)P%(;#$yI+u(aM`b=O>A#^#K6V7X8jaT*&jWdD_$`$RER-)CugQoGhg)znR01ece) zVyE%c?QlMUhsg6eN+Bx*gsc81b7ezxrTvijVm^l%8`#|9h&6_Pf`;jdU#%^KLh@C+ z7K91fkUi@W`|dnu?ELdfMk2*Y`$<| za$#w@y=iY&sDR11lCZ8nw(*Ny!KdTSRA{sAtj5kq97Mwma4U!8xO?+^Ooc4&WFQzzHeg0Um^ED@=w)OiQ^XKWBrTjaUe>{ApnQBuCVlWkK=HsC zc5}?a8ScxD!|)}x>m=3Hhs0moW9!Fu74+STU5#}fOGUO?Tf!zhhP%Ivm9R9@rU!D0 zBRFuA*|#n}wr=8Tq8mrv^GMdek7VezZC7J~mrtU$dZM$=)IcF?&z@GK3{;M*Hwgy^YnN>}kgB>ZIqB73 zs}4P;lQB&3^*E=e758$$Z8E$>97rNN_f7~CuTc3Oo~opPYTEIGXi1q;?KcyThwzAC zoRgZ)Jop|Vat-G0G&ynWT1nMxSmv6=ozEc$kEA1)aFos6lX&<>m5-r*#=r#R6j6_( zg!Y*}eBJsXyHteJX@M&kAZ8bd@xh3~`!tMsfH)p`HEj{UR&CP7)4yCBV2cw&DlFMY zWH0kF=@Mtl>{4Om)jRWX$aQ74IAnrb;M<@kP~>SCa$L+HE`o2zSG(ieo#LIY# zwh2_b$DxC0YldAAH2@(M$hKbT)9*pfElD&C!rlt)GGMo-L_IZ=9c@O50%^=CWVY@d zGp`0`9RJ%Hrj!Kj@n<%o3{s+EygA8pM=GlYtH?ompEqT?U(N7;C(->l-vL{!<%eJq zvldXRmVzhU&_zyN08S7KUUtm|=N5nnC94JPo$hr794&znLcTS4KHV!|Po_Dsw6rzAiBRH8ijAzlK|?UgxVQIWY^z@vHd%T|z&=qq12A!=m46<25C1 z&$GOq+H+pPe9cioJ%fIelJ5Ug(*E6OsoL3BaqG=tE-4u9dUKc+UQek%f%&8JOEh9DplM1D*FBb*AAO?UQNnu)+{(_QN;0;Q35dlVcHaLneMMO}G zr!akWo;B#vSLqIfHhmR*hOavMs?|