AtmosphereTestScene.cpp 18.5 KB
Newer Older
Dario Seyb's avatar
Dario Seyb committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#include <engine/scene/scenes/AtmosphereTestScene.hpp>

#include <engine/ui/UISystem.hpp>

#include <ACGL/ACGL.hh>

#include <ACGL/OpenGL/Objects.hh>
#include <ACGL/Base/Settings.hh>
#include <ACGL/Math/Math.hh>
#include <ACGL/OpenGL/Data/TextureLoadStore.hh>
#include <ACGL/OpenGL/Managers.hh>

#include <ACGL/OpenGL/Creator/ShaderProgramCreator.hh>
#include <ACGL/OpenGL/Creator/VertexArrayObjectCreator.hh>
#include <ACGL/OpenGL/Creator/Texture2DCreator.hh>

#include <engine/scene/Transform.hpp>
#include <engine/scene/Drawable.hpp>
#include <engine/scene/Planet.hpp>

#include <engine/events/MouseEvent.hpp>
#include <engine/events/KeyboardEvent.hpp>

#include <engine/graphics/BloomPostFX.hpp>

Dario Seyb's avatar
Dario Seyb committed
26

Dario Seyb's avatar
Dario Seyb committed
27 28 29 30
using namespace ACGL::OpenGL;
using namespace ACGL::Base;
using namespace ACGL::Utils;

Dario Seyb's avatar
Dario Seyb committed
31 32 33 34 35 36 37 38 39 40 41 42
void AtmosphereTestScene::switchConsole() {
  if (isInterpolatingCamera) return;
  m_player->setHasControl(false);

  if (isFocusedOnConsole) {
    camStartPos = m_player->getCockpitPosition();
    camTargetPos = { 0, 0 , 0 };
    camStartRot = glm::quat_cast(m_player->getRotation());
    camTargetRot = glm::quat();
    m_console.pause();
    m_renderer->setRenderPassActive("Main"_sh, true);
    m_renderer->setRenderPassActive("Skybox"_sh, true);
David Gilbert's avatar
David Gilbert committed
43
    m_renderer->setRenderPassActive("Minimap"_sh, true);
Dario Seyb's avatar
Dario Seyb committed
44
    cockpitSoundSource->setVolume(0);
Dario Seyb's avatar
Dario Seyb committed
45
    cockpitSoundSource->play(-1);
Dario Seyb's avatar
Dario Seyb committed
46 47
    m_renderer->setRenderPassActive("Console"_sh, false);

Dario Seyb's avatar
Dario Seyb committed
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
  } else {
    // TODO: Fix returning to console!
    return;
    camStartPos = m_player->getCockpitPosition();
    camTargetPos = CAM_CONSOLE_POS;
    camStartRot = glm::quat_cast(m_player->getRotation());
    camTargetRot = glm::quat_cast(CAM_CONSOLE_ROT);
    m_console.play();
  }

  isFocusedOnConsole = !isFocusedOnConsole;
  interpolationTime = 0;
  totalInterpolationTime = 4;
  isInterpolatingCamera = true;
}

Dario Seyb's avatar
Dario Seyb committed
64 65 66 67 68 69 70 71 72
bool AtmosphereTestScene::startup() {
  if (!Scene::startup()) {
    return false;
  }

  RESOLVE_DEPENDENCY(m_player);
  RESOLVE_DEPENDENCY(m_orbitals);

  m_renderer->addEffect<BloomPostFX>();
Dario Seyb's avatar
Dario Seyb committed
73

Dario Seyb's avatar
Dario Seyb committed
74 75 76 77
  consoleCamera = m_sceneGraph->create();
  consoleCamera.assign<Transform>();
  consoleCamera.assign<Camera>(50, 0.1, 50);

Dario Seyb's avatar
Dario Seyb committed
78 79 80 81
  m_audio->setListener(consoleCamera);

  m_renderer->setRenderPassActive("Main"_sh, false);
  m_renderer->setRenderPassActive("Skybox"_sh, false);
David Gilbert's avatar
David Gilbert committed
82
  m_renderer->setRenderPassActive("Minimap"_sh, false);
Dario Seyb's avatar
Dario Seyb committed
83

Dario Seyb's avatar
Dario Seyb committed
84
  m_renderer->setRenderPassSSAO("Cockpit"_sh, false);
Dario Seyb's avatar
Dario Seyb committed
85

Dario Seyb's avatar
Dario Seyb committed
86
  m_renderer->addRenderPass(consoleCamera, "Console"_sh, ScreenSpaceSize::HALF);
Dario Seyb's avatar
Dario Seyb committed
87

88 89 90 91 92
  m_console.m_events = m_events;
  m_console.m_renderer = m_renderer;
  m_console.m_sceneGraph = m_sceneGraph;
  m_console.m_audio = m_audio;

Dario Seyb's avatar
Dario Seyb committed
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
  auto textTexture =
    Texture2DFileManager::the()->get(Texture2DCreator("none.png"));
  auto textGeom = Geometry{ VertexArrayObjectCreator("loading_text.obj").create() };

  auto textShader =
    ShaderProgramFileManager::the()->get(ShaderProgramCreator("console/Title")
      .attributeLocations(textGeom.vao->getAttributeLocations())
      .fragmentDataLocations(m_renderer->getGBufferLocations()));

  loadingText = m_sceneGraph->create();
  loadingText.assign<Drawable>(textGeom,
    Material{ glm::vec4{ 1, 1, 1, 1 }, glm::vec4{ 1, 1, 1, 1 } * 10,
    textTexture, nullptr, nullptr, textShader,
    false, RenderQueue::OPAQUE, GL_BACK },
    0, m_renderer->getRenderPassId("Console"_sh));

  auto textTransform = loadingText.assign<Transform>();
  textTransform->position = { 0, -3, -11 };
  loadingText.assign<Light>(glm::vec4(0, 0.2, 1.0, 5), glm::vec3(1, 0, 0),
    false, LightType::POINT, m_renderer->getRenderPassId("Console"_sh));
Dario Seyb's avatar
Dario Seyb committed
113 114 115 116 117 118 119 120


  SDL_SetRelativeMouseMode(SDL_TRUE);
  m_player->setHasControl(false);
  m_player->setCockpitPosition(CAM_CONSOLE_POS);
  m_player->setRotation(CAM_CONSOLE_ROT);

  m_events->subscribe<SimulateEvent>([this](const SimulateEvent &e) {
Dario Seyb's avatar
Dario Seyb committed
121 122 123 124 125

    if (didOneFrame && !resourceLoadingFinished) {
      loadMainSceneResources();
      switchToMainScene();
      m_renderer->setRenderPassOnlyTexture("Console"_sh, true);
David Gilbert's avatar
David Gilbert committed
126
      m_console.startup();      
Dario Seyb's avatar
Dario Seyb committed
127 128 129 130 131 132 133 134
    }

    didOneFrame = true;

    if (!resourceLoadingFinished) {
      return;
    }

135 136
    sunLight->dir = -glm::normalize(m_player->getWorldPosition());
    cockpitSunLight->dir =
Dario Seyb's avatar
Dario Seyb committed
137
      glm::vec3(glm::dvec4(sunLight->dir, 0) * m_player->getShipRotation());
138

Dario Seyb's avatar
Dario Seyb committed
139 140 141 142 143
    if (isFocusedOnConsole) {
      if (m_console.update(e, m_player->getKeyTable())) {
        switchConsole();
      }
    }
Dario Seyb's avatar
Dario Seyb committed
144 145 146 147 148 149 150

    if (isInterpolatingCamera) {
      double interpolationPercent = 1.0 - glm::pow(1 - interpolationTime / totalInterpolationTime, 2);
      m_player->setCockpitPosition(camStartPos + (camTargetPos-camStartPos)*interpolationPercent);

      interpolationPercent = 1.0 - glm::pow(1 - interpolationTime / totalInterpolationTime, 5);

Dario Seyb's avatar
Dario Seyb committed
151 152
      consoleSoundSource->setVolume((1.0f - interpolationTime / totalInterpolationTime) * 0.5);
      cockpitSoundSource->setVolume(interpolationTime / totalInterpolationTime);
153

Dario Seyb's avatar
Dario Seyb committed
154 155 156 157 158 159 160 161
      glm::quat rot = glm::slerp(camStartRot, camTargetRot, (float)interpolationPercent);
      m_player->setRotation(glm::mat4_cast(rot));
      interpolationTime += e.dt;
      if (interpolationTime >= totalInterpolationTime) {
        m_player->setCockpitPosition(camTargetPos);
        m_player->setRotation(glm::mat4_cast(camTargetRot));
        isInterpolatingCamera = false;
        m_player->setHasControl(true);
162
        consoleSoundSource->setVolume(0);
Dario Seyb's avatar
Dario Seyb committed
163
        cockpitSoundSource->setVolume(1);
Dario Seyb's avatar
Dario Seyb committed
164 165 166 167 168 169 170 171 172 173 174 175 176 177
      }
    }
  });

  m_events->subscribe<KeyboardEvent>([this](const KeyboardEvent &e) {
    switch (e.originalEvent.key.keysym.scancode) {
    case SDL_SCANCODE_TAB:
        if (e.originalEvent.key.type == SDL_KEYDOWN) {
          m_player->attachToParent(earth);
          float r = earth.component<Transform>()->scale.x;
          m_player->setPosition(glm::vec3(0, 0, r * 1.2));
          m_player->setRotation(glm::mat4());
        }
      break;
Dario Seyb's avatar
Dario Seyb committed
178
    case SDL_SCANCODE_RETURN:
Dario Seyb's avatar
Dario Seyb committed
179
      if (e.originalEvent.key.type == SDL_KEYDOWN) {
Dario Seyb's avatar
Dario Seyb committed
180 181
        switchConsole();
      }
Dario Seyb's avatar
Dario Seyb committed
182
      break;
Dario Seyb's avatar
Dario Seyb committed
183 184 185
    case SDL_SCANCODE_R:
      if (e.originalEvent.key.type == SDL_KEYDOWN) {
        ShaderProgramFileManager::the()->updateAll();
Dario Seyb's avatar
Dario Seyb committed
186
        Texture2DFileManager::the()->updateAll();
Dario Seyb's avatar
Dario Seyb committed
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
      }
    default:
      break;
    }
  });

  // Subscribe to the UI drawing event.
  // This is called once per frame
  m_events->subscribe<"DrawUI"_sh>([this]() {

    ImGui::Begin("Camera Control", 0,
                 ImGuiWindowFlags_::ImGuiWindowFlags_AlwaysAutoResize);

    float r;
    if (ImGui::Button("Sun/Global", glm::vec2(100, 20))) {
      // Reset the camera to sun coords
      m_player->attachToParent(sun);
      r = sun.component<Transform>()->scale.x;
      m_player->setPosition(glm::dvec3(0, 0, r * 1.2));
      m_player->setRotation(glm::dmat4());
    }

    if (ImGui::Button("Earth", glm::vec2(100, 20))) {
      m_player->attachToParent(earth);
      r = earth.component<Transform>()->scale.x;
      m_player->setPosition(glm::dvec3(0, 0, r * 1.2));
      m_player->setRotation(glm::dmat4());
    }
Dario Seyb's avatar
Dario Seyb committed
215

Dario Seyb's avatar
Dario Seyb committed
216 217
    ImGui::End();
  });
Dario Seyb's avatar
Dario Seyb committed
218

Dario Seyb's avatar
Dario Seyb committed
219 220 221 222
  return true;
}

void AtmosphereTestScene::switchToMainScene() {
David Gilbert's avatar
David Gilbert committed
223 224


Dario Seyb's avatar
Dario Seyb committed
225 226
  {
    auto skyboxPassId = m_renderer->getRenderPassId("Skybox"_sh);
Dario Seyb's avatar
Dario Seyb committed
227

Dario Seyb's avatar
Dario Seyb committed
228 229
    skybox = m_sceneGraph->create();
    skybox.assign<Transform>();
Dario Seyb's avatar
Dario Seyb committed
230 231 232
    skybox.assign<Drawable>(skyboxGeometry, skyboxMaterial, 0, skyboxPassId);
    skybox.assign<Light>(glm::vec4(1, 1, 1, 1), glm::vec3(1, 0, 0), false,
                         LightType::POINT, skyboxPassId);
Dario Seyb's avatar
Dario Seyb committed
233
  }
Dario Seyb's avatar
Dario Seyb committed
234

Dario Seyb's avatar
Dario Seyb committed
235 236 237 238 239 240 241 242
  {
    auto mainPassId = m_renderer->getRenderPassId("Main"_sh);

    // Let's create a placeholder sun
    sun = m_sceneGraph->create();
    // Add a transform component to it so we are able to position it in space
    auto sunTransform = sun.assign<Transform>();
    // Add a Drawable component to it so the renderer has something to draw
David Gilbert's avatar
David Gilbert committed
243
    sun.assign<Drawable>(sunGeometry, sunMaterial, 0, m_renderer->getRenderPassId("Main"_sh));
Dario Seyb's avatar
Dario Seyb committed
244 245
    float scale = m_orbitals->solarRadius * m_orbitals->scaleFactor * 0.1;
    sunTransform->scale = glm::dvec3(scale);
Dario Seyb's avatar
Dario Seyb committed
246
    sunLight = sun.assign<Light>(glm::vec4(1, 1, 1, 1.5), glm::vec3(1, 0, 0),
David Gilbert's avatar
David Gilbert committed
247 248 249 250 251 252
                                 false, LightType::DIRECTIONAL, m_renderer->getRenderPassId("Main"_sh));

    // Let's create a placeholder sun
    sun2 = m_sceneGraph->create();
    // Add a transform component to it so we are able to position it in space
    auto sunTransform2 = sun2.assign<Transform>();
Dario Seyb's avatar
Dario Seyb committed
253
    sunMaterial.emissiveColor.a = 3.0;
David Gilbert's avatar
David Gilbert committed
254 255 256
    // Add a Drawable component to it so the renderer has something to draw
    sun2.assign<Drawable>(sunGeometry, sunMaterial, 0, m_renderer->getRenderPassId("Minimap"_sh));
    //float scale2 = m_orbitals->solarRadius * m_orbitals->scaleFactor * 0.1;
Dario Seyb's avatar
Dario Seyb committed
257
    sunTransform2->scale = glm::dvec3(0.4, 0.4, 0.4);
David Gilbert's avatar
David Gilbert committed
258 259 260 261
    sunTransform2->position = glm::dvec3(0, 0, -70);
    sunLight2 = sun2.assign<Light>(glm::vec4(1, 1, 1, 1), glm::vec3(1, 0, 0),
      false, LightType::POINT, m_renderer->getRenderPassId("Minimap"_sh));

Dario Seyb's avatar
Dario Seyb committed
262 263 264 265 266 267 268

    // create a planet!
    // Mass in solar masses, Radius in solar radii, Eccentricity, Semimajor
    // axis, Inclination, Ascending Node, Arg. of Periapsis, time at perihelion
    //																mass              radius
    //e
    // a        i          N          w
Dario Seyb's avatar
Dario Seyb committed
269

Dario Seyb's avatar
Dario Seyb committed
270 271 272 273 274 275 276 277
    mercury = m_orbitals->addPlanet(sunTransform, "Mercury", 0.000000165956, 0.003505316091954, 0.205633, 0.387098, 0.1222500, 0.84153, 0.50768, 0, "earth");
    venus = m_orbitals->addPlanet(sunTransform, "Venus", 0.00000243522, 0.008695402298851, 0.006778, 0.723330, 0.0592500, 1.33679, 0.95717, 0, "mars");
    earth = m_orbitals->addPlanet(sunTransform, "Earth", 0.000002988, 0.009153735632184, 0.016713, 1.000000, 0.0000000, 0.00000, 4.93533, 0, m_settings->getDefaultPlanetType());
    mars = m_orbitals->addPlanet(sunTransform, "Mars", 0.000000319716, 0.004870689655172, 0.093396, 1.523688, 0.0322851, 0.02333, 4.99858, 0, "mars");
    jupiter = m_orbitals->addPlanet(sunTransform, "Jupiter", 0.000954265748, 0.1004468390805, 0.048482, 5.202560, 0.0227500, 1.75150, 4.77905, 0, "jupiter");
    saturn = m_orbitals->addPlanet(sunTransform, "Saturn", 0.00028386, 0.08366666666667, 0.055580, 9.554750, 0.0434412, 1.98230, 5.92169, 0, "jupiter");
    uranus = m_orbitals->addPlanet(sunTransform, "Uranus", 0.00004344552, 0.03643965517241, 0.047292, 19.18176, 0.0134948, 1.29060, 1.68516, 0, "jupiter");
    neptune = m_orbitals->addPlanet(sunTransform, "Neptune", 0.0000512442, 0.03537643678161, 0.008598, 30.05814, 0.0002355, 2.29810, 4.76243, 0, "jupiter");
Dario Seyb's avatar
Dario Seyb committed
278

Dario Seyb's avatar
Dario Seyb committed
279 280 281 282

    m_player->attachToParent(earth);
    double r = earth.component<Transform>()->scale.x;
    m_player->setPosition(glm::dvec3(0, 0, r * 1.2));
Dario Seyb's avatar
Dario Seyb committed
283
  }
Dario Seyb's avatar
Dario Seyb committed
284

Dario Seyb's avatar
Dario Seyb committed
285
  {
Dario Seyb's avatar
Dario Seyb committed
286
    auto cockpitPassId = m_renderer->getRenderPassId("Cockpit"_sh);
Dario Seyb's avatar
Dario Seyb committed
287

Dario Seyb's avatar
Dario Seyb committed
288
    cockpit = m_sceneGraph->create();
Dario Seyb's avatar
Dario Seyb committed
289 290
    auto cockpitDrawable = cockpit.assign<Drawable>(
        cockpitGeometry, cockpitMaterial, 0, cockpitPassId);
Dario Seyb's avatar
Dario Seyb committed
291 292 293
    auto cockpitTransform = cockpit.assign<Transform>();
    cockpitTransform->position = glm::dvec3(0, 0, 0);
    cockpitDrawable->visible = true;
Dario Seyb's avatar
Dario Seyb committed
294 295 296
    auto cockpitLight =
        cockpit.assign<Light>(glm::vec4(1, 1, 1, 0.2), glm::vec3(1, 0, 0),
                              false, LightType::POINT, cockpitPassId);
Dario Seyb's avatar
Dario Seyb committed
297

Dario Seyb's avatar
Dario Seyb committed
298

Dario Seyb's avatar
Dario Seyb committed
299
    cockpitSoundSource = cockpit.assign<SoundSource>(soundTrackIntro);
Dario Seyb's avatar
Dario Seyb committed
300

Dario Seyb's avatar
merged  
Dario Seyb committed
301 302
    cockpitSun = m_sceneGraph->create();
    cockpitSun.assign<Transform>();
Dario Seyb's avatar
Dario Seyb committed
303 304 305
    cockpitSunLight =
        cockpitSun.assign<Light>(glm::vec4(1, 1, 1, 3), glm::vec3(1, 0, 0),
                                 true, LightType::DIRECTIONAL, cockpitPassId);
Dario Seyb's avatar
merged  
Dario Seyb committed
306

Dario Seyb's avatar
Dario Seyb committed
307 308 309 310 311
    auto console = m_sceneGraph->create();
    console.assign<Drawable>(
        consoleGeom,
        Material{glm::vec4{1, 1, 1, 1}, glm::vec4{1, 1, 1, 1},
                 m_renderer->getRenderPassTarget("Console"_sh), nullptr, nullptr,
Dario Seyb's avatar
Dario Seyb committed
312
                 skyboxMaterial.prog, false, RenderQueue::OPAQUE, GL_NONE},
Dario Seyb's avatar
Dario Seyb committed
313
        0, cockpitPassId);
314
    auto consoleTransform = console.assign<Transform>();
315

Dario Seyb's avatar
Dario Seyb committed
316
    consoleSoundSource = console.assign<SoundSource>(soundTrackMain);
Dario Seyb's avatar
Dario Seyb committed
317
    consoleSoundSource->setVolume(0.5);
Dario Seyb's avatar
Dario Seyb committed
318
    consoleSoundSource->play(-1);
Dario Seyb's avatar
Dario Seyb committed
319

Dario Seyb's avatar
Dario Seyb committed
320 321
    auto consoleFrontLeft = m_sceneGraph->create();
    consoleFrontLeft.assign<Drawable>(
Dario Seyb's avatar
Dario Seyb committed
322
      consoleFrontLeftGeom,
Dario Seyb's avatar
Dario Seyb committed
323
      Material{ glm::vec4{ 1, 1, 1, 1 }, glm::vec4{ 1, 1, 1, 1 },
Dario Seyb's avatar
POLISH  
Dario Seyb committed
324
      outOfOrderTexture, nullptr, nullptr,
Dario Seyb's avatar
Dario Seyb committed
325
      skyboxMaterial.prog, true, RenderQueue::OPAQUE, GL_NONE },
Dario Seyb's avatar
Dario Seyb committed
326
      0, cockpitPassId);
Dario Seyb's avatar
Dario Seyb committed
327
    consoleFrontLeft.assign<Transform>();
Dario Seyb's avatar
Dario Seyb committed
328

Dario Seyb's avatar
Dario Seyb committed
329 330
    auto consoleFrontRight = m_sceneGraph->create();
    consoleFrontRight.assign<Drawable>(
Dario Seyb's avatar
Dario Seyb committed
331
      consoleFrontRightGeom,
Dario Seyb's avatar
Dario Seyb committed
332
      Material{ glm::vec4{ 1, 1, 1, 1 }, glm::vec4{ 1, 1, 1, 1 },
Dario Seyb's avatar
POLISH  
Dario Seyb committed
333
      outOfOrderTexture, nullptr, nullptr,
Dario Seyb's avatar
Dario Seyb committed
334 335 336 337 338 339
      skyboxMaterial.prog, true, RenderQueue::OPAQUE, GL_NONE },
      0, cockpitPassId);
    consoleFrontRight.assign<Transform>();

    auto consoleBackLeft = m_sceneGraph->create();
    consoleBackLeft.assign<Drawable>(
Dario Seyb's avatar
Dario Seyb committed
340
      consoleBackLeftGeom,
Dario Seyb's avatar
Dario Seyb committed
341
      Material{ glm::vec4{ 1, 1, 1, 1 }, glm::vec4{ 1, 1, 1, 1 },
David Gilbert's avatar
David Gilbert committed
342
      m_renderer->getRenderPassTarget("Minimap"_sh), nullptr, nullptr,
Dario Seyb's avatar
Dario Seyb committed
343
      skyboxMaterial.prog, true, RenderQueue::OPAQUE, GL_NONE },
Dario Seyb's avatar
Dario Seyb committed
344
      0, cockpitPassId);
Dario Seyb's avatar
Dario Seyb committed
345 346 347 348
    consoleBackLeft.assign<Transform>();

    auto consoleBackRight = m_sceneGraph->create();
    consoleBackRight.assign<Drawable>(
Dario Seyb's avatar
Dario Seyb committed
349
      consoleBackRightGeom,
Dario Seyb's avatar
Dario Seyb committed
350
      Material{ glm::vec4{ 1, 1, 1, 1 }, glm::vec4{ 1, 1, 1, 1 },
Dario Seyb's avatar
POLISH  
Dario Seyb committed
351
      outOfOrderTexture, nullptr, nullptr,
Dario Seyb's avatar
Dario Seyb committed
352 353 354 355 356 357 358
      skyboxMaterial.prog, true, RenderQueue::OPAQUE, GL_NONE },
      0, cockpitPassId);
    consoleBackRight.assign<Transform>();


    auto consoleMiddleLeft= m_sceneGraph->create();
    consoleMiddleLeft.assign<Drawable>(
Dario Seyb's avatar
Dario Seyb committed
359
      consoleMiddleLeftGeom,
Dario Seyb's avatar
Dario Seyb committed
360
      Material{ glm::vec4{ 1, 1, 1, 1 }, glm::vec4{ 1, 1, 1, 1 },
Dario Seyb's avatar
POLISH  
Dario Seyb committed
361
      outOfOrderTexture, nullptr, nullptr,
Dario Seyb's avatar
Dario Seyb committed
362 363
      skyboxMaterial.prog, true, RenderQueue::OPAQUE, GL_NONE },
      0, cockpitPassId);
Dario Seyb's avatar
POLISH  
Dario Seyb committed
364
    consoleMiddleLeft.assign<Transform>()->scale = { -1, 1, 1 };
Dario Seyb's avatar
Dario Seyb committed
365

Dario Seyb's avatar
Dario Seyb committed
366 367
    auto consoleMiddleRight = m_sceneGraph->create();
    consoleMiddleRight.assign<Drawable>(
Dario Seyb's avatar
Dario Seyb committed
368
      consoleMiddleRightGeom,
Dario Seyb's avatar
Dario Seyb committed
369
      Material{ glm::vec4{ 1, 1, 1, 1 }, glm::vec4{ 1, 1, 1, 1 },
Dario Seyb's avatar
POLISH  
Dario Seyb committed
370
      outOfOrderTexture, nullptr, nullptr,
Dario Seyb's avatar
Dario Seyb committed
371
      skyboxMaterial.prog, true, RenderQueue::OPAQUE, GL_NONE },
Dario Seyb's avatar
Dario Seyb committed
372
      0, cockpitPassId);
Dario Seyb's avatar
POLISH  
Dario Seyb committed
373
    consoleMiddleRight.assign<Transform>()->scale = { -1, 1, 1 };
Dario Seyb's avatar
Dario Seyb committed
374

Dario Seyb's avatar
Dario Seyb committed
375 376 377 378 379 380
    auto windShield = m_sceneGraph->create();
    windShield.assign<Drawable>(
      windShieldGeom,
      windshieldMaterial,
      0, cockpitPassId);
    windShield.assign<Transform>();
Dario Seyb's avatar
Dario Seyb committed
381
  }
Dario Seyb's avatar
Dario Seyb committed
382 383 384

  loadingText.component<Drawable>()->visible = false;
  loadingText.destroy();
Dario Seyb's avatar
Dario Seyb committed
385
}
Dario Seyb's avatar
Dario Seyb committed
386

Dario Seyb's avatar
Dario Seyb committed
387
void AtmosphereTestScene::loadMainSceneResources() {
388
  auto qualitySetting = m_settings->getQualitySetting();
Dario Seyb's avatar
Dario Seyb committed
389 390 391 392 393 394 395
  {
    auto vaoSkybox = VertexArrayObjectCreator("skybox.obj").create();
    auto skyboxShader = ShaderProgramFileManager::the()->get(
        ShaderProgramCreator("Skybox")
            .attributeLocations(vaoSkybox->getAttributeLocations())
            .fragmentDataLocations(m_renderer->getGBufferLocations()));

396 397 398 399

    auto skyboxTexName = qualitySetting == QualitySetting::High ? "skybox_large.png" : qualitySetting == QualitySetting::Medium ? "skybox_medium.png" : "skybox.png";

    auto skyboxTexture = Texture2DFileManager::the()->get(Texture2DCreator(skyboxTexName));
Dario Seyb's avatar
Dario Seyb committed
400 401 402

    skyboxGeometry = {vaoSkybox};
    skyboxMaterial = {glm::vec4{1, 1, 1, 1},
Dario Seyb's avatar
POLISH  
Dario Seyb committed
403
                      glm::vec4{0.05, 0.05, 0.05, 1},
Dario Seyb's avatar
Dario Seyb committed
404 405 406 407 408 409 410 411
                      skyboxTexture,
                      nullptr,
                      nullptr,
                      skyboxShader,
                      false,
                      RenderQueue::OPAQUE,
                      GL_BACK};
  }
Dario Seyb's avatar
Dario Seyb committed
412

Dario Seyb's avatar
Dario Seyb committed
413 414 415 416 417
  {
    auto vaoSun = VertexArrayObjectCreator("uvsphere.obj").create();
    auto checkboardTexture =
        Texture2DFileManager::the()->get(Texture2DCreator("checkerboard.png"));

Dario Seyb's avatar
Dario Seyb committed
418 419 420 421
    auto sunShader = ShaderProgramFileManager::the()->get(
      ShaderProgramCreator("PBR")
      .attributeLocations(vaoSun->getAttributeLocations())
      .fragmentDataLocations(m_renderer->getGBufferLocations()));
Dario Seyb's avatar
Dario Seyb committed
422 423 424 425 426 427 428 429 430 431 432 433 434

    sunGeometry = {vaoSun};

    sunMaterial = {glm::vec4{1, 1, 1, 1},
                   glm::vec4{2, 2, 1, 20},
                   checkboardTexture,
                   nullptr,
                   nullptr,
                   sunShader,
                   false,
                   RenderQueue::OPAQUE,
                   GL_BACK};
  }
Dario Seyb's avatar
Dario Seyb committed
435

Dario Seyb's avatar
Dario Seyb committed
436 437
  {
    // create cockpit
Dario Seyb's avatar
Dario Seyb committed
438
    auto vaoCockpit = VertexArrayObjectCreator("cockpit/cockpit_v2_outer.obj").create();
Dario Seyb's avatar
Dario Seyb committed
439 440 441 442
    auto cockpitShader = ShaderProgramFileManager::the()->get(
      ShaderProgramCreator("PBR")
      .attributeLocations(vaoCockpit->getAttributeLocations())
      .fragmentDataLocations(m_renderer->getGBufferLocations()));
Dario Seyb's avatar
Dario Seyb committed
443 444 445 446

    cockpitMaterial = {
        glm::vec4{0.4, 0.4, 0.4, 1}, glm::vec4{0, 0, 0, 1},
        Texture2DFileManager::the()->get(Texture2DCreator(
Dario Seyb's avatar
Dario Seyb committed
447
            "cockpit_v2/cockpit_v2_outer_DefaultMaterial_AlbedoTransparency.png")),
Dario Seyb's avatar
Dario Seyb committed
448
        Texture2DFileManager::the()->get(
Dario Seyb's avatar
Dario Seyb committed
449
            Texture2DCreator("cockpit_v2/cockpit_v2_outer_DefaultMaterial_Normal.png")),
Dario Seyb's avatar
Dario Seyb committed
450
        Texture2DFileManager::the()->get(Texture2DCreator(
Dario Seyb's avatar
Dario Seyb committed
451
            "cockpit_v2/cockpit_v2_outer_DefaultMaterial_SpecularSmoothness.png")),
Dario Seyb's avatar
Dario Seyb committed
452
        cockpitShader, true, RenderQueue::OPAQUE, GL_NONE };
Dario Seyb's avatar
Dario Seyb committed
453 454

    cockpitGeometry = {vaoCockpit};
Dario Seyb's avatar
Dario Seyb committed
455

Dario Seyb's avatar
POLISH  
Dario Seyb committed
456
    windshieldMaterial = Material{ glm::vec4{ 0.2, 0.3, 1.0, 0.2 }, glm::vec4{ 0.02, 0.03, 0.05, 1 },
Dario Seyb's avatar
Dario Seyb committed
457 458 459
      Texture2DFileManager::the()->get(Texture2DCreator(
        "cockpit_v2/"
        "windshield_DefaultMaterial_AlbedoTransparency.png")),
Dario Seyb's avatar
Dario Seyb committed
460
      nullptr, nullptr, cockpitShader, false,
Dario Seyb's avatar
Dario Seyb committed
461
      RenderQueue::OPAQUE, GL_NONE };
Dario Seyb's avatar
Dario Seyb committed
462 463 464 465 466 467 468 469 470 471

    consoleGeom = Geometry{ VertexArrayObjectCreator("cockpit/cockpit_v2_maindisplay.obj").create() };
    consoleFrontLeftGeom = Geometry{ VertexArrayObjectCreator("cockpit/cockpit_v2_console_front_left.obj").create() };
    consoleFrontRightGeom = Geometry{ VertexArrayObjectCreator("cockpit/cockpit_v2_console_front_right.obj").create() };
    consoleBackLeftGeom = Geometry{ VertexArrayObjectCreator("cockpit/cockpit_v2_console_back_left.obj").create() };
    consoleBackRightGeom = Geometry{ VertexArrayObjectCreator("cockpit/cockpit_v2_console_back_right.obj").create() };
    consoleMiddleLeftGeom = Geometry{ VertexArrayObjectCreator("cockpit/cockpit_v2_console_middle_left.obj").create() };
    consoleMiddleRightGeom = Geometry{ VertexArrayObjectCreator("cockpit/cockpit_v2_console_middle_right.obj").create() };
    windShieldGeom = Geometry{ VertexArrayObjectCreator("cockpit/cockpit_v2_windshield.obj").create() };

Dario Seyb's avatar
POLISH  
Dario Seyb committed
472 473 474

    outOfOrderTexture = Texture2DFileManager::the()->get(Texture2DCreator("cockpit_v2/outoforder.png"));

Dario Seyb's avatar
Dario Seyb committed
475 476
    soundTrackIntro = m_audio->createSound("GameAmbient.mp3", SoundMode::MODE_2D);
    soundTrackMain = m_audio->createSound("SpaceTheme.mp3", SoundMode::MODE_2D);
Dario Seyb's avatar
Dario Seyb committed
477

Dario Seyb's avatar
Dario Seyb committed
478
  }
Dario Seyb's avatar
Dario Seyb committed
479

Dario Seyb's avatar
Dario Seyb committed
480
  resourceLoadingFinished = true;
Dario Seyb's avatar
Dario Seyb committed
481 482
}

Dario Seyb's avatar
Dario Seyb committed
483
void AtmosphereTestScene::shutdown() {}