diff --git a/CMakeLists.txt b/CMakeLists.txt
index af368e1..d4aa351 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,5 @@
cmake_minimum_required(VERSION 3.7)
-
option(VERSION_STRING "Project version string" "0.0.0")
project(antkeeper VERSION ${VERSION_STRING} LANGUAGES CXX)
diff --git a/src/entity/components/camera.hpp b/src/entity/components/camera.hpp
new file mode 100644
index 0000000..0d2fd83
--- /dev/null
+++ b/src/entity/components/camera.hpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2021 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#ifndef ANTKEEPER_ENTITY_COMPONENT_CAMERA_HPP
+#define ANTKEEPER_ENTITY_COMPONENT_CAMERA_HPP
+
+#include "scene/camera.hpp"
+
+namespace entity {
+namespace component {
+
+struct flight_controller
+{
+
+};
+
+} // namespace component
+} // namespace entity
+
+#endif // ANTKEEPER_ENTITY_COMPONENT_CAMERA_HPP
+
diff --git a/src/entity/systems/astronomy.cpp b/src/entity/systems/astronomy.cpp
index 3d60135..458055c 100644
--- a/src/entity/systems/astronomy.cpp
+++ b/src/entity/systems/astronomy.cpp
@@ -177,15 +177,22 @@ void astronomy::update(double t, double dt)
)
);
+
+ // Sun color at the outer atmosphere
+ float3 sun_color_outer = math::type_cast(blackbody.luminous_intensity * distance_attenuation);
+
+ // Sun color at sea level
+ float3 sun_color_inner = math::type_cast(blackbody.luminous_intensity * distance_attenuation * atmospheric_transmittance);
+
// Update blackbody light color and intensity
- sun_light->set_color(math::type_cast(blackbody.luminous_intensity * atmospheric_transmittance));
- sun_light->set_intensity(static_cast(distance_attenuation));
+ sun_light->set_color(sun_color_inner);
+ sun_light->set_intensity(1.0f);
// Upload blackbody params to sky pass
if (this->sky_pass)
{
this->sky_pass->set_sun_position(math::type_cast(blackbody_position_topocentric));
- this->sky_pass->set_sun_color(math::type_cast(blackbody.luminous_intensity * distance_attenuation));
+ this->sky_pass->set_sun_color(sun_color_outer, sun_color_inner);
double blackbody_angular_radius = std::asin((celestial_body.radius * 2.0) / (blackbody_distance * 2.0));
this->sky_pass->set_sun_angular_radius(static_cast(blackbody_angular_radius));
diff --git a/src/entity/systems/control.cpp b/src/entity/systems/control.cpp
index cf03f7b..d6a946d 100644
--- a/src/entity/systems/control.cpp
+++ b/src/entity/systems/control.cpp
@@ -37,7 +37,7 @@ control::control(entity::registry& registry):
zoom(0.0f),
tool(nullptr),
flashlight_entity(entt::null),
- underworld_camera(nullptr)
+ underground_camera(nullptr)
{
control_set.add_control(&move_forward_control);
control_set.add_control(&move_back_control);
@@ -186,9 +186,9 @@ void control::update(double t, double dt)
command::set_transform(registry, flashlight_entity, flashlight_transform, false);
- if (underworld_camera)
+ if (underground_camera)
{
- underworld_camera->look_at({0, -flashlight_depth + 50.0f, 0}, {0, -flashlight_depth, 0}, {0, 0, -1});
+ underground_camera->look_at({0, -flashlight_depth + 50.0f, 0}, {0, -flashlight_depth, 0}, {0, 0, -1});
}
}
}
@@ -224,9 +224,9 @@ void control::set_viewport(const float4& viewport)
this->viewport = viewport;
}
-void control::set_underworld_camera(scene::camera* camera)
+void control::set_underground_camera(scene::camera* camera)
{
- this->underworld_camera = camera;
+ this->underground_camera = camera;
}
void control::handle_event(const mouse_moved_event& event)
diff --git a/src/entity/systems/control.hpp b/src/entity/systems/control.hpp
index ffa930a..1c0ad83 100644
--- a/src/entity/systems/control.hpp
+++ b/src/entity/systems/control.hpp
@@ -58,7 +58,7 @@ public:
void set_camera_subject(entity::id entity_id);
void set_viewport(const float4& viewport);
- void set_underworld_camera(scene::camera* camera);
+ void set_underground_camera(scene::camera* camera);
input::control_set* get_control_set();
input::control* get_move_forward_control();
@@ -148,7 +148,7 @@ private:
entity::id flashlight_entity;
entity::id camera_subject_entity;
- scene::camera* underworld_camera;
+ scene::camera* underground_camera;
float mouse_angle;
float old_mouse_angle;
diff --git a/src/game/bootloader.cpp b/src/game/bootloader.cpp
index 8228541..1db363f 100644
--- a/src/game/bootloader.cpp
+++ b/src/game/bootloader.cpp
@@ -497,71 +497,87 @@ void setup_rendering(game::context* ctx)
// Load fallback material
ctx->fallback_material = ctx->resource_manager->load("fallback.mtl");
- // Setup overworld compositor
- ctx->overworld_shadow_map_clear_pass = new clear_pass(ctx->rasterizer, ctx->shadow_map_framebuffer);
- ctx->overworld_shadow_map_clear_pass->set_cleared_buffers(false, true, false);
- ctx->overworld_shadow_map_clear_pass->set_clear_depth(1.0f);
- ctx->overworld_shadow_map_pass = new shadow_map_pass(ctx->rasterizer, ctx->shadow_map_framebuffer, ctx->resource_manager);
- ctx->overworld_shadow_map_pass->set_split_scheme_weight(0.75f);
- ctx->overworld_clear_pass = new clear_pass(ctx->rasterizer, ctx->framebuffer_hdr);
- ctx->overworld_clear_pass->set_cleared_buffers(true, true, true);
- ctx->overworld_clear_pass->set_clear_depth(0.0f);
- ctx->overworld_sky_pass = new sky_pass(ctx->rasterizer, ctx->framebuffer_hdr, ctx->resource_manager);
- ctx->app->get_event_dispatcher()->subscribe(ctx->overworld_sky_pass);
- ctx->overworld_sky_pass->set_enabled(true);
- ctx->overworld_material_pass = new material_pass(ctx->rasterizer, ctx->framebuffer_hdr, ctx->resource_manager);
- ctx->overworld_material_pass->set_fallback_material(ctx->fallback_material);
- ctx->overworld_material_pass->shadow_map_pass = ctx->overworld_shadow_map_pass;
- ctx->overworld_material_pass->shadow_map = ctx->shadow_map_depth_texture;
- ctx->app->get_event_dispatcher()->subscribe(ctx->overworld_material_pass);
- ctx->overworld_outline_pass = new outline_pass(ctx->rasterizer, ctx->framebuffer_hdr, ctx->resource_manager);
- ctx->overworld_outline_pass->set_outline_width(0.25f);
- ctx->overworld_outline_pass->set_outline_color(float4{1.0f, 1.0f, 1.0f, 1.0f});
- ctx->overworld_outline_pass->set_enabled(false);
- ctx->overworld_bloom_pass = new bloom_pass(ctx->rasterizer, ctx->framebuffer_bloom, ctx->resource_manager);
- ctx->overworld_bloom_pass->set_source_texture(ctx->framebuffer_hdr_color);
- ctx->overworld_bloom_pass->set_brightness_threshold(1.0f);
- ctx->overworld_bloom_pass->set_blur_iterations(5);
- ctx->overworld_bloom_pass->set_enabled(true);
- ctx->overworld_final_pass = new ::final_pass(ctx->rasterizer, &ctx->rasterizer->get_default_framebuffer(), ctx->resource_manager);
- ctx->overworld_final_pass->set_color_texture(ctx->framebuffer_hdr_color);
- ctx->overworld_final_pass->set_bloom_texture(ctx->bloom_texture);
- ctx->overworld_final_pass->set_blue_noise_texture(blue_noise_map);
- ctx->overworld_compositor = new compositor();
- ctx->overworld_compositor->add_pass(ctx->overworld_shadow_map_clear_pass);
- ctx->overworld_compositor->add_pass(ctx->overworld_shadow_map_pass);
- ctx->overworld_compositor->add_pass(ctx->overworld_clear_pass);
- ctx->overworld_compositor->add_pass(ctx->overworld_sky_pass);
- ctx->overworld_compositor->add_pass(ctx->overworld_material_pass);
- //ctx->overworld_compositor->add_pass(ctx->overworld_outline_pass);
- ctx->overworld_compositor->add_pass(ctx->overworld_bloom_pass);
- ctx->overworld_compositor->add_pass(ctx->overworld_final_pass);
-
- // Setup underworld compositor
- ctx->underworld_clear_pass = new clear_pass(ctx->rasterizer, ctx->framebuffer_hdr);
- ctx->underworld_clear_pass->set_cleared_buffers(true, true, false);
- ctx->underworld_material_pass = new material_pass(ctx->rasterizer, ctx->framebuffer_hdr, ctx->resource_manager);
- ctx->underworld_material_pass->set_fallback_material(ctx->fallback_material);
- ctx->app->get_event_dispatcher()->subscribe(ctx->underworld_material_pass);
- gl::shader_program* underworld_final_shader = ctx->resource_manager->load("underground-final.glsl");
- ctx->underworld_final_pass = new simple_render_pass(ctx->rasterizer, &ctx->rasterizer->get_default_framebuffer(), underworld_final_shader);
- ctx->underground_color_texture_property = ctx->underworld_final_pass->get_material()->add_property("color_texture");
- ctx->underground_color_texture_property->set_value(ctx->framebuffer_hdr_color);
- ctx->underworld_final_pass->get_material()->update_tweens();
- ctx->underworld_compositor = new compositor();
- ctx->underworld_compositor->add_pass(ctx->underworld_clear_pass);
- ctx->underworld_compositor->add_pass(ctx->underworld_material_pass);
- ctx->underworld_compositor->add_pass(ctx->underworld_final_pass);
-
- // Setup UI camera compositor
- ctx->ui_clear_pass = new clear_pass(ctx->rasterizer, &ctx->rasterizer->get_default_framebuffer());
- ctx->ui_clear_pass->set_cleared_buffers(false, true, false);
- ctx->ui_clear_pass->set_clear_depth(0.0f);
- ctx->ui_material_pass = new material_pass(ctx->rasterizer, &ctx->rasterizer->get_default_framebuffer(), ctx->resource_manager);
- ctx->ui_material_pass->set_fallback_material(ctx->fallback_material);
- ctx->ui_compositor = new compositor();
- ctx->ui_compositor->add_pass(ctx->ui_clear_pass);
- ctx->ui_compositor->add_pass(ctx->ui_material_pass);
+ // Setup common render passes
+ {
+ ctx->common_bloom_pass = new bloom_pass(ctx->rasterizer, ctx->framebuffer_bloom, ctx->resource_manager);
+ ctx->common_bloom_pass->set_source_texture(ctx->framebuffer_hdr_color);
+ ctx->common_bloom_pass->set_brightness_threshold(1.0f);
+ ctx->common_bloom_pass->set_blur_iterations(5);
+
+ ctx->common_final_pass = new ::final_pass(ctx->rasterizer, &ctx->rasterizer->get_default_framebuffer(), ctx->resource_manager);
+ ctx->common_final_pass->set_color_texture(ctx->framebuffer_hdr_color);
+ ctx->common_final_pass->set_bloom_texture(ctx->bloom_texture);
+ ctx->common_final_pass->set_blue_noise_texture(blue_noise_map);
+ }
+
+ // Setup UI compositor
+ {
+ ctx->ui_clear_pass = new clear_pass(ctx->rasterizer, &ctx->rasterizer->get_default_framebuffer());
+ ctx->ui_clear_pass->set_cleared_buffers(false, true, false);
+ ctx->ui_clear_pass->set_clear_depth(0.0f);
+
+ ctx->ui_material_pass = new material_pass(ctx->rasterizer, &ctx->rasterizer->get_default_framebuffer(), ctx->resource_manager);
+ ctx->ui_material_pass->set_fallback_material(ctx->fallback_material);
+
+ ctx->ui_compositor = new compositor();
+ ctx->ui_compositor->add_pass(ctx->ui_clear_pass);
+ ctx->ui_compositor->add_pass(ctx->ui_material_pass);
+ }
+
+ // Setup underground compositor
+ {
+ ctx->underground_clear_pass = new clear_pass(ctx->rasterizer, ctx->framebuffer_hdr);
+ ctx->underground_clear_pass->set_cleared_buffers(true, true, false);
+ ctx->underground_clear_pass->set_clear_color({1, 0, 1, 0});
+ ctx->underground_clear_pass->set_clear_depth(0.0f);
+
+ ctx->underground_material_pass = new material_pass(ctx->rasterizer, ctx->framebuffer_hdr, ctx->resource_manager);
+ ctx->underground_material_pass->set_fallback_material(ctx->fallback_material);
+ ctx->app->get_event_dispatcher()->subscribe(ctx->underground_material_pass);
+
+ ctx->underground_compositor = new compositor();
+ ctx->underground_compositor->add_pass(ctx->underground_clear_pass);
+ ctx->underground_compositor->add_pass(ctx->underground_material_pass);
+ ctx->underground_compositor->add_pass(ctx->common_bloom_pass);
+ ctx->underground_compositor->add_pass(ctx->common_final_pass);
+ }
+
+ // Setup surface compositor
+ {
+ ctx->surface_shadow_map_clear_pass = new clear_pass(ctx->rasterizer, ctx->shadow_map_framebuffer);
+ ctx->surface_shadow_map_clear_pass->set_cleared_buffers(false, true, false);
+ ctx->surface_shadow_map_clear_pass->set_clear_depth(1.0f);
+
+ ctx->surface_shadow_map_pass = new shadow_map_pass(ctx->rasterizer, ctx->shadow_map_framebuffer, ctx->resource_manager);
+ ctx->surface_shadow_map_pass->set_split_scheme_weight(0.75f);
+
+ ctx->surface_clear_pass = new clear_pass(ctx->rasterizer, ctx->framebuffer_hdr);
+ ctx->surface_clear_pass->set_cleared_buffers(true, true, true);
+ ctx->surface_clear_pass->set_clear_depth(0.0f);
+
+ ctx->surface_sky_pass = new sky_pass(ctx->rasterizer, ctx->framebuffer_hdr, ctx->resource_manager);
+ ctx->app->get_event_dispatcher()->subscribe(ctx->surface_sky_pass);
+
+ ctx->surface_material_pass = new material_pass(ctx->rasterizer, ctx->framebuffer_hdr, ctx->resource_manager);
+ ctx->surface_material_pass->set_fallback_material(ctx->fallback_material);
+ ctx->surface_material_pass->shadow_map_pass = ctx->surface_shadow_map_pass;
+ ctx->surface_material_pass->shadow_map = ctx->shadow_map_depth_texture;
+ ctx->app->get_event_dispatcher()->subscribe(ctx->surface_material_pass);
+
+ ctx->surface_outline_pass = new outline_pass(ctx->rasterizer, ctx->framebuffer_hdr, ctx->resource_manager);
+ ctx->surface_outline_pass->set_outline_width(0.25f);
+ ctx->surface_outline_pass->set_outline_color(float4{1.0f, 1.0f, 1.0f, 1.0f});
+
+ ctx->surface_compositor = new compositor();
+ ctx->surface_compositor->add_pass(ctx->surface_shadow_map_clear_pass);
+ ctx->surface_compositor->add_pass(ctx->surface_shadow_map_pass);
+ ctx->surface_compositor->add_pass(ctx->surface_clear_pass);
+ ctx->surface_compositor->add_pass(ctx->surface_sky_pass);
+ ctx->surface_compositor->add_pass(ctx->surface_material_pass);
+ //ctx->surface_compositor->add_pass(ctx->surface_outline_pass);
+ ctx->surface_compositor->add_pass(ctx->common_bloom_pass);
+ ctx->surface_compositor->add_pass(ctx->common_final_pass);
+ }
// Create billboard VAO
{
@@ -611,114 +627,100 @@ void setup_scenes(game::context* ctx)
// Get default framebuffer
const auto& viewport_dimensions = ctx->rasterizer->get_default_framebuffer().get_dimensions();
- float viewport_aspect_ratio = static_cast(viewport_dimensions[0]) / static_cast(viewport_dimensions[1]);
+ const float viewport_aspect_ratio = static_cast(viewport_dimensions[0]) / static_cast(viewport_dimensions[1]);
// Create infinite culling mask
- float inf = std::numeric_limits::infinity();
+ const float inf = std::numeric_limits::infinity();
ctx->no_cull = {{-inf, -inf, -inf}, {inf, inf, inf}};
- // Setup overworld camera
- ctx->overworld_camera = new scene::camera();
- ctx->overworld_camera->set_perspective(math::radians(45.0f), viewport_aspect_ratio, 0.1f, 1000.0f);
- ctx->overworld_camera->set_compositor(ctx->overworld_compositor);
- ctx->overworld_camera->set_composite_index(0);
- ctx->overworld_camera->set_active(true);
-
- // Setup underworld camera
- ctx->underworld_camera = new scene::camera();
- ctx->underworld_camera->set_perspective(math::radians(45.0f), viewport_aspect_ratio, 0.1f, 1000.0f);
- ctx->underworld_camera->look_at({0, 50, 0}, {0, 0, 0}, {0, 0, -1});
- ctx->underworld_camera->set_compositor(ctx->underworld_compositor);
- ctx->underworld_camera->set_composite_index(0);
- ctx->underworld_camera->set_active(false);
-
// Setup UI camera
ctx->ui_camera = new scene::camera();
ctx->ui_camera->set_compositor(ctx->ui_compositor);
- // Setup lights
- ctx->moon_light = new scene::directional_light();
- ctx->moon_light->set_intensity(0.0f);
- ctx->moon_light->update_tweens();
-
- ctx->subterrain_light = new scene::point_light();
- ctx->subterrain_light->set_color({1, 1, 1});
- ctx->subterrain_light->set_intensity(1.0f);
- ctx->subterrain_light->set_attenuation({1.0f, 0.09f, 0.032f});
- ctx->subterrain_light->update_tweens();
-
- ctx->underworld_ambient_light = new scene::ambient_light();
- ctx->underworld_ambient_light->set_color({1, 1, 1});
- ctx->underworld_ambient_light->set_intensity(0.1f);
- ctx->underworld_ambient_light->update_tweens();
-
- ctx->lens_spot_light = new scene::spot_light();
- ctx->lens_spot_light->set_color({1, 1, 1});
- ctx->lens_spot_light->set_intensity(20.0f);
- ctx->lens_spot_light->set_attenuation({1.0f, 0.0f, 0.0f});
- ctx->lens_spot_light->set_cutoff({math::radians(1.25f), math::radians(1.8f)});
-
- ctx->flashlight_spot_light = new scene::spot_light();
- ctx->flashlight_spot_light->set_color({1, 1, 1});
- ctx->flashlight_spot_light->set_intensity(1.0f);
- ctx->flashlight_spot_light->set_attenuation({1.0f, 0.0f, 0.0f});
- ctx->flashlight_spot_light->set_cutoff({math::radians(10.0f), math::radians(19.0f)});
-
-
+ // Setup underground camera
+ ctx->underground_camera = new scene::camera();
+ ctx->underground_camera->set_perspective(math::radians(45.0f), viewport_aspect_ratio, 0.1f, 1000.0f);
+ ctx->underground_camera->set_compositor(ctx->underground_compositor);
+ ctx->underground_camera->set_composite_index(0);
+ ctx->underground_camera->set_active(false);
- const gl::texture_2d* splash_texture = ctx->resource_manager->load("splash.tex");
- auto splash_dimensions = splash_texture->get_dimensions();
- ctx->splash_billboard_material = new material();
- ctx->splash_billboard_material->set_shader_program(ctx->resource_manager->load("ui-element-textured.glsl"));
- ctx->splash_billboard_material->add_property("background")->set_value(splash_texture);
- ctx->splash_billboard_material->add_property("tint")->set_value(float4{1, 1, 1, 1});
- ctx->splash_billboard_material->update_tweens();
- ctx->splash_billboard = new scene::billboard();
- ctx->splash_billboard->set_material(ctx->splash_billboard_material);
- ctx->splash_billboard->set_scale({(float)std::get<0>(splash_dimensions) * 0.5f, (float)std::get<1>(splash_dimensions) * 0.5f, 1.0f});
- ctx->splash_billboard->set_translation({0.0f, 0.0f, 0.0f});
- ctx->splash_billboard->update_tweens();
-
-
- // Create depth debug billboard
- /*
- material* depth_debug_material = new material();
- depth_debug_material->set_shader_program(ctx->resource_manager->load("ui-element-textured.glsl"));
- depth_debug_material->add_property("background")->set_value(shadow_map_depth_texture);
- depth_debug_material->add_property("tint")->set_value(float4{1, 1, 1, 1});
- billboard* depth_debug_billboard = new billboard();
- depth_debug_billboard->set_material(depth_debug_material);
- depth_debug_billboard->set_scale({128, 128, 1});
- depth_debug_billboard->set_translation({-960 + 128, 1080 * 0.5f - 128, 0});
- depth_debug_billboard->update_tweens();
- ui_system->get_scene()->add_object(depth_debug_billboard);
- */
-
- // Setup overworld scene
- ctx->overworld_scene = new scene::collection();
- ctx->overworld_scene->add_object(ctx->overworld_camera);
- //ctx->overworld_scene->add_object(ctx->moon_light);
- //ctx->overworld_scene->add_object(ctx->spot_light);
-
- // Setup underworld scene
- ctx->underworld_scene = new scene::collection();
- ctx->underworld_scene->add_object(ctx->underworld_camera);
- ctx->underworld_scene->add_object(ctx->underworld_ambient_light);
- //ctx->underworld_scene->add_object(ctx->lantern);
- //ctx->underworld_scene->add_object(ctx->subterrain_light);
- //ctx->underworld_scene->add_object(ctx->portal_billboard);
- //model_instance* larva = new scene::model_instance(ctx->resource_manager->load("larva.mdl"));
- //ctx->underworld_scene->add_object(larva);
+ // Setup surface camera
+ ctx->surface_camera = new scene::camera();
+ ctx->surface_camera->set_perspective(math::radians(45.0f), viewport_aspect_ratio, 0.1f, 1000.0f);
+ ctx->surface_camera->set_compositor(ctx->surface_compositor);
+ ctx->surface_camera->set_composite_index(0);
+ ctx->surface_camera->set_active(false);
// Setup UI scene
- ctx->ui_scene = new scene::collection();
- ctx->ui_scene->add_object(ctx->ui_camera);
+ {
+ ctx->ui_scene = new scene::collection();
+
+ const gl::texture_2d* splash_texture = ctx->resource_manager->load("splash.tex");
+ auto splash_dimensions = splash_texture->get_dimensions();
+ ctx->splash_billboard_material = new material();
+ ctx->splash_billboard_material->set_shader_program(ctx->resource_manager->load("ui-element-textured.glsl"));
+ ctx->splash_billboard_material->add_property("background")->set_value(splash_texture);
+ ctx->splash_billboard_material->add_property("tint")->set_value(float4{1, 1, 1, 1});
+ ctx->splash_billboard_material->update_tweens();
+ ctx->splash_billboard = new scene::billboard();
+ ctx->splash_billboard->set_material(ctx->splash_billboard_material);
+ ctx->splash_billboard->set_scale({(float)std::get<0>(splash_dimensions) * 0.5f, (float)std::get<1>(splash_dimensions) * 0.5f, 1.0f});
+ ctx->splash_billboard->set_translation({0.0f, 0.0f, 0.0f});
+ ctx->splash_billboard->update_tweens();
+
+ // Create depth debug billboard
+ /*
+ material* depth_debug_material = new material();
+ depth_debug_material->set_shader_program(ctx->resource_manager->load("ui-element-textured.glsl"));
+ depth_debug_material->add_property("background")->set_value(shadow_map_depth_texture);
+ depth_debug_material->add_property("tint")->set_value(float4{1, 1, 1, 1});
+ billboard* depth_debug_billboard = new billboard();
+ depth_debug_billboard->set_material(depth_debug_material);
+ depth_debug_billboard->set_scale({128, 128, 1});
+ depth_debug_billboard->set_translation({-960 + 128, 1080 * 0.5f - 128, 0});
+ depth_debug_billboard->update_tweens();
+ ui_system->get_scene()->add_object(depth_debug_billboard);
+ */
+
+ ctx->ui_scene->add_object(ctx->ui_camera);
+ }
- //ctx->overworld_scene->add_object(ctx->lens_spot_light);
- ctx->underworld_scene->add_object(ctx->flashlight_spot_light);
+ // Setup underground scene
+ {
+ ctx->underground_scene = new scene::collection();
+
+ ctx->underground_ambient_light = new scene::ambient_light();
+ ctx->underground_ambient_light->set_color({1, 1, 1});
+ ctx->underground_ambient_light->set_intensity(0.1f);
+ ctx->underground_ambient_light->update_tweens();
+
+ ctx->flashlight_spot_light = new scene::spot_light();
+ ctx->flashlight_spot_light->set_color({1, 1, 1});
+ ctx->flashlight_spot_light->set_intensity(1.0f);
+ ctx->flashlight_spot_light->set_attenuation({1.0f, 0.0f, 0.0f});
+ ctx->flashlight_spot_light->set_cutoff({math::radians(10.0f), math::radians(19.0f)});
+
+ ctx->underground_scene->add_object(ctx->underground_camera);
+ ctx->underground_scene->add_object(ctx->underground_ambient_light);
+ //ctx->underground_scene->add_object(ctx->flashlight_spot_light);
+ }
+
+ // Setup surface scene
+ {
+ ctx->surface_scene = new scene::collection();
+
+ ctx->lens_spot_light = new scene::spot_light();
+ ctx->lens_spot_light->set_color({1, 1, 1});
+ ctx->lens_spot_light->set_intensity(20.0f);
+ ctx->lens_spot_light->set_attenuation({1.0f, 0.0f, 0.0f});
+ ctx->lens_spot_light->set_cutoff({math::radians(1.25f), math::radians(1.8f)});
+
+ ctx->surface_scene->add_object(ctx->surface_camera);
+ //ctx->surface_scene->add_object(ctx->lens_spot_light);
+ }
- // Set overworld as active scene
- ctx->active_scene = ctx->overworld_scene;
+ // Clear active scene
+ ctx->active_scene = nullptr;
logger->pop_task(EXIT_SUCCESS);
}
@@ -761,14 +763,12 @@ void setup_animation(game::context* ctx)
ctx->focal_point_tween->set_interpolator(math::lerp);
// Set material pass tweens
- ctx->overworld_sky_pass->set_time_tween(ctx->time_tween);
- ctx->overworld_material_pass->set_time_tween(ctx->time_tween);
- ctx->overworld_material_pass->set_focal_point_tween(ctx->focal_point_tween);
- ctx->overworld_final_pass->set_time_tween(ctx->time_tween);
- ctx->underworld_material_pass->set_time_tween(ctx->time_tween);
- ctx->underworld_material_pass->set_focal_point_tween(ctx->focal_point_tween);
- ctx->underworld_final_pass->set_time_tween(ctx->time_tween);
- ctx->underworld_material_pass->set_focal_point_tween(ctx->focal_point_tween);
+ ctx->common_final_pass->set_time_tween(ctx->time_tween);
+ ctx->surface_sky_pass->set_time_tween(ctx->time_tween);
+ ctx->surface_material_pass->set_time_tween(ctx->time_tween);
+ ctx->surface_material_pass->set_focal_point_tween(ctx->focal_point_tween);
+ ctx->underground_material_pass->set_time_tween(ctx->time_tween);
+ ctx->underground_material_pass->set_focal_point_tween(ctx->focal_point_tween);
ctx->ui_material_pass->set_time_tween(ctx->time_tween);
}
@@ -801,7 +801,7 @@ void setup_systems(game::context* ctx)
// Setup terrain system
ctx->terrain_system = new entity::system::terrain(*ctx->entity_registry);
ctx->terrain_system->set_patch_subdivisions(30);
- ctx->terrain_system->set_patch_scene_collection(ctx->overworld_scene);
+ ctx->terrain_system->set_patch_scene_collection(ctx->surface_scene);
ctx->terrain_system->set_max_error(200.0);
// Setup vegetation system
@@ -810,7 +810,7 @@ void setup_systems(game::context* ctx)
//ctx->vegetation_system->set_vegetation_patch_resolution(VEGETATION_PATCH_RESOLUTION);
//ctx->vegetation_system->set_vegetation_density(1.0f);
//ctx->vegetation_system->set_vegetation_model(ctx->resource_manager->load("grass-tuft.mdl"));
- //ctx->vegetation_system->set_scene(ctx->overworld_scene);
+ //ctx->vegetation_system->set_scene(ctx->surface_scene);
// Setup camera system
ctx->camera_system = new entity::system::camera(*ctx->entity_registry);
@@ -820,13 +820,13 @@ void setup_systems(game::context* ctx)
// Setup tool system
ctx->tool_system = new entity::system::tool(*ctx->entity_registry, event_dispatcher);
- ctx->tool_system->set_camera(ctx->overworld_camera);
+ ctx->tool_system->set_camera(ctx->surface_camera);
ctx->tool_system->set_orbit_cam(ctx->camera_system->get_orbit_cam());
ctx->tool_system->set_viewport(viewport);
// Setup subterrain system
ctx->subterrain_system = new entity::system::subterrain(*ctx->entity_registry, ctx->resource_manager);
- ctx->subterrain_system->set_scene(ctx->underworld_scene);
+ ctx->subterrain_system->set_scene(ctx->underground_scene);
// Setup nest system
ctx->nest_system = new entity::system::nest(*ctx->entity_registry, ctx->resource_manager);
@@ -864,11 +864,11 @@ void setup_systems(game::context* ctx)
// Setup tracking system
ctx->tracking_system = new entity::system::tracking(*ctx->entity_registry, event_dispatcher, ctx->resource_manager);
- ctx->tracking_system->set_scene(ctx->overworld_scene);
+ ctx->tracking_system->set_scene(ctx->surface_scene);
// Setup painting system
ctx->painting_system = new entity::system::painting(*ctx->entity_registry, event_dispatcher, ctx->resource_manager);
- ctx->painting_system->set_scene(ctx->overworld_scene);
+ ctx->painting_system->set_scene(ctx->surface_scene);
// Setup solar system
ctx->orbit_system = new entity::system::orbit(*ctx->entity_registry);
@@ -883,7 +883,7 @@ void setup_systems(game::context* ctx)
// Setup astronomy system
ctx->astronomy_system = new entity::system::astronomy(*ctx->entity_registry);
- ctx->astronomy_system->set_sky_pass(ctx->overworld_sky_pass);
+ ctx->astronomy_system->set_sky_pass(ctx->surface_sky_pass);
// Setup proteome system
ctx->proteome_system = new entity::system::proteome(*ctx->entity_registry);
@@ -900,15 +900,15 @@ void setup_systems(game::context* ctx)
// Setup render system
ctx->render_system = new entity::system::render(*ctx->entity_registry);
- ctx->render_system->add_layer(ctx->overworld_scene);
- ctx->render_system->add_layer(ctx->underworld_scene);
+ ctx->render_system->add_layer(ctx->underground_scene);
+ ctx->render_system->add_layer(ctx->surface_scene);
ctx->render_system->add_layer(ctx->ui_scene);
ctx->render_system->set_renderer(ctx->renderer);
// Setup control system
ctx->control_system = new entity::system::control(*ctx->entity_registry);
ctx->control_system->set_viewport(viewport);
- ctx->control_system->set_underworld_camera(ctx->underworld_camera);
+ ctx->control_system->set_underground_camera(ctx->underground_camera);
ctx->control_system->set_tool(nullptr);
//ctx->control_system->set_flashlight(flashlight, flashlight_light_cone);
ctx->control_system->get_adjust_camera_control()->set_activated_callback([ctx](){ ctx->app->set_relative_mouse_mode(true); ctx->tool_system->set_pick(false); });
@@ -1020,15 +1020,15 @@ void setup_controls(game::context* ctx)
ctx->control_system->get_toggle_view_control()->set_activated_callback(
[ctx]()
{
- if (ctx->active_scene == ctx->overworld_scene)
+ if (ctx->active_scene == ctx->surface_scene)
{
- ctx->active_scene = ctx->underworld_scene;
+ ctx->active_scene = ctx->underground_scene;
ctx->radial_transition_inner->transition(0.5f, false, ease::in_quad);
auto switch_cameras = [ctx]()
{
- ctx->overworld_camera->set_active(false);
- ctx->underworld_camera->set_active(true);
+ ctx->surface_camera->set_active(false);
+ ctx->underground_camera->set_active(true);
ctx->fade_transition->transition(0.25f, true, ease::out_quad);
};
@@ -1037,13 +1037,13 @@ void setup_controls(game::context* ctx)
}
else
{
- ctx->active_scene = ctx->overworld_scene;
+ ctx->active_scene = ctx->surface_scene;
ctx->fade_transition->transition(0.25f, false, ease::out_quad);
auto switch_cameras = [ctx]()
{
- ctx->overworld_camera->set_active(true);
- ctx->underworld_camera->set_active(false);
+ ctx->surface_camera->set_active(true);
+ ctx->underground_camera->set_active(false);
ctx->radial_transition_inner->transition(0.5f, true, ease::out_quad);
};
@@ -1254,12 +1254,11 @@ void setup_callbacks(game::context* ctx)
{
// Update tweens
ctx->time_tween->update();
- ctx->overworld_sky_pass->update_tweens();
- ctx->overworld_scene->update_tweens();
- ctx->underworld_scene->update_tweens();
+ ctx->surface_sky_pass->update_tweens();
+ ctx->surface_scene->update_tweens();
+ ctx->underground_scene->update_tweens();
ctx->ui_scene->update_tweens();
ctx->focal_point_tween->update();
- ctx->underworld_final_pass->get_material()->update_tweens();
// Set time tween time
(*ctx->time_tween)[1] = t;
diff --git a/src/game/context.hpp b/src/game/context.hpp
index d492ad8..0df5727 100644
--- a/src/game/context.hpp
+++ b/src/game/context.hpp
@@ -164,39 +164,44 @@ struct context
gl::texture_2d** marker_albedo_textures;
// Compositing
- bloom_pass* overworld_bloom_pass;
- clear_pass* overworld_clear_pass;
- clear_pass* overworld_shadow_map_clear_pass;
clear_pass* ui_clear_pass;
- clear_pass* underworld_clear_pass;
- final_pass* overworld_final_pass;
- material_pass* overworld_material_pass;
material_pass* ui_material_pass;
- material_pass* underworld_material_pass;
- outline_pass* overworld_outline_pass;
- shadow_map_pass* overworld_shadow_map_pass;
- simple_render_pass* underworld_final_pass;
- sky_pass* overworld_sky_pass;
- material_property* underground_color_texture_property;
- compositor* overworld_compositor;
- compositor* underworld_compositor;
compositor* ui_compositor;
- // Scene
+ bloom_pass* common_bloom_pass;
+ final_pass* common_final_pass;
+
+ clear_pass* underground_clear_pass;
+ material_pass* underground_material_pass;
+ compositor* underground_compositor;
+
+ clear_pass* surface_shadow_map_clear_pass;
+ shadow_map_pass* surface_shadow_map_pass;
+ clear_pass* surface_clear_pass;
+ sky_pass* surface_sky_pass;
+ material_pass* surface_material_pass;
+ outline_pass* surface_outline_pass;
+ compositor* surface_compositor;
+
+ // Scene utilities
scene::collection* active_scene;
- scene::collection* overworld_scene;
- scene::collection* underworld_scene;
+ geom::aabb no_cull;
+
+ // UI scene
scene::collection* ui_scene;
- scene::camera* overworld_camera;
- scene::camera* underworld_camera;
scene::camera* ui_camera;
- scene::directional_light* moon_light;
- scene::point_light* subterrain_light;
- scene::ambient_light* underworld_ambient_light;
scene::billboard* splash_billboard;
+
+ // Surface scene
+ scene::collection* surface_scene;
+ scene::camera* surface_camera;
scene::spot_light* lens_spot_light;
+
+ // Underground scene
+ scene::collection* underground_scene;
+ scene::camera* underground_camera;
+ scene::ambient_light* underground_ambient_light;
scene::spot_light* flashlight_spot_light;
- geom::aabb no_cull;
// Animation
timeline* timeline;
diff --git a/src/game/states/brood.cpp b/src/game/states/brood.cpp
new file mode 100644
index 0000000..bdca63e
--- /dev/null
+++ b/src/game/states/brood.cpp
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2021 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#include "game/states/brood.hpp"
+#include "entity/archetype.hpp"
+#include "entity/commands.hpp"
+#include "entity/components/observer.hpp"
+#include "entity/components/camera-follow.hpp"
+#include "entity/components/terrain.hpp"
+#include "entity/components/transform.hpp"
+#include "entity/systems/control.hpp"
+#include "entity/systems/camera.hpp"
+#include "entity/systems/tool.hpp"
+#include "animation/screen-transition.hpp"
+#include "animation/ease.hpp"
+#include "resources/resource-manager.hpp"
+#include "renderer/passes/sky-pass.hpp"
+
+namespace game {
+namespace state {
+namespace brood {
+
+void enter(game::context* ctx)
+{
+ // Switch to underground camera
+ ctx->surface_camera->set_active(false);
+ ctx->underground_camera->set_active(true);
+
+ ctx->underground_ambient_light->set_intensity(1.0f);
+
+ // Create camera focal point
+ {
+ entity::component::transform focal_point_transform;
+ focal_point_transform.local = math::identity_transform;
+ focal_point_transform.warp = true;
+ ctx->entity_registry->assign_or_replace(ctx->focal_point_entity, focal_point_transform);
+
+ entity::component::camera_follow focal_point_follow;
+ ctx->entity_registry->assign_or_replace(ctx->focal_point_entity, focal_point_follow);
+ }
+
+ // Setup camera
+ ctx->underground_camera->look_at({0, 0, 1}, {0, 0, 0}, {0, 1, 0});
+ ctx->underground_camera->set_exposure(0.0f);
+
+ ctx->camera_system->set_camera(ctx->underground_camera);
+ ctx->tool_system->set_camera(ctx->underground_camera);
+ ctx->tool_system->set_orbit_cam(ctx->camera_system->get_orbit_cam());
+
+ entity::system::control* control_system = ctx->control_system;
+ control_system->update(0.0, 0.0);
+ control_system->set_nest(nullptr);
+
+ // Create larva
+ {
+ entity::archetype* larva_archetype = ctx->resource_manager->load("ant-larva.ent");
+ auto larva_eid = larva_archetype->create(*ctx->entity_registry);
+ entity::command::warp_to(*ctx->entity_registry, larva_eid, {0.0f, 0.0f, 0.0f});
+ entity::command::assign_render_layers(*ctx->entity_registry, larva_eid, 0b1);
+ }
+
+ // Create cocoon
+ {
+ entity::archetype* cocoon_archetype = ctx->resource_manager->load("ant-cocoon.ent");
+ auto cocoon_eid = cocoon_archetype->create(*ctx->entity_registry);
+ entity::command::warp_to(*ctx->entity_registry, cocoon_eid, {-50, 0.1935f, 0});
+ entity::command::assign_render_layers(*ctx->entity_registry, cocoon_eid, 0b1);
+ }
+
+ ctx->underground_scene->update_tweens();
+
+ // Start fade in
+ ctx->fade_transition->transition(1.0f, true, ease::in_quad);
+}
+
+void exit(game::context* ctx)
+{}
+
+} // namespace brood
+} // namespace state
+} // namespace game
diff --git a/src/game/states/play.hpp b/src/game/states/brood.hpp
similarity index 83%
rename from src/game/states/play.hpp
rename to src/game/states/brood.hpp
index 0ab8ac2..1658aae 100644
--- a/src/game/states/play.hpp
+++ b/src/game/states/brood.hpp
@@ -17,23 +17,23 @@
* along with Antkeeper source code. If not, see .
*/
-#ifndef ANTKEEPER_GAME_STATE_PLAY_HPP
-#define ANTKEEPER_GAME_STATE_PLAY_HPP
+#ifndef ANTKEEPER_GAME_STATE_BROOD_HPP
+#define ANTKEEPER_GAME_STATE_BROOD_HPP
#include "game/context.hpp"
namespace game {
namespace state {
-/// Play game state functions.
-namespace play {
+/// Brood game state functions.
+namespace brood {
void enter(game::context* ctx);
void exit(game::context* ctx);
-} // namespace play
+} // namespace brood
} // namespace state
} // namespace game
-#endif // ANTKEEPER_GAME_STATE_PLAY_HPP
+#endif // ANTKEEPER_GAME_STATE_BROOD_HPP
diff --git a/src/game/states/play.cpp b/src/game/states/forage.cpp
similarity index 72%
rename from src/game/states/play.cpp
rename to src/game/states/forage.cpp
index 840d364..472cf2f 100644
--- a/src/game/states/play.cpp
+++ b/src/game/states/forage.cpp
@@ -17,11 +17,12 @@
* along with Antkeeper source code. If not, see .
*/
-#include "game/states/play.hpp"
+#include "game/states/forage.hpp"
#include "entity/archetype.hpp"
#include "entity/commands.hpp"
#include "entity/components/observer.hpp"
#include "entity/components/camera-follow.hpp"
+#include "entity/components/terrain.hpp"
#include "entity/components/transform.hpp"
#include "entity/systems/astronomy.hpp"
#include "entity/systems/control.hpp"
@@ -32,10 +33,14 @@
namespace game {
namespace state {
-namespace play {
+namespace forage {
void enter(game::context* ctx)
{
+ // Switch to surface camera
+ ctx->underground_camera->set_active(false);
+ ctx->surface_camera->set_active(true);
+
// Find planet EID by name
entity::id planet_eid = entt::null;
if (auto it = ctx->named_entities.find("planet"); it != ctx->named_entities.end())
@@ -43,6 +48,18 @@ void enter(game::context* ctx)
planet_eid = it->second;
}
+ // Create biome terrain component
+ entity::component::terrain biome_terrain;
+ biome_terrain.max_lod = 18;
+ biome_terrain.patch_material = ctx->resource_manager->load("desert-terrain.mtl");
+ biome_terrain.elevation = [](double, double) -> double
+ {
+ return 0.0;
+ };
+
+ // Replace planet terrain component with biome terrain component
+ ctx->entity_registry->replace(planet_eid, biome_terrain);
+
// Create observer
auto observer_eid = ctx->entity_registry->create();
{
@@ -51,7 +68,7 @@ void enter(game::context* ctx)
observer.elevation = 0.0;
observer.latitude = 0.0;
observer.longitude = 0.0;
- observer.camera = ctx->overworld_camera;
+ observer.camera = ctx->surface_camera;
ctx->entity_registry->assign(observer_eid, observer);
// Set reference location of astronomy system
@@ -71,9 +88,9 @@ void enter(game::context* ctx)
}
// Setup camera
- ctx->overworld_camera->look_at({0, 0, 1}, {0, 0, 0}, {0, 1, 0});
- ctx->overworld_camera->set_exposure(-14.5f);
- ctx->camera_system->set_camera(ctx->overworld_camera);
+ ctx->surface_camera->look_at({0, 0, 1}, {0, 0, 0}, {0, 1, 0});
+ ctx->surface_camera->set_exposure(-14.5f);
+ ctx->camera_system->set_camera(ctx->surface_camera);
entity::system::control* control_system = ctx->control_system;
control_system->update(0.0, 0.0);
@@ -86,7 +103,14 @@ void enter(game::context* ctx)
entity::command::warp_to(*ctx->entity_registry, larva_eid, {50, 0.1935f, 0});
}
- ctx->overworld_scene->update_tweens();
+ // Create cocoon
+ {
+ entity::archetype* cocoon_archetype = ctx->resource_manager->load("ant-cocoon.ent");
+ auto cocoon_eid = cocoon_archetype->create(*ctx->entity_registry);
+ entity::command::warp_to(*ctx->entity_registry, cocoon_eid, {-50, 0.1935f, 0});
+ }
+
+ ctx->surface_scene->update_tweens();
// Start fade in
ctx->fade_transition->transition(1.0f, true, ease::in_quad);
@@ -95,6 +119,6 @@ void enter(game::context* ctx)
void exit(game::context* ctx)
{}
-} // namespace play
+} // namespace forage
} // namespace state
} // namespace game
diff --git a/src/game/states/forage.hpp b/src/game/states/forage.hpp
new file mode 100644
index 0000000..b6068e5
--- /dev/null
+++ b/src/game/states/forage.hpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2021 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#ifndef ANTKEEPER_GAME_STATE_FORAGE_HPP
+#define ANTKEEPER_GAME_STATE_FORAGE_HPP
+
+#include "game/context.hpp"
+
+namespace game {
+namespace state {
+
+/// Forage game state functions.
+namespace forage {
+
+void enter(game::context* ctx);
+void exit(game::context* ctx);
+
+} // namespace forage
+
+} // namespace state
+} // namespace game
+
+#endif // ANTKEEPER_GAME_STATE_FORAGE_HPP
diff --git a/src/game/states/loading.cpp b/src/game/states/loading.cpp
index 3f1ce96..3da4048 100644
--- a/src/game/states/loading.cpp
+++ b/src/game/states/loading.cpp
@@ -30,7 +30,6 @@
#include "entity/systems/astronomy.hpp"
#include "entity/systems/orbit.hpp"
#include "game/states/nuptial-flight.hpp"
-#include "game/states/play.hpp"
#include "game/states/splash.hpp"
#include "geom/spherical.hpp"
#include "gl/drawing-mode.hpp"
@@ -66,6 +65,9 @@ static void selenogenesis(game::context* ctx);
/// Creates fixed stars.
static void extrasolar_heliogenesis(game::context* ctx);
+/// Creates an ant colony
+static void colonigenesis(game::context* ctx);
+
void enter(game::context* ctx)
{
// Create universe
@@ -161,6 +163,19 @@ void cosmogenesis(game::context* ctx)
throw;
}
ctx->logger->pop_task(EXIT_SUCCESS);
+
+ // Create ant colony
+ ctx->logger->push_task("Creating ant colony");
+ try
+ {
+ colonigenesis(ctx);
+ }
+ catch (...)
+ {
+ ctx->logger->pop_task(EXIT_FAILURE);
+ throw;
+ }
+ ctx->logger->pop_task(EXIT_SUCCESS);
}
void heliogenesis(game::context* ctx)
@@ -209,12 +224,12 @@ void heliogenesis(game::context* ctx)
sun_ambient->set_intensity(0.0f);
sun_ambient->update_tweens();
- // Add sun light scene objects to overworld scene
- ctx->overworld_scene->add_object(sun_direct);
- ctx->overworld_scene->add_object(sun_ambient);
+ // Add sun light scene objects to surface scene
+ ctx->surface_scene->add_object(sun_direct);
+ ctx->surface_scene->add_object(sun_ambient);
// Pass direct sun light scene object to shadow map pass and astronomy system
- ctx->overworld_shadow_map_pass->set_light(sun_direct);
+ ctx->surface_shadow_map_pass->set_light(sun_direct);
ctx->astronomy_system->set_sun_light(sun_direct);
}
@@ -252,8 +267,8 @@ void planetogenesis(game::context* ctx)
//return math::random(0.0, 1.0);
return 0.0;
};
- terrain.max_lod = 18;
- terrain.patch_material = ctx->resource_manager->load("desert-terrain.mtl");
+ terrain.max_lod = 0;
+ terrain.patch_material = nullptr;
ctx->entity_registry->assign(planet_eid, terrain);
// Assign planetary atmosphere component
@@ -277,7 +292,7 @@ void planetogenesis(game::context* ctx)
ctx->astronomy_system->set_reference_body(planet_eid);
// Load sky model
- ctx->overworld_sky_pass->set_sky_model(ctx->resource_manager->load("sky-dome.mdl"));
+ ctx->surface_sky_pass->set_sky_model(ctx->resource_manager->load("sky-dome.mdl"));
}
void selenogenesis(game::context* ctx)
@@ -289,7 +304,7 @@ void selenogenesis(game::context* ctx)
ctx->named_entities["moon"] = moon_eid;
// Pass moon model to sky pass
- ctx->overworld_sky_pass->set_moon_model(ctx->resource_manager->load("moon.mdl"));
+ ctx->surface_sky_pass->set_moon_model(ctx->resource_manager->load("moon.mdl"));
}
void extrasolar_heliogenesis(game::context* ctx)
@@ -398,7 +413,23 @@ void extrasolar_heliogenesis(game::context* ctx)
stars_model_group->set_index_count(star_count);
// Pass stars model to sky pass
- ctx->overworld_sky_pass->set_stars_model(stars_model);
+ ctx->surface_sky_pass->set_stars_model(stars_model);
+}
+
+void colonigenesis(game::context* ctx)
+{
+ // Create queen entity
+ auto queen_eid = ctx->entity_registry->create();
+ ctx->named_entities["queen"] = queen_eid;
+
+ // Create central shaft entity
+ auto shaft_eid = ctx->entity_registry->create();
+ ctx->named_entities["shaft"] = queen_eid;
+
+ // Create entrance "lobby" chamber entity
+ auto lobby_eid = ctx->entity_registry->create();
+ ctx->named_entities["lobby"] = lobby_eid;
+
}
} // namespace loading
diff --git a/src/game/states/nuptial-flight.cpp b/src/game/states/nuptial-flight.cpp
index f18f524..33b4ea5 100644
--- a/src/game/states/nuptial-flight.cpp
+++ b/src/game/states/nuptial-flight.cpp
@@ -18,6 +18,7 @@
*/
#include "game/states/nuptial-flight.hpp"
+#include "entity/archetype.hpp"
#include "entity/systems/astronomy.hpp"
#include "entity/systems/orbit.hpp"
#include "entity/systems/control.hpp"
@@ -38,6 +39,10 @@ namespace nuptial_flight {
void enter(game::context* ctx)
{
+ // Switch to surface camera
+ ctx->underground_camera->set_active(false);
+ ctx->surface_camera->set_active(true);
+
// Find planet EID by name
entity::id planet_eid = entt::null;
if (auto it = ctx->named_entities.find("planet"); it != ctx->named_entities.end())
@@ -45,10 +50,12 @@ void enter(game::context* ctx)
planet_eid = it->second;
}
- // Replace planet terrain material with cloud material
- entity::component::terrain planet_terrain = ctx->entity_registry->get(planet_eid);
- planet_terrain.patch_material = ctx->resource_manager->load("cloud.mtl");
- ctx->entity_registry->replace(planet_eid, planet_terrain);
+ // Remove terrain component from planet (if any)
+ if (ctx->entity_registry->has(planet_eid))
+ ctx->entity_registry->remove(planet_eid);
+
+ // Enable clouds in sky pass
+ ctx->surface_sky_pass->set_clouds_model(ctx->resource_manager->load("cloud-plane.mdl"));
// Create observer
auto observer_eid = ctx->entity_registry->create();
@@ -58,7 +65,7 @@ void enter(game::context* ctx)
observer.elevation = 2000.0;
observer.latitude = 0.0;
observer.longitude = 0.0;
- observer.camera = ctx->overworld_camera;
+ observer.camera = ctx->surface_camera;
ctx->entity_registry->assign(observer_eid, observer);
// Set reference location of astronomy system
@@ -66,6 +73,21 @@ void enter(game::context* ctx)
ctx->astronomy_system->set_observer_location(double3{observer.elevation, observer.latitude, observer.longitude});
}
+ // Create wing
+ entity::archetype* ant_forewing_archetype = ctx->resource_manager->load("ant-forewing.ent");
+ auto forewing_eid = ctx->entity_registry->create();
+ //ant_forewing_archetype->assign(*ctx->entity_registry, forewing_eid);
+
+ // Create eye
+ entity::archetype* ant_round_eye_archetype = ctx->resource_manager->load("ant-round-eye.ent");
+ auto ant_round_eye_eid = ctx->entity_registry->create();
+ ant_round_eye_archetype->assign(*ctx->entity_registry, ant_round_eye_eid);
+
+ // Create green orb ring
+ entity::archetype* orb_ring_archetype = ctx->resource_manager->load("orb-ring.ent");
+ auto orb_ring_eid = ctx->entity_registry->create();
+ //orb_ring_archetype->assign(*ctx->entity_registry, orb_ring_eid);
+
// Create camera focal point
{
entity::component::transform focal_point_transform;
@@ -78,14 +100,14 @@ void enter(game::context* ctx)
}
// Setup camera
- ctx->overworld_camera->look_at({0, 0, 1}, {0, 0, 0}, {0, 1, 0});
- ctx->overworld_camera->set_exposure(-14.5f);
- ctx->camera_system->set_camera(ctx->overworld_camera);
+ ctx->surface_camera->look_at({0, 0, 1}, {0, 0, 0}, {0, 1, 0});
+ ctx->surface_camera->set_exposure(-14.5f);
+ ctx->camera_system->set_camera(ctx->surface_camera);
entity::system::control* control_system = ctx->control_system;
control_system->update(0.0, 0.0);
- ctx->overworld_scene->update_tweens();
+ ctx->surface_scene->update_tweens();
// Pause motion of celestial objects
ctx->astronomy_system->set_time_scale(0.0);
diff --git a/src/game/states/splash.cpp b/src/game/states/splash.cpp
index 48907a6..54369a7 100644
--- a/src/game/states/splash.cpp
+++ b/src/game/states/splash.cpp
@@ -18,7 +18,7 @@
*/
#include "game/states/splash.hpp"
-#include "game/states/play.hpp"
+#include "game/states/brood.hpp"
#include "animation/screen-transition.hpp"
#include "animation/ease.hpp"
#include "animation/timeline.hpp"
@@ -51,9 +51,9 @@ void enter(game::context* ctx)
auto change_state = [ctx]()
{
application::state next_state;
- next_state.name = "play";
- next_state.enter = std::bind(game::state::play::enter, ctx);
- next_state.exit = std::bind(game::state::play::exit, ctx);
+ next_state.name = "brood";
+ next_state.enter = std::bind(game::state::brood::enter, ctx);
+ next_state.exit = std::bind(game::state::brood::exit, ctx);
ctx->app->change_state(next_state);
};
@@ -83,9 +83,9 @@ void enter(game::context* ctx)
ctx->app->swap_buffers();
application::state next_state;
- next_state.name = "play";
- next_state.enter = std::bind(game::state::play::enter, ctx);
- next_state.exit = std::bind(game::state::play::exit, ctx);
+ next_state.name = "brood";
+ next_state.enter = std::bind(game::state::brood::enter, ctx);
+ next_state.exit = std::bind(game::state::brood::exit, ctx);
ctx->app->change_state(next_state);
}
diff --git a/src/renderer/passes/sky-pass.cpp b/src/renderer/passes/sky-pass.cpp
index b3b771f..d52baa7 100644
--- a/src/renderer/passes/sky-pass.cpp
+++ b/src/renderer/passes/sky-pass.cpp
@@ -64,10 +64,15 @@ sky_pass::sky_pass(gl::rasterizer* rasterizer, const gl::framebuffer* framebuffe
stars_model_vao(nullptr),
star_material(nullptr),
star_shader_program(nullptr),
+ clouds_model(nullptr),
+ clouds_model_vao(nullptr),
+ cloud_material(nullptr),
+ cloud_shader_program(nullptr),
time_tween(nullptr),
observer_altitude_tween(0.0f, math::lerp),
sun_position_tween(float3{1.0f, 0.0f, 0.0f}, math::lerp),
- sun_color_tween(float3{1.0f, 1.0f, 1.0f}, math::lerp),
+ sun_color_outer_tween(float3{1.0f, 1.0f, 1.0f}, math::lerp),
+ sun_color_inner_tween(float3{1.0f, 1.0f, 1.0f}, math::lerp),
topocentric_frame_translation({0, 0, 0}, math::lerp),
topocentric_frame_rotation(math::quaternion::identity(), math::nlerp)
{}
@@ -88,7 +93,7 @@ void sky_pass::render(render_context* context) const
auto viewport = framebuffer->get_dimensions();
rasterizer->set_viewport(0, 0, std::get<0>(viewport), std::get<1>(viewport));
- float time = (*time_tween)[context->alpha];
+ float time = static_cast((*time_tween)[context->alpha]);
float2 resolution = {static_cast(std::get<0>(viewport)), static_cast(std::get<1>(viewport))};
const scene::camera& camera = *context->camera;
@@ -118,9 +123,11 @@ void sky_pass::render(render_context* context) const
float3 sun_direction = math::normalize(sun_position);
// Interpolate sun color
- float3 sun_color = sun_color_tween.interpolate(context->alpha);
+ float3 sun_color_outer = sun_color_outer_tween.interpolate(context->alpha);
+ float3 sun_color_inner = sun_color_inner_tween.interpolate(context->alpha);
- // Draw sky model
+ // Draw atmosphere
+ if (sky_model)
{
rasterizer->use_program(*sky_shader_program);
@@ -143,7 +150,7 @@ void sky_pass::render(render_context* context) const
if (sun_angular_radius_input)
sun_angular_radius_input->upload(sun_angular_radius);
if (sun_color_input)
- sun_color_input->upload(sun_color);
+ sun_color_input->upload(sun_color_outer);
if (scale_height_rm_input)
scale_height_rm_input->upload(scale_height_rm);
if (rayleigh_scattering_input)
@@ -160,6 +167,27 @@ void sky_pass::render(render_context* context) const
rasterizer->draw_arrays(*sky_model_vao, sky_model_drawing_mode, sky_model_start_index, sky_model_index_count);
}
+ // Draw clouds
+ if (clouds_model)
+ {
+ rasterizer->use_program(*cloud_shader_program);
+
+ if (cloud_model_view_projection_input)
+ cloud_model_view_projection_input->upload(model_view_projection);
+ if (cloud_sun_direction_input)
+ cloud_sun_direction_input->upload(sun_direction);
+ if (cloud_sun_color_input)
+ cloud_sun_color_input->upload(sun_color_inner);
+ if (cloud_camera_position_input)
+ cloud_camera_position_input->upload(context->camera_transform.translation);
+ if (cloud_camera_exposure_input)
+ cloud_camera_exposure_input->upload(exposure);
+
+ cloud_material->upload(context->alpha);
+
+ rasterizer->draw_arrays(*clouds_model_vao, clouds_model_drawing_mode, clouds_model_start_index, clouds_model_index_count);
+ }
+
glEnable(GL_BLEND);
//glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glBlendFunc(GL_ONE, GL_ONE);
@@ -345,11 +373,49 @@ void sky_pass::set_stars_model(const model* model)
}
}
+void sky_pass::set_clouds_model(const model* model)
+{
+ clouds_model = model;
+
+ if (clouds_model)
+ {
+ clouds_model_vao = model->get_vertex_array();
+
+ const std::vector& groups = *model->get_groups();
+ for (model_group* group: groups)
+ {
+ cloud_material = group->get_material();
+ clouds_model_drawing_mode = group->get_drawing_mode();
+ clouds_model_start_index = group->get_start_index();
+ clouds_model_index_count = group->get_index_count();
+ }
+
+ if (cloud_material)
+ {
+ cloud_shader_program = cloud_material->get_shader_program();
+
+ if (cloud_shader_program)
+ {
+ cloud_model_view_projection_input = cloud_shader_program->get_input("model_view_projection");
+ cloud_sun_direction_input = cloud_shader_program->get_input("sun_direction");
+ cloud_sun_color_input = cloud_shader_program->get_input("sun_color");
+ cloud_camera_position_input = cloud_shader_program->get_input("camera.position");
+ cloud_camera_exposure_input = cloud_shader_program->get_input("camera.exposure");
+ }
+ }
+ }
+ else
+ {
+ clouds_model = nullptr;
+ }
+}
+
void sky_pass::update_tweens()
{
observer_altitude_tween.update();
sun_position_tween.update();
- sun_color_tween.update();
+ sun_color_outer_tween.update();
+ sun_color_inner_tween.update();
topocentric_frame_translation.update();
topocentric_frame_rotation.update();
}
@@ -370,9 +436,10 @@ void sky_pass::set_sun_position(const float3& position)
sun_position_tween[1] = position;
}
-void sky_pass::set_sun_color(const float3& color)
+void sky_pass::set_sun_color(const float3& color_outer, const float3& color_inner)
{
- sun_color_tween[1] = color;
+ sun_color_outer_tween[1] = color_outer;
+ sun_color_inner_tween[1] = color_inner;
}
void sky_pass::set_sun_angular_radius(float radius)
diff --git a/src/renderer/passes/sky-pass.hpp b/src/renderer/passes/sky-pass.hpp
index 34b80f9..8fad240 100644
--- a/src/renderer/passes/sky-pass.hpp
+++ b/src/renderer/passes/sky-pass.hpp
@@ -56,11 +56,12 @@ public:
void set_time_tween(const tween* time);
void set_moon_model(const model* model);
void set_stars_model(const model* model);
+ void set_clouds_model(const model* model);
void set_topocentric_frame(const physics::frame& frame);
void set_sun_position(const float3& position);
- void set_sun_color(const float3& color);
+ void set_sun_color(const float3& color_outer, const float3& color_inner);
void set_sun_angular_radius(float radius);
void set_observer_altitude(float altitude);
void set_scale_heights(float rayleigh, float mie);
@@ -118,6 +119,20 @@ private:
const gl::shader_input* star_projection_input;
const gl::shader_input* star_exposure_input;
const gl::shader_input* star_distance_input;
+
+ const model* clouds_model;
+ const material* cloud_material;
+ const gl::vertex_array* clouds_model_vao;
+ gl::drawing_mode clouds_model_drawing_mode;
+ std::size_t clouds_model_start_index;
+ std::size_t clouds_model_index_count;
+
+ gl::shader_program* cloud_shader_program;
+ const gl::shader_input* cloud_model_view_projection_input;
+ const gl::shader_input* cloud_sun_direction_input;
+ const gl::shader_input* cloud_sun_color_input;
+ const gl::shader_input* cloud_camera_position_input;
+ const gl::shader_input* cloud_camera_exposure_input;
const gl::texture_2d* blue_noise_map;
const gl::texture_2d* sky_gradient;
@@ -127,7 +142,8 @@ private:
const tween* time_tween;
tween observer_altitude_tween;
tween sun_position_tween;
- tween sun_color_tween;
+ tween sun_color_outer_tween;
+ tween sun_color_inner_tween;
tween topocentric_frame_translation;
tween> topocentric_frame_rotation;