main.odin (6364B)
1 package main 2 3 import "core:c" 4 import "core:fmt" 5 import "core:math" 6 import "core:math/rand" 7 //import "vendor:miniaudio" 8 import rl "vendor:raylib" 9 10 velocity: f32 = 0.50 11 velocity_speed: f32 = 1.0 12 speed: f32 = 400 13 14 SCREEN_WIDTH: c.int 15 SCREEN_HEIGHT: c.int 16 17 shader: rl.Shader 18 camera: rl.Camera 19 20 init :: proc() { 21 //rl.SetTraceLogLevel(.NONE) 22 rl.SetConfigFlags( 23 { 24 rl.ConfigFlag.WINDOW_RESIZABLE, 25 rl.ConfigFlag.VSYNC_HINT, 26 rl.ConfigFlag.BORDERLESS_WINDOWED_MODE, 27 }, 28 ) 29 rl.SetTraceLogLevel(rl.TraceLogLevel.ALL) 30 rl.SetTargetFPS(60) 31 rl.InitWindow(1024, 768, "Lost Soul") 32 SCREEN_WIDTH = rl.GetScreenWidth() 33 SCREEN_HEIGHT = rl.GetScreenHeight() 34 //monitor := rl.GetCurrentMonitor() 35 //rl.SetWindowSize(rl.GetMonitorWidth(monitor), rl.GetMonitorHeight(monitor)) 36 rl.InitAudioDevice() 37 } 38 39 input :: proc(dt: f32) { 40 if rl.IsKeyDown(rl.KeyboardKey.TAB) { 41 rl.EnableCursor() 42 } 43 44 if rl.IsKeyDown(rl.KeyboardKey.ONE) { 45 rl.DisableCursor() 46 } 47 48 if rl.IsKeyPressed(rl.KeyboardKey.BACKSPACE) { 49 tmp := camera.target 50 pos := camera.position 51 fmt.println("TARGET: %v - %v - %v \n", tmp.x, tmp.y, tmp.z) 52 fmt.println("POSITION: %v - %v - %v \n", pos.xyz) 53 } 54 55 if rl.IsKeyDown(rl.KeyboardKey.LEFT_SHIFT) { 56 velocity *= velocity_speed * 2.0 57 } 58 } 59 60 setup_camera :: proc() { 61 camera.position = {-1.7414374, 2, 3.4975357} // Camera position 62 camera.target = {8.08, 5.36, 3.28} // Camera looking at point 63 camera.up = {0.0, 1.0, 0.0} // Camera up vector (rotation towards target) 64 camera.fovy = 90.0 // Camera field-of-view Y 65 camera.projection = rl.CameraProjection.PERSPECTIVE // Camera mode type 66 rl.DisableCursor() 67 } 68 69 draw_crosshair :: proc() { 70 rl.DrawCircle((SCREEN_WIDTH / 2) - 1, (SCREEN_HEIGHT / 2) - 1, 2, rl.WHITE) 71 } 72 73 window_resized :: proc() { 74 SCREEN_WIDTH = rl.GetScreenWidth() 75 SCREEN_HEIGHT = rl.GetScreenHeight() 76 } 77 78 main :: proc() { 79 80 init() 81 82 //perlin := rl.GenImagePerlinNoise(1000, 1000, 0, 0, 10) 83 //rl.ExportImage(perlin, "assets/textures/perlin.png") 84 85 //// Load from memory. very nice way 86 // foo := #load("assets/player/hooded.png") 87 // foo_img := rl.LoadImageFromMemory(".png", &foo[0], i32(len(foo))) 88 // player_ani := AnimationComponent{rl.LoadTextureFromImage(foo_img), false, 0.1, 0, 0} 89 90 //test := #load("common/teapot.obj") 91 music := #load("assets/music/o.mp3") 92 soilData := #load("assets/textures/soil.png") 93 soil_img := rl.LoadImageFromMemory(".png", &soilData[0], i32(len(soilData))) 94 soil := rl.LoadTextureFromImage(soil_img) 95 rl.UnloadImage(soil_img) 96 defer rl.UnloadTexture(soil) 97 98 kosniData := #load("assets/textures/kosni.png") 99 kosni_img := rl.LoadImageFromMemory(".png", &kosniData[0], i32(len(kosniData))) 100 rl.ImageRotate(&kosni_img, 180) 101 kosni := rl.LoadTextureFromImage(kosni_img) 102 rl.UnloadImage(kosni_img) 103 defer rl.UnloadTexture(kosni) 104 105 next_frame: u32 = 1 106 timer: f32 = 0 107 108 setup_camera() 109 model := rl.LoadModel("common/cow.obj") // Load model 110 111 audio := rl.LoadMusicStreamFromMemory(".mp3", &music[0], i32(len(music))) 112 rl.PlayMusicStream(audio) 113 rl.SetMusicVolume(audio, 0.2) 114 // audio := rl.LoadMusicStream("assets/music/o.wav") 115 // rl.PlayMusicStream(audio) 116 117 //terrainMesh: rl.Mesh = rl.GenMeshPlane(100, 100, 1, 1) 118 //fmt.println(terrainMesh.texcoords[:12]) 119 for i: c.int = 0; i < 12; i += 1 { 120 //fmt.println(terrainMesh.vertexCount) 121 //terrainMesh.texcoords[i] *= 10 122 } 123 //terrainModel: rl.Model = rl.LoadModelFromMesh(terrainMesh) 124 //terrainModel: rl.Model = rl.LoadModelFromMesh(rl.GenMeshPlane(10, 10, 10, 10)) 125 //terrainModel.materials[0].maps[rl.MaterialMapIndex.ALBEDO].texture = soil 126 127 tmp := rl.GenMeshCube(20, 20, 20) 128 cube: rl.Model = rl.LoadModelFromMesh(tmp) 129 cube.materials[0].maps[rl.MaterialMapIndex.ALBEDO].texture = kosni 130 131 132 // tmp := rl.LoadImage("assets/skybox/cubemap.png") 133 // cubemap: rl.TextureCubemap = rl.LoadTextureCubemap(tmp, rl.CubemapLayout.AUTO_DETECT) 134 135 // Skybox stuff 136 // Load skybox model 137 ccube := rl.GenMeshCube(1.0, 1.0, 1.0) 138 skybox := rl.LoadModelFromMesh(rl.GenMeshCube(1, 1, 1)) 139 140 skybox.materials[0].shader = rl.LoadShader("shaders/skybox.vs", "shaders/skybox.fs") 141 142 //rl.SetShaderValue( 143 // skybox.materials[0].shader, 144 // rl.GetShaderLocation(skybox.materials[0].shader, "environmentMap"), 145 // rawptr(uintptr(rl.MaterialMapIndex.CUBEMAP)), 146 // rl.ShaderUniformDataType.INT, 147 //) 148 149 //rl.SetShaderValue( 150 // skybox.materials[0].shader, 151 // rl.GetShaderLocation(skybox.materials[0].shader, "doGamma"), 152 // rawptr(uintptr(0)), 153 // rl.ShaderUniformDataType.INT, 154 //) 155 156 // rl.SetShaderValue( 157 // skybox.materials[0].shader, 158 // rl.GetShaderLocation(skybox.materials[0].shader, "vflipped"), 159 // rawptr(uintptr(0)), 160 // rl.ShaderUniformDataType.INT, 161 // ) 162 163 // Load cubemap shader and setup required shader locations 164 shdrCubemap := rl.LoadShader("shaders/cubemap.vs", "shaders/cubemap.fs") 165 166 //rl.SetShaderValue( 167 // shdrCubemap, 168 // rl.GetShaderLocation(shdrCubemap, "equirectangularMap"), 169 // rawptr(uintptr(0)), 170 // rl.ShaderUniformDataType.INT, 171 //) 172 173 174 // Create a RenderTexture2D to be used for render to texture 175 shader := rl.LoadShader(cstring(""), "shaders/blur.fs") 176 target := rl.LoadRenderTexture(1024, 768) 177 178 height_img := rl.LoadImage("assets/textures/perlin.png") 179 height_tex := rl.LoadTextureFromImage(height_img) 180 height := rl.GenMeshHeightmap(height_img, {20, 1, 20}) 181 heightModel := rl.LoadModelFromMesh(height) 182 183 heightModel.materials[0].maps[rl.MaterialMapIndex.ALBEDO].texture = kosni 184 bd := rl.GetMeshBoundingBox(height) 185 mat := rl.LoadMaterialDefault() 186 ho := rl.GenMeshCube(5, 5, 5) 187 188 rl.SetMaterialTexture(&mat, rl.MaterialMapIndex.ALBEDO, soil) 189 instanceShader: rl.Shader = rl.LoadShader("", "shaders/instance.vs") 190 191 matrices := [dynamic]rl.Matrix{rl.MatrixIdentity()} 192 193 for !rl.WindowShouldClose() { 194 195 if (rl.IsWindowResized()) { 196 window_resized() 197 } 198 199 frame_counter := rl.GetFrameTime() 200 201 input(frame_counter) 202 203 rl.UpdateMusicStream(audio) 204 205 rl.UpdateCamera(&camera, rl.CameraMode.FIRST_PERSON) 206 207 rl.BeginDrawing() 208 209 rl.ClearBackground({33, 33, 33, 255}) 210 211 rl.BeginMode3D(camera) 212 213 //rl.DrawCubeWires({0, 0, 0}, 20, 20, 20, rl.YELLOW) 214 215 //rl.DrawMesh(ho, mat, rl.MatrixIdentity()) 216 rl.DrawMeshInstanced(ho, mat, raw_data(matrices[:]), 1) 217 218 rl.DrawModelWires(heightModel, {-8.0, 0, -8.0}, 1, rl.BLACK) 219 220 rl.EndMode3D() 221 222 draw_crosshair() 223 224 rl.DrawFPS(5, 5) 225 226 rl.EndDrawing() 227 } 228 229 rl.CloseWindow() 230 rl.CloseAudioDevice() 231 }