Conquer Space 0.0.0
A space themed grand strategy game set in the near future, with realistic orbital mechanics, and an emphasis on economics and politics.
starsystemrenderer.h
Go to the documentation of this file.
1/* Conquer Space
2 * Copyright (C) 2021-2025 Conquer Space
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17#pragma once
18
19#include <map>
20#include <string>
21#include <vector>
22
30#include "core/universe.h"
31#include "engine/application.h"
36#include "entt/entt.hpp"
37#include "glm/glm.hpp"
38
39namespace cqsp::client::systems {
40/*
41 * Main renderer for the solar system
42 */
44 public:
46 void Initialize();
47 void OnTick();
48 void Render(float delta_time);
49 void SeeStarSystem();
50 void Update(float delta_time);
51 void DoUI(float delta_time);
52
55
56 double min_zoom = 1;
57 // Light year sized
58 double max_zoom = 9.4605284e15;
59
60 double GetDivider() { return divider; }
61
62 void DrawAllOrbits();
63
65
67
68 private:
71
77
84
94#if FALSE
95 // Disabled for now
96 asset::ShaderProgram_t no_light_shader;
97#endif
98
99 void DrawStars();
100 void DrawBodies();
101 void DrawShips();
102 void DrawSkybox();
103 void DrawModels();
104
105 void DrawEntityName(glm::vec3 &object_pos, entt::entity ent_id);
106 void DrawEntityName(glm::vec3 &object_pos, const std::string &name);
107 void DrawPlanetBillboard(const entt::entity &ent_id, const glm::vec3 &object_pos);
108 void DrawShipIcon(const glm::vec3 &object_pos);
109 void DrawCityIcon(const glm::vec3 &object_pos, float alpha_value);
110
111 void DrawAllCities(auto &bodies);
112
113 void DrawAllPlanets(auto &bodies);
115
116 void DrawTexturedPlanet(const glm::vec3 &object_pos, const entt::entity entity);
117 void GetPlanetTexture(const entt::entity entity, bool &have_normal, bool &have_roughness, bool &have_province);
118 void DrawTerrainlessPlanet(const entt::entity &entity, glm::vec3 &object_pos);
119
120 void DrawStar(const entt::entity &entity, glm::vec3 &object_pos);
121 void RenderCities(glm::vec3 &object_pos, const entt::entity &body_entity);
122 void DrawIndividualCity(const entt::entity city_entity, const glm::vec3 &offset, const glm::vec3 &object_pos,
123 const glm::quat &quat, double radius, const std::string &name);
124 bool CityIsVisible(glm::vec3 city_pos, glm::vec3 planet_pos, glm::vec3 cam_pos);
125
126 asset::ShaderProgram_t ConstructShader(const std::string &key);
127
128 void LoadPlanetTextures();
129 void LoadPlanetProvinceMap(entt::entity body);
130
132 void InitializeMeshes();
133
134 void DrawOrbit(const entt::entity &entity);
135
136 glm::vec3 TranslateToNormalized(const glm::vec3 &);
137
141 glm::vec4 CalculateGLPosition(const glm::vec3 &object_pos);
145 bool GLPositionNotInBounds(const glm::vec4 &gl_Position, const glm::vec3 &pos);
146 glm::mat4 GetBillboardMatrix(const glm::vec3 &pos);
147 glm::vec3 GetBillboardPosition(const glm::vec3 &object_pos);
148 void SetBillboardProjection(cqsp::asset::ShaderProgram_t &shader, glm::mat4 mat);
149
150 float GetWindowRatio();
151
152 float Lerp(float a, float b, float t);
153
154 // How much to scale the the star system.
155 const double divider = 0.01;
157
158 const float circle_size = 0.01f;
159
160 glm::vec3 sun_position;
161 glm::vec3 sun_color;
162
164
169
170 float view_scale = 10.f;
171
172 const int sphere_resolution = 64;
173
174 bool have_province = false;
175
178
179 void SetupDummyTextures();
180
181 void UpdatePlanetProvinceColors(entt::entity body, entt::entity province, glm::vec4 color);
182 void MassUpdatePlanetProvinceColors(entt::entity entity);
183 void ResetPlanetProvinceColors(entt::entity entity);
184
186 void ComputeOverlay();
189};
190} // namespace cqsp::client::systems
Definition: texture.h:49
Definition: texture.h:32
Definition: starsystemcontroller.h:34
entt::entity GetSelectedCountry()
Definition: starsystemcontroller.h:71
Definition: starsystemoverlay.h:28
Definition: starsystemviewui.h:27
Definition: sysorbitgeometry.h:27
Definition: starsystemrenderer.h:43
glm::vec4 CalculateGLPosition(const glm::vec3 &object_pos)
Calculates the GL position for a log renderbuffer.
Definition: starsystemrenderer.cpp:684
void DrawTexturedPlanet(const glm::vec3 &object_pos, const entt::entity entity)
Definition: starsystemrenderer.cpp:338
int ship_icon_layer
Definition: starsystemrenderer.h:165
engine::Renderable sun
Definition: starsystemrenderer.h:83
SysOrbitGeometry orbit_geometry
Definition: starsystemrenderer.h:75
void SeeStarSystem()
Definition: starsystemrenderer.cpp:153
asset::ShaderProgram_t sun_shader
Definition: starsystemrenderer.h:91
~SysStarSystemRenderer()
Definition: starsystemrenderer.cpp:800
void DrawPlanetBillboard(const entt::entity &ent_id, const glm::vec3 &object_pos)
Definition: starsystemrenderer.cpp:282
void LoadPlanetProvinceMap(entt::entity body)
Definition: starsystemrenderer.cpp:795
void GetPlanetTexture(const entt::entity entity, bool &have_normal, bool &have_roughness, bool &have_province)
Definition: starsystemrenderer.cpp:380
float Lerp(float a, float b, float t)
Definition: starsystemrenderer.cpp:719
void DrawAllOrbits()
Definition: starsystemrenderer.cpp:752
engine::Renderable ship_overlay
Definition: starsystemrenderer.h:81
void DrawOrbit(const entt::entity &entity)
Definition: starsystemrenderer.cpp:764
void DrawShipIcon(const glm::vec3 &object_pos)
Definition: starsystemrenderer.cpp:324
engine::Renderable city_render_object
Definition: starsystemrenderer.h:82
asset::ShaderProgram_t orbit_shader
Definition: starsystemrenderer.h:85
void DrawAllCities(auto &bodies)
Definition: starsystemrenderer.cpp:316
void InitializeMeshes()
Definition: starsystemrenderer.cpp:643
asset::ShaderProgram_t near_shader
Definition: starsystemrenderer.h:86
double GetDivider()
Definition: starsystemrenderer.h:60
void ResetPlanetProvinceColors(entt::entity entity)
Definition: starsystemrenderer.cpp:617
void OnTick()
Definition: starsystemrenderer.cpp:109
glm::vec3 TranslateToNormalized(const glm::vec3 &)
Definition: starsystemrenderer.cpp:680
void Initialize()
Definition: starsystemrenderer.cpp:84
float window_ratio
Definition: starsystemrenderer.h:156
bool have_province
Definition: starsystemrenderer.h:174
glm::mat4 GetBillboardMatrix(const glm::vec3 &pos)
Definition: starsystemrenderer.cpp:699
friend StarSystemController
Definition: starsystemrenderer.h:188
glm::vec3 GetBillboardPosition(const glm::vec3 &object_pos)
Definition: starsystemrenderer.cpp:708
void SetupDummyTextures()
Definition: starsystemrenderer.cpp:728
void ComputeOverlay()
Definition: starsystemrenderer.cpp:421
double max_zoom
Definition: starsystemrenderer.h:58
asset::Texture * dummy_index_texture
Definition: starsystemrenderer.h:176
engine::Application & app
Definition: starsystemrenderer.h:70
entt::entity GetSelectedCountry()
Definition: starsystemrenderer.h:64
int skybox_layer
Definition: starsystemrenderer.h:168
asset::ShaderProgram_t skybox_shader
Definition: starsystemrenderer.h:92
engine::Mesh_t mesh
Definition: starsystemrenderer.h:185
engine::Renderable planet_circle
Definition: starsystemrenderer.h:80
void DrawShips()
Definition: starsystemrenderer.cpp:209
double previous_mouseX
Definition: starsystemrenderer.h:53
asset::ShaderProgram_t circle_shader2
Definition: starsystemrenderer.h:89
void DrawModels()
Definition: starsystemrenderer.cpp:238
void DrawStars()
Definition: starsystemrenderer.cpp:172
bool CityIsVisible(glm::vec3 city_pos, glm::vec3 planet_pos, glm::vec3 cam_pos)
Definition: starsystemrenderer.cpp:552
void InitializeFramebuffers()
Definition: starsystemrenderer.cpp:634
asset::ShaderProgram_t circle_shader
Definition: starsystemrenderer.h:88
float GetWindowRatio()
Definition: starsystemrenderer.cpp:750
glm::vec3 sun_color
Definition: starsystemrenderer.h:161
float view_scale
Definition: starsystemrenderer.h:170
void SetBillboardProjection(cqsp::asset::ShaderProgram_t &shader, glm::mat4 mat)
Definition: starsystemrenderer.cpp:713
void DrawEntityName(glm::vec3 &object_pos, entt::entity ent_id)
Definition: starsystemrenderer.cpp:269
StarSystemOverlay overlay
Definition: starsystemrenderer.h:76
const float circle_size
Definition: starsystemrenderer.h:158
void DrawAllPlanetBillboards(auto &bodies)
Definition: starsystemrenderer.cpp:459
asset::ShaderProgram_t textured_planet_shader
Definition: starsystemrenderer.h:90
engine::Renderable sky
Definition: starsystemrenderer.h:79
void Update(float delta_time)
Definition: starsystemrenderer.cpp:165
double previous_mouseY
Definition: starsystemrenderer.h:54
asset::ShaderProgram_t buffer_shader
Definition: starsystemrenderer.h:93
engine::LayerRenderer renderer
Definition: starsystemrenderer.h:163
void DrawSkybox()
Definition: starsystemrenderer.cpp:224
void DrawIndividualCity(const entt::entity city_entity, const glm::vec3 &offset, const glm::vec3 &object_pos, const glm::quat &quat, double radius, const std::string &name)
Definition: starsystemrenderer.cpp:536
friend StarSystemViewUI
Definition: starsystemrenderer.h:187
void Render(float delta_time)
Definition: starsystemrenderer.cpp:116
StarSystemViewUI user_interface
Definition: starsystemrenderer.h:74
asset::ShaderProgram_t ConstructShader(const std::string &key)
Definition: starsystemrenderer.cpp:630
void RenderCities(glm::vec3 &object_pos, const entt::entity &body_entity)
Definition: starsystemrenderer.cpp:510
engine::Renderable textured_planet
Definition: starsystemrenderer.h:78
void DrawBodies()
Definition: starsystemrenderer.cpp:186
void MassUpdatePlanetProvinceColors(entt::entity entity)
Definition: starsystemrenderer.cpp:604
void DrawStar(const entt::entity &entity, glm::vec3 &object_pos)
Definition: starsystemrenderer.cpp:477
const int sphere_resolution
Definition: starsystemrenderer.h:172
int physical_layer
Definition: starsystemrenderer.h:167
glm::vec3 sun_position
Definition: starsystemrenderer.h:160
SysStarSystemRenderer(core::Universe &, engine::Application &)
Definition: starsystemrenderer.cpp:75
const double divider
Definition: starsystemrenderer.h:155
double min_zoom
Definition: starsystemrenderer.h:56
StarSystemController controller
Definition: starsystemrenderer.h:73
core::Universe & universe
Definition: starsystemrenderer.h:69
void LoadPlanetTextures()
Definition: starsystemrenderer.cpp:561
bool GLPositionNotInBounds(const glm::vec4 &gl_Position, const glm::vec3 &pos)
Check if the GL position is within the window
Definition: starsystemrenderer.cpp:694
asset::ShaderProgram_t vis_shader
Definition: starsystemrenderer.h:87
void DrawAllPlanets(auto &bodies)
Definition: starsystemrenderer.cpp:446
StarSystemCamera camera
Definition: starsystemrenderer.h:72
asset::TBOTexture * dummy_color_map
Definition: starsystemrenderer.h:177
void UpdatePlanetProvinceColors(entt::entity body, entt::entity province, glm::vec4 color)
Definition: starsystemrenderer.cpp:577
void DrawTerrainlessPlanet(const entt::entity &entity, glm::vec3 &object_pos)
Definition: starsystemrenderer.cpp:493
int planet_icon_layer
Definition: starsystemrenderer.h:166
void DrawCityIcon(const glm::vec3 &object_pos, float alpha_value)
Definition: starsystemrenderer.cpp:301
void DoUI(float delta_time)
Definition: starsystemrenderer.cpp:167
Definition: universe.h:59
Definition: application.h:61
Renders a series of framebuffers onto screen. This is a relatively simple way of allowing organizatio...
Definition: framebuffer.h:141
Definition: renderable.h:27
std::shared_ptr< ShaderProgram > ShaderProgram_t
The preferred way of using a shader program.
Definition: shader.h:113
Definition: editorwidgets.cpp:29
Definition: bodies.h:30
std::shared_ptr< Mesh > Mesh_t
Definition: mesh.h:43
Definition: starsystemcamera.h:28