lost_soul

A 3D walking simulator game
Log | Files | Refs | README | LICENSE

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 }