From b8ea878292a4f4c69a486e6a922602a3f37681b1 Mon Sep 17 00:00:00 2001 From: "C. J. Howard" Date: Fri, 7 Aug 2020 18:39:03 -0700 Subject: [PATCH] Get spiral navigation working and statically link to SDL2 and OpenAL --- CMakeLists.txt | 36 +++++++++---------- src/application.cpp | 41 +++++++++++---------- src/application.hpp | 1 - src/nest.cpp | 7 +++- src/nest.hpp | 2 ++ src/scene/scene-object.cpp | 1 - src/state/play-state.cpp | 16 +++++---- src/systems/control-system.cpp | 65 +++++++++++++++++++++++++++++++++- src/systems/control-system.hpp | 13 +++++++ 9 files changed, 134 insertions(+), 48 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 42686fb..a4f2b0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ if(CMAKE_COMPILER_IS_GNUCC) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -g") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3") elseif(MSVC) - set(CMAKE_CXX_FLAGS "/W3 /MP /MD") + set(CMAKE_CXX_FLAGS "/W3 /MP /MT") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS}") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} /Ox") endif() @@ -25,7 +25,6 @@ find_package(OpenGL REQUIRED) find_package(SDL2 REQUIRED COMPONENTS SDL2::SDL2-static SDL2::SDL2main CONFIG) find_package(OpenAL REQUIRED CONFIG) - # Determine dependencies set(STATIC_LIBS vmq @@ -33,11 +32,11 @@ set(STATIC_LIBS stb glad EnTT - SDL2::SDL2main) -set(SHARED_LIBS - ${OPENGL_gl_LIBRARY} - SDL2::SDL2 + SDL2::SDL2-static + SDL2::SDL2main OpenAL::OpenAL) +set(SHARED_LIBS + ${OPENGL_gl_LIBRARY}) # Generate configuration header file configure_file(${PROJECT_SOURCE_DIR}/src/configuration.hpp.in @@ -84,6 +83,7 @@ endif() # Set link flags to show console window on debug builds and hide it on release builds if(MSVC) + #set_target_properties(${EXECUTABLE_TARGET} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:libvcruntime.lib") set_target_properties(${EXECUTABLE_TARGET} PROPERTIES LINK_FLAGS_DEBUG "/SUBSYSTEM:CONSOLE") set_target_properties(${EXECUTABLE_TARGET} PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /ENTRY:\"mainCRTStartup\"") endif(MSVC) @@ -105,19 +105,19 @@ elseif(PACKAGE_PLATFORM MATCHES "win") install(TARGETS ${EXECUTABLE_TARGET} DESTINATION .) # Install SDL2 DLLs - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - get_target_property(SDL2_DLL SDL2::SDL2 IMPORTED_LOCATION_DEBUG) - else() - get_target_property(SDL2_DLL SDL2::SDL2 IMPORTED_LOCATION_RELEASE) - endif() - install(FILES ${SDL2_DLL} DESTINATION .) + #if(CMAKE_BUILD_TYPE STREQUAL "Debug") + # get_target_property(SDL2_DLL SDL2::SDL2 IMPORTED_LOCATION_DEBUG) + #else() + # get_target_property(SDL2_DLL SDL2::SDL2 IMPORTED_LOCATION_RELEASE) + #endif() + #install(FILES ${SDL2_DLL} DESTINATION .) # Install OpenAL DLL - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - get_target_property(OPENAL_DLL OpenAL::OpenAL IMPORTED_LOCATION_DEBUG) - else() - get_target_property(OPENAL_DLL OpenAL::OpenAL IMPORTED_LOCATION_RELEASE) - endif() - install(FILES ${OPENAL_DLL} DESTINATION .) + #if(CMAKE_BUILD_TYPE STREQUAL "Debug") + # get_target_property(OPENAL_DLL OpenAL::OpenAL IMPORTED_LOCATION_DEBUG) + #else() + # get_target_property(OPENAL_DLL OpenAL::OpenAL IMPORTED_LOCATION_RELEASE) + #endif() + #install(FILES ${OPENAL_DLL} DESTINATION .) endif() diff --git a/src/application.cpp b/src/application.cpp index 2664c0b..2360392 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -109,6 +109,19 @@ application::application(int argc, char** argv): closed(false), exit_status(EXIT_SUCCESS) { + // Determine application name + std::string application_name; + #if defined(_WIN32) + application_name = "Antkeeper"; + #else + application_name = "antkeeper"; + #endif + + // Detect resource paths + data_path = get_data_path(application_name) + "data/"; + config_path = get_config_path(application_name); + screenshots_path = config_path + "screenshots/"; + // Format log messages logger.set_warning_prefix("Warning: "); logger.set_error_prefix(std::string()); @@ -118,27 +131,15 @@ application::application(int argc, char** argv): #if defined(DEBUG) logger.redirect(&std::cout); #else - std::string log_filename = "log.txt"; + std::string log_filename = config_path + "log.txt"; log_filestream.open(log_filename.c_str()); logger.redirect(&log_filestream); #endif - - // Determine application name - std::string application_name; - #if defined(_WIN32) - application_name = "Antkeeper"; - #else - application_name = "antkeeper"; - #endif - // Form resource paths - data_path = get_data_path(application_name) + "data/"; - config_path = get_config_path(application_name); + // Log paths logger.log("Detected data path as \"" + data_path + "\""); logger.log("Detected config path as \"" + config_path + "\""); - screenshots_path = config_path + "screenshots/"; - // Create nonexistent config directories std::vector config_paths; config_paths.push_back(config_path); @@ -241,10 +242,12 @@ application::application(int argc, char** argv): int window_height = 1080; fullscreen = true; + window_width = 1280; window_height = 720; fullscreen = false; + viewport = {0.0f, 0.0f, static_cast(window_width), static_cast(window_height)}; int window_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN; @@ -320,7 +323,7 @@ application::application(int argc, char** argv): SDL_GL_SwapWindow(window); // Hide cursor - SDL_ShowCursor(SDL_DISABLE); + //SDL_ShowCursor(SDL_DISABLE); // Init SDL joystick and game controller subsystems logger.push_task("Initializing SDL Joystick and Game Controller subsystems"); @@ -608,6 +611,7 @@ application::application(int argc, char** argv): control_system = new ::control_system(); control_system->set_orbit_cam(&orbit_cam); control_system->set_viewport(viewport); + control_system->set_underworld_camera(&underworld_camera); event_dispatcher.subscribe(control_system); event_dispatcher.subscribe(camera_system); event_dispatcher.subscribe(tool_system); @@ -758,8 +762,6 @@ application::application(int argc, char** argv): underworld_ambient_light.set_intensity(0.15f); underworld_ambient_light.update_tweens(); - // Darkness - darkness_volume.set_model(resource_manager->load("darkness-volume.obj")); lantern.set_model(resource_manager->load("lantern.obj")); // Cloud @@ -821,8 +823,7 @@ application::application(int argc, char** argv): // Setup underworld scene underworld_scene.add_object(&underworld_camera); underworld_scene.add_object(&underworld_ambient_light); - //underworld_scene.add_object(&darkness_volume); - underworld_scene.add_object(&lantern); + //underworld_scene.add_object(&lantern); underworld_scene.add_object(&subterrain_light); underworld_scene.add_object(portal_billboard); //model_instance* larva = new model_instance(resource_manager->load("larva.obj")); @@ -835,6 +836,8 @@ application::application(int argc, char** argv): model_instance* flashlight_light_cone = new model_instance(resource_manager->load("flashlight-light-cone.obj")); flashlight_light_cone->set_rotation(flashlight_rotation); underworld_scene.add_object(flashlight_light_cone); + + control_system->set_flashlight(flashlight, flashlight_light_cone); // Set overworld as active scene active_scene = &overworld_scene; diff --git a/src/application.hpp b/src/application.hpp index fd9a668..2c8350b 100644 --- a/src/application.hpp +++ b/src/application.hpp @@ -246,7 +246,6 @@ private: directional_light sun_direct; point_light subterrain_light; ambient_light underworld_ambient_light; - model_instance darkness_volume; model_instance lantern; model_instance cloud; model_instance* grass_patches; diff --git a/src/nest.cpp b/src/nest.cpp index 3b5bcf3..34fd8f8 100644 --- a/src/nest.cpp +++ b/src/nest.cpp @@ -42,7 +42,7 @@ float3 nest::extend_shaft(shaft& shaft) float dr = frand(dig_radius * 0.75f, dig_radius * 1.25f); - shaft.current_depth += dr * 0.5f; + shaft.current_depth += dr * 0.1f; return dig_position; } @@ -77,6 +77,11 @@ float nest::get_shaft_angle(const shaft& shaft, float depth) const return shaft.rotation + (depth / pitch) * shaft.chirality * vmq::two_pi; } +float nest::get_shaft_depth(const shaft& shaft, float turns) const +{ + return shaft.pitch[0] * turns; +} + float3 nest::get_shaft_position(const shaft& shaft, float depth) const { float shaft_length = shaft.depth[1] - shaft.depth[0]; diff --git a/src/nest.hpp b/src/nest.hpp index 57270e2..50286b1 100644 --- a/src/nest.hpp +++ b/src/nest.hpp @@ -76,6 +76,8 @@ public: float get_shaft_angle(const shaft& shaft, float depth) const; + float get_shaft_depth(const shaft& shaft, float turns) const; + private: float tunnel_radius; shaft central_shaft; diff --git a/src/scene/scene-object.cpp b/src/scene/scene-object.cpp index fd2f0e8..acbc9d4 100644 --- a/src/scene/scene-object.cpp +++ b/src/scene/scene-object.cpp @@ -60,4 +60,3 @@ void scene_object_base::look_at(const float3& position, const float3& target, co void scene_object_base::transformed() {} - diff --git a/src/state/play-state.cpp b/src/state/play-state.cpp index e60228e..e0fad97 100644 --- a/src/state/play-state.cpp +++ b/src/state/play-state.cpp @@ -58,7 +58,6 @@ void enter_play_state(application* app) // Load entity archetypes ecs::archetype* ant_hill_archetype = resource_manager->load("ant-hill.ent"); ecs::archetype* maple_tree_archetype = resource_manager->load("maple-tree.ent"); - ecs::archetype* darkness_volume_archetype = resource_manager->load("darkness-volume.ent"); ecs::archetype* nest_archetype = resource_manager->load("harvester-nest.ent"); ecs::archetype* samara_archetype = resource_manager->load("samara.ent"); ecs::archetype* forceps_archetype = resource_manager->load("forceps.ent"); @@ -100,7 +99,6 @@ void enter_play_state(application* app) placement.ray.direction = {0, -1, 0}; ecs_registry.assign(maple_tree_entity, placement); - //auto darkness_volume_entity = darkness_volume_archetype->create(ecs_registry); auto nest_entity = nest_archetype->create(ecs_registry); int terrain_radius = 2; @@ -174,12 +172,12 @@ void enter_play_state(application* app) float tunnel_radius = 1.15f; nest->set_tunnel_radius(tunnel_radius); nest::shaft* central_shaft = nest->get_central_shaft(); - central_shaft->chirality = -1.0f; + central_shaft->chirality = 1.0f; central_shaft->rotation = vmq::radians(0.0f); central_shaft->depth = {0.0f, 200.0f}; - central_shaft->radius = {0.0f, 5.0f}; - central_shaft->pitch = {4.0f, 8.0f}; - central_shaft->translation = {{{0.0f, 0.0f}, {40.0f, 26.0f}}}; + central_shaft->radius = {15.0f, 15.0f}; + central_shaft->pitch = {40.0f, 40.0f}; + central_shaft->translation = {{{0.0f, 0.0f}, {0.0f, 0.0f}}}; central_shaft->current_depth = 0.0f; for (std::size_t i = 0; i < 4; ++i) { @@ -194,7 +192,7 @@ void enter_play_state(application* app) // Dig nest shafts float shift = 0.1f; - for (int i = 0; i < 400; ++i) + for (int i = 0; i < 800; ++i) { ecs::cavity_component cavity; cavity.position = nest->extend_shaft(*nest->get_central_shaft()); @@ -205,6 +203,7 @@ void enter_play_state(application* app) } // Dig nest chambers + /* for (int i = 0; i < central_shaft->chambers.size(); ++i) { for (int j = 0; j < 150; ++j) @@ -217,8 +216,10 @@ void enter_play_state(application* app) ecs_registry.assign(ecs_registry.create(), cavity); } } + */ // Place larva in chamber + /* { auto larva_entity = larva_archetype->create(ecs_registry); auto& transform = ecs_registry.get(larva_entity); @@ -226,6 +227,7 @@ void enter_play_state(application* app) transform.transform.translation = nest->get_shaft_position(*central_shaft, central_shaft->depth[1]); //transform.transform.translation.y -= 1.0f; } + */ control_system* control_system = app->get_control_system(); control_system->update(0.0f); diff --git a/src/systems/control-system.cpp b/src/systems/control-system.cpp index 834208b..6a312e4 100644 --- a/src/systems/control-system.cpp +++ b/src/systems/control-system.cpp @@ -44,7 +44,11 @@ static inline T log_lerp(const T& x, const T& y, float a) control_system::control_system(): timestep(0.0f), - zoom(0.0f) + zoom(0.0f), + tool(nullptr), + flashlight(nullptr), + flashlight_light_cone(nullptr), + underworld_camera(nullptr) { control_set.add_control(&move_forward_control); control_set.add_control(&move_back_control); @@ -85,6 +89,12 @@ control_system::control_system(): nest = nullptr; orbit_cam = nullptr; + + mouse_angle = 0.0f; + old_mouse_angle = mouse_angle; + flashlight_turns = 0.0f; + flashlight_turns_i = 0; + flashlight_turns_f = 0.0f; } void control_system::update(float dt) @@ -208,6 +218,48 @@ void control_system::update(float dt) if (toggle_view_control.is_active() && !toggle_view_control.was_active()) { } + + + // Turn flashlight + + + float2 viewport_center = {(viewport[0] + viewport[2]) * 0.5f, (viewport[1] + viewport[3]) * 0.5f}; + float2 mouse_direction = vmq::normalize(mouse_position - viewport_center); + old_mouse_angle = mouse_angle; + mouse_angle = std::atan2(-mouse_direction.y, mouse_direction.x); + + if (mouse_angle - old_mouse_angle != 0.0f) + { + + + if (mouse_angle - old_mouse_angle <= -vmq::pi) + flashlight_turns_i -= 1; + else if (mouse_angle - old_mouse_angle >= vmq::pi) + flashlight_turns_i += 1; + + flashlight_turns_f = (mouse_angle) / vmq::two_pi; + flashlight_turns = flashlight_turns_i - flashlight_turns_f; + + if (flashlight && nest) + { + transform flashlight_transform = vmq::identity_transform; + + float flashlight_depth = nest->get_shaft_depth(*nest->get_central_shaft(), flashlight_turns); + + flashlight_transform.translation = {0.0f, -flashlight_depth, 0.0f}; + flashlight_transform.rotation = vmq::angle_axis(-flashlight_turns * vmq::two_pi + vmq::half_pi, {0, 1, 0}); + + flashlight->set_transform(flashlight_transform); + flashlight_light_cone->set_transform(flashlight_transform); + + if (underworld_camera) + { + underworld_camera->look_at({0, -flashlight_depth + 50.0f, 0}, {0, -flashlight_depth, 0}, {0, 0, -1}); + } + } + } + + } void control_system::set_orbit_cam(::orbit_cam* orbit_cam) @@ -225,11 +277,22 @@ void control_system::set_tool(model_instance* tool) this->tool = tool; } +void control_system::set_flashlight(model_instance* flashlight, model_instance* light_cone) +{ + this->flashlight = flashlight; + this->flashlight_light_cone = light_cone; +} + void control_system::set_viewport(const float4& viewport) { this->viewport = viewport; } +void control_system::set_underworld_camera(::camera* camera) +{ + this->underworld_camera = camera; +} + void control_system::handle_event(const mouse_moved_event& event) { if (adjust_camera_control.is_active()) diff --git a/src/systems/control-system.hpp b/src/systems/control-system.hpp index d11e255..2d3de9c 100644 --- a/src/systems/control-system.hpp +++ b/src/systems/control-system.hpp @@ -28,6 +28,7 @@ class orbit_cam; class nest; +class camera; class control_system: public event_handler @@ -40,7 +41,9 @@ public: void set_orbit_cam(orbit_cam* orbit_cam); void set_nest(::nest* nest); void set_tool(model_instance* tool); + void set_flashlight(model_instance* flashlight, model_instance* light_cone); void set_viewport(const float4& viewport); + void set_underworld_camera(::camera* camera); control_set* get_control_set(); control* get_move_forward_control(); @@ -100,6 +103,16 @@ private: model_instance* tool; float2 mouse_position; float4 viewport; + + model_instance* flashlight; + model_instance* flashlight_light_cone; + camera* underworld_camera; + + float mouse_angle; + float old_mouse_angle; + float flashlight_turns; + float flashlight_turns_i; + float flashlight_turns_f; }; inline control_set* control_system::get_control_set()