From b691df0e1b3eaa8ac167126cf96e6741eda621f6 Mon Sep 17 00:00:00 2001 From: Shariq Shah Date: Mon, 15 Oct 2018 21:24:59 +1100 Subject: [PATCH] Modifed ray intersection and Added misc windows related files --- README.md | 1 + misc/ed.bat | 3 +++ misc/launch_cmd.lnk | Bin 0 -> 1632 bytes misc/setup_env.bat | 8 ++++++++ src/common/hashmap.c | 10 +++++----- src/game/platform.c | 2 +- src/libsymmetry/bounding_volumes.h | 8 ++++++++ src/libsymmetry/camera.c | 22 -------------------- src/libsymmetry/editor.c | 31 ++++++++++++++++++++++++++++- src/libsymmetry/game.c | 14 ++++++------- src/libsymmetry/gui.c | 22 ++++++++++---------- src/libsymmetry/player.c | 3 ++- src/libsymmetry/scene.c | 11 +++++++--- src/libsymmetry/scene.h | 2 +- 14 files changed, 85 insertions(+), 52 deletions(-) create mode 100644 misc/ed.bat create mode 100644 misc/launch_cmd.lnk create mode 100644 misc/setup_env.bat diff --git a/README.md b/README.md index 398dcf4..702ea8a 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,7 @@ - ## TODO + - Fix mouse button press/release behaviour by investigating how sdl handles mouse release or by explicitly caching mouse state by using event callbacks recieved when a mousebutton release event is reported by sdl - Improve bounding sphere calculation - Screen mouse coordinates to world-coordinates for aiming - Player projectiles and sounds diff --git a/misc/ed.bat b/misc/ed.bat new file mode 100644 index 0000000..3362b41 --- /dev/null +++ b/misc/ed.bat @@ -0,0 +1,3 @@ +@echo off + +"C:\Program Files\emacs-26.1-x86_64\bin\runemacs.exe" diff --git a/misc/launch_cmd.lnk b/misc/launch_cmd.lnk new file mode 100644 index 0000000000000000000000000000000000000000..87a5784b853aa54623dddb01c0d1954ad20760e0 GIT binary patch literal 1632 zcmah}TWFI>6#mlIURKeRR;i-fMro-?)6}+J3V~{B&9c!}0#+rWX%jKKCXJhF>s#5k z)fQYtQ9&uyULI5sFMTjd)HfBWin}U!K?Qde5n*@nVcG8Y{eP1f6`c9cnRC85bN(}D z&Ws0ur8tWmNEjT=mynM#%9}4^X*IwrQW@^_F6kwmxeaFMHh(vJO7T z$0CR0*lbk08hk0Ew6GpEhO%Z&xWkIJP$baV9YZ4ukb`$u_IZ9C)r_4s-Gh1LW{~Oi z@#E*wh7ckMpcCDQacUMerM%jlR(SWsx`N@_#lXr8zc#1*4xjpx-{lu_;l&>M>p~D= z)Pl=Vg7q4?^?e?9ybK-TfIZj~{3u>`Tr={!>Om%#|;>J6|#w*y!61Uk1<2k?*s;`H&e^HnZA5 zA0?>9k1PaJ3p3L(TKdR?%*-xCv4v6uyZN_v_=zdPDZoHE$Hye?YAW^awO8l7%G$hk ztjT`%%(}y4n%hd^&IUGcREur*{}kF;wZk9n>Woq^v6sL3^Y+Nfxc@+De`Wu*b9?{0 zF*y83;ZRoVQO`}^xv$ONq7PQgKpy^PPzx7e%6LWrG4wieb=f-D&9^}R`kAC)@^agz9m;;yUEZMXV$wMSX;CNp?_HOkY>(KkGt$oMeoU#%BMg~ep zJ}L9!05gfrAfZvL@8wZFp8}^zmymormHAX=HM@fMDa!f_(W&lI$f!wk(R3|rBqd*B z=_*YHIs8LMrSst3!VAA4(ekil{5#^`%0NNt27c+_zy1oy19)2IPtMK?H=XW}x<}lN j_LI(@zInvA%fL;#7ujfOZ#&;~qWE+{^XQX*geTko2530_ literal 0 HcmV?d00001 diff --git a/misc/setup_env.bat b/misc/setup_env.bat new file mode 100644 index 0000000..c548b06 --- /dev/null +++ b/misc/setup_env.bat @@ -0,0 +1,8 @@ +@echo off + +call D:\VS_2017\VC\Auxiliary\Build\vcvarsall.bat x64 +cls +set edito="C:\Program Files\emacs-26.1-x86_64\bin\runemacs.exe" +set path=W:\misc;%path% rem + + diff --git a/src/common/hashmap.c b/src/common/hashmap.c index 0ec87ac..aa4228e 100644 --- a/src/common/hashmap.c +++ b/src/common/hashmap.c @@ -30,9 +30,9 @@ static struct Hashmap_Entry* hashmap_entry_new(struct Hashmap* hashmap, const ch { if(strncmp(key, hashmap->buckets[index][i].key, HASH_MAX_KEY_LEN) == 0) { - new_entry = &hashmap->buckets[index][i]; - if(new_entry->key) free(new_entry->key); - break; + new_entry = &hashmap->buckets[index][i]; + if(new_entry->key) free(new_entry->key); + break; } } if(!new_entry) new_entry = array_grow(hashmap->buckets[index], struct Hashmap_Entry); @@ -352,9 +352,9 @@ void hashmap_copy(struct Hashmap* from, struct Hashmap* to) { struct Variant* from_val = NULL; char* from_key = NULL; - + HASHMAP_FOREACH(from, from_key, from_val) { hashmap_value_set(to, from_key, from_val); } -} \ No newline at end of file +} diff --git a/src/game/platform.c b/src/game/platform.c index ed96999..516629f 100644 --- a/src/game/platform.c +++ b/src/game/platform.c @@ -347,7 +347,7 @@ int platform_mousebutton_state_get(uint button) { int pressed = 0; uint32 current_button_state = SDL_GetMouseState(NULL, NULL); - if((current_button_state & SDL_BUTTON(button)) > 0) pressed = 1; + if((current_button_state & SDL_BUTTON(button))) pressed = 1; return pressed; } diff --git a/src/libsymmetry/bounding_volumes.h b/src/libsymmetry/bounding_volumes.h index b5378ea..e34a333 100644 --- a/src/libsymmetry/bounding_volumes.h +++ b/src/libsymmetry/bounding_volumes.h @@ -4,6 +4,8 @@ #include "../common/linmath.h" #include "../common/num_types.h" +#define MAX_RAYCAST_ENTITIES_INTERSECT 256 + struct Bounding_Box { vec3 min; @@ -40,6 +42,12 @@ struct Ray vec3 origin; }; +struct Raycast_Result +{ + struct Entity* entities_intersected[MAX_RAYCAST_ENTITIES_INTERSECT]; + int num_entities_intersected; +}; + int bv_intersect_frustum_box(vec4* frustum, struct Bounding_Box* box, vec3* box_abs_position, vec3* box_abs_scale); int bv_intersect_frustum_sphere(vec4* frustum, struct Bounding_Sphere* sphere, vec3* sphere_abs_pos, vec3* sphere_abs_scale); bool bv_intersect_frustum_point(vec4* frustum, const vec3* point); diff --git a/src/libsymmetry/camera.c b/src/libsymmetry/camera.c index 3a823c9..4ccb63d 100644 --- a/src/libsymmetry/camera.c +++ b/src/libsymmetry/camera.c @@ -241,26 +241,4 @@ struct Ray camera_screen_coord_to_ray(struct Camera* camera, int mouse_x, int mo transform_get_absolute_position(&camera->base, &ray.origin); return ray; - - /*vec4 clip_coords = {normalized_x, normalized_y, -1.f, 1.f}; - vec4 ray_eye = {0.f}; - - mat4 inverse_proj_mat; - mat4_identity(&inverse_proj_mat); - mat4_inverse(&inverse_proj_mat, &camera->proj_mat); - vec4_mul_mat4(&ray_eye, &clip_coords, &inverse_proj_mat); - - ray_eye.z = -1.f; - ray_eye.w = 0.f; - - vec4 ray_world = {0.f}; - mat4 inverse_view_mat; - mat4_identity(&inverse_view_mat); - mat4_inverse(&inverse_view_mat, &camera->view_mat); - vec4_mul_mat4(&ray_world, &ray_eye, &inverse_view_mat); - - vec3 world_coords = {ray_world.x, ray_world.y, ray_world.z}; - vec3_norm(&world_coords, &world_coords); - - return world_coords;*/ } \ No newline at end of file diff --git a/src/libsymmetry/editor.c b/src/libsymmetry/editor.c index 34d3bbc..bf7a1cb 100644 --- a/src/libsymmetry/editor.c +++ b/src/libsymmetry/editor.c @@ -19,6 +19,7 @@ #include "../common/num_types.h" #include "../common/string_utils.h" #include "../common/common.h" +#include "bounding_volumes.h" #include "input.h" #include "scene.h" @@ -584,9 +585,37 @@ void editor_camera_update(float dt) else { input_mouse_mode_set(MM_NORMAL); - //log_message("ud : %.3f, lr : %.3f", turn_up_down, turn_left_right); turn_up_down *= dt; turn_left_right *= dt; + + //Picking + //If we're not looking around then allow picking + if(input_mousebutton_state_get(MSB_LEFT, KS_RELEASED)) + { + int mouse_x = 0, mouse_y = 0; + platform->mouse_position_get(&mouse_x, &mouse_y); + struct Ray ray = camera_screen_coord_to_ray(editor_camera, mouse_x, mouse_y); + //log_message("Ray: %.3f, %.3f, %.3f", ray.direction.x, ray.direction.y, ray.direction.z); + + struct Scene* scene = game_state_get()->scene; + struct Raycast_Result ray_result; + scene_ray_intersect(scene, &ray, &ray_result); + + if(ray_result.num_entities_intersected > 0) + { + //For now, just select the first entity that is intersected + struct Entity* intersected_entity = ray_result.entities_intersected[0]; + + if(editor_state.selected_entity && editor_state.selected_entity != intersected_entity) + { + editor_state.selected_entity->editor_selected = false; + editor_state.selected_entity = NULL; + } + + intersected_entity->editor_selected = true; + editor_state.selected_entity = intersected_entity; + } + } } total_up_down_rot += turn_up_down; diff --git a/src/libsymmetry/game.c b/src/libsymmetry/game.c index 060967e..92b72ef 100644 --- a/src/libsymmetry/game.c +++ b/src/libsymmetry/game.c @@ -1823,12 +1823,12 @@ void game_on_log_message(const char* message, va_list args) console_on_log_message(game_state->console, message, args); } -void game_on_log_warning(const char* warning_message, va_list args) -{ - console_on_log_warning(game_state->console, warning_message, args); -} - -void game_on_log_error(const char* context, const char* error_message, va_list args) +void game_on_log_warning(const char* warning_message, va_list args) { - console_on_log_error(game_state->console, context, error_message, args); + console_on_log_warning(game_state->console, warning_message, args); +} + +void game_on_log_error(const char* context, const char* error_message, va_list args) +{ + console_on_log_error(game_state->console, context, error_message, args); } \ No newline at end of file diff --git a/src/libsymmetry/gui.c b/src/libsymmetry/gui.c index 1189b4a..e874967 100644 --- a/src/libsymmetry/gui.c +++ b/src/libsymmetry/gui.c @@ -91,7 +91,7 @@ bool gui_init(void) platform->textinput_callback_set(&gui_handle_textinput_event); //gui_font_set("Ubuntu-R.ttf", 14); //gui_font_set("FiraSans-Regular.ttf", 14); - gui_font_set("roboto_condensed.ttf", 16); + gui_font_set("roboto_condensed.ttf", 18); // gui_theme_set(GT_RED); gui_theme_set(GT_DEFAULT); success = true; @@ -113,10 +113,10 @@ void gui_upload_atlas(const void *image, int width, int height) void gui_cleanup(void) { - nk_font_atlas_clear(&gui_state->atlas); + nk_font_atlas_clear(&gui_state->atlas); nk_free(&gui_state->context); - shader_remove(gui_state->shader); - texture_remove(gui_state->font_tex); + shader_remove(gui_state->shader); + texture_remove(gui_state->font_tex); glDeleteBuffers(1, &gui_state->vbo); glDeleteBuffers(1, &gui_state->ebo); nk_buffer_free(&gui_state->cmds); @@ -128,13 +128,13 @@ void gui_render(enum nk_anti_aliasing AA) int width, height; int display_width, display_height; struct nk_vec2 scale; - mat4 gui_mat; + mat4 gui_mat; - mat4_identity(&gui_mat); - struct Game_State* game_state = game_state_get(); + mat4_identity(&gui_mat); + struct Game_State* game_state = game_state_get(); platform->window.get_size(game_state->window, &width, &height); platform->window.get_drawable_size(game_state->window, &display_width, &display_height); - mat4_ortho(&gui_mat, 0, display_width, display_height, 0, -100, 100); + mat4_ortho(&gui_mat, 0.f, display_width, display_height, 0.f, -100.f, 100.f); scale.x = (float)display_width/(float)width; scale.y = (float)display_height/(float)height; @@ -149,9 +149,9 @@ void gui_render(enum nk_anti_aliasing AA) glEnable(GL_SCISSOR_TEST); /* setup program */ - shader_bind(gui_state->shader); + shader_bind(gui_state->shader); glUniform1i(gui_state->uniform_tex, 0); - shader_set_uniform(UT_MAT4, gui_state->uniform_proj, &gui_mat); + shader_set_uniform(UT_MAT4, gui_state->uniform_proj, &gui_mat); { /* convert from command queue into draw list and draw to screen */ const struct nk_draw_command *cmd; @@ -173,7 +173,7 @@ void gui_render(enum nk_anti_aliasing AA) /* fill convert configuration */ struct nk_convert_config config; static const struct nk_draw_vertex_layout_element vertex_layout[] = - { + { {NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct Gui_Vertex, pos)}, {NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct Gui_Vertex, uv)}, {NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct Gui_Vertex, col)}, diff --git a/src/libsymmetry/player.c b/src/libsymmetry/player.c index c6d2381..1eb2328 100644 --- a/src/libsymmetry/player.c +++ b/src/libsymmetry/player.c @@ -76,6 +76,7 @@ void player_update(struct Player* player, struct Scene* scene, float dt) struct Ray ray = camera_screen_coord_to_ray(player->camera_node, mouse_x, mouse_y); log_message("Ray: %.3f, %.3f, %.3f", ray.direction.x, ray.direction.y, ray.direction.z); - scene_ray_intersect(scene, &ray); + struct Raycast_Result ray_result; + scene_ray_intersect(scene, &ray, &ray_result); } } diff --git a/src/libsymmetry/scene.c b/src/libsymmetry/scene.c index 282dfa0..7c9271e 100644 --- a/src/libsymmetry/scene.c +++ b/src/libsymmetry/scene.c @@ -555,9 +555,13 @@ void scene_entity_parent_set(struct Scene* scene, struct Entity* entity, struct transform_parent_set(entity, parent, true); } - -void scene_ray_intersect(struct Scene* scene, struct Ray* ray) +void scene_ray_intersect(struct Scene* scene, struct Ray* ray, struct Raycast_Result* out_results) { + assert(out_results); + + memset(&out_results[0], '\0', sizeof(struct Entity*) * MAX_RAYCAST_ENTITIES_INTERSECT); + out_results->num_entities_intersected = 0; + for(int i = 0; i < MAX_STATIC_MESHES; i++) { struct Static_Mesh* mesh = &scene->static_meshes[i]; @@ -568,7 +572,8 @@ void scene_ray_intersect(struct Scene* scene, struct Ray* ray) struct Geometry* geometry = geom_get(mesh->model.geometry_index); if(bv_intersect_sphere_ray(&geometry->bounding_sphere, &abs_pos, ray)) { - log_message("Ray intersected with %s", &mesh->base.name); + out_results->entities_intersected[out_results->num_entities_intersected] = &mesh->base; + out_results->num_entities_intersected++; } } } diff --git a/src/libsymmetry/scene.h b/src/libsymmetry/scene.h index 2dc24d2..52aaef9 100644 --- a/src/libsymmetry/scene.h +++ b/src/libsymmetry/scene.h @@ -56,7 +56,7 @@ struct Entity* scene_base_entity_get(struct Scene* scene, int id, int type void scene_entity_parent_set(struct Scene* scene, struct Entity* entity, struct Entity* parent); void scene_entity_parent_reset(struct Scene* scene, struct Entity* entity); // Sets root entity as parent -void scene_ray_intersect(struct Scene* scene, struct Ray* ray); +void scene_ray_intersect(struct Scene* scene, struct Ray* ray, struct Raycast_Result* out_results); // //void scene_init(void);