mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-11 22:11:51 +00:00
move sky sprites to environment
This commit is contained in:
parent
28b7713648
commit
4aaa5b2d7e
4 changed files with 70 additions and 44 deletions
|
|
@ -23,7 +23,6 @@
|
||||||
using namespace advanced_pipeline;
|
using namespace advanced_pipeline;
|
||||||
|
|
||||||
const int STARS_COUNT = 3000;
|
const int STARS_COUNT = 3000;
|
||||||
|
|
||||||
const int STARS_SEED = 632;
|
const int STARS_SEED = 632;
|
||||||
|
|
||||||
Skybox::Skybox(uint size, const Assets& assets)
|
Skybox::Skybox(uint size, const Assets& assets)
|
||||||
|
|
@ -41,31 +40,6 @@ Skybox::Skybox(uint size, const Assets& assets)
|
||||||
{{1.0f, -1.0f}}};
|
{{1.0f, -1.0f}}};
|
||||||
|
|
||||||
mesh = std::make_unique<Mesh<SkyboxVertex>>(vertices, 6);
|
mesh = std::make_unique<Mesh<SkyboxVertex>>(vertices, 6);
|
||||||
|
|
||||||
sprites.push_back(SkySprite {
|
|
||||||
"misc/moon",
|
|
||||||
glm::pi<float>() * 0.5f,
|
|
||||||
4.0f,
|
|
||||||
false,
|
|
||||||
glm::pi<float>() * 0.25f,
|
|
||||||
});
|
|
||||||
|
|
||||||
sprites.push_back(SkySprite {
|
|
||||||
"misc/moon_flare",
|
|
||||||
glm::pi<float>() * 0.5f,
|
|
||||||
0.5f,
|
|
||||||
false,
|
|
||||||
glm::pi<float>() * 0.25f,
|
|
||||||
});
|
|
||||||
|
|
||||||
sprites.push_back(SkySprite {
|
|
||||||
"misc/sun",
|
|
||||||
glm::pi<float>() * 1.5f,
|
|
||||||
4.0f,
|
|
||||||
true,
|
|
||||||
glm::pi<float>() * 0.25f,
|
|
||||||
});
|
|
||||||
|
|
||||||
setMode(mode);
|
setMode(mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -117,7 +91,8 @@ void Skybox::drawStars(float angle, float opacity) {
|
||||||
void Skybox::drawSkySprites(
|
void Skybox::drawSkySprites(
|
||||||
float daytime,
|
float daytime,
|
||||||
float angle,
|
float angle,
|
||||||
float opacity
|
float opacity,
|
||||||
|
const std::vector<SkySprite>& sprites
|
||||||
) {
|
) {
|
||||||
float depthScale = 2e3;
|
float depthScale = 2e3;
|
||||||
for (auto& sprite : sprites) {
|
for (auto& sprite : sprites) {
|
||||||
|
|
@ -160,7 +135,7 @@ void Skybox::draw(
|
||||||
DrawContext ctx = pctx.sub();
|
DrawContext ctx = pctx.sub();
|
||||||
ctx.setBlendMode(BlendMode::addition);
|
ctx.setBlendMode(BlendMode::addition);
|
||||||
|
|
||||||
if (!environment.sky.sprites && !environment.sky.stars) {
|
if (environment.sky.sprites.empty() && !environment.sky.stars) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -170,8 +145,8 @@ void Skybox::draw(
|
||||||
shader->uniformMatrix("u_apply", glm::mat4(1.0f));
|
shader->uniformMatrix("u_apply", glm::mat4(1.0f));
|
||||||
batch3d->begin();
|
batch3d->begin();
|
||||||
|
|
||||||
if (environment.sky.sprites) {
|
if (!environment.sky.sprites.empty()) {
|
||||||
drawSkySprites(daytime, angle, opacity);
|
drawSkySprites(daytime, angle, opacity, environment.sky.sprites);
|
||||||
}
|
}
|
||||||
if (environment.sky.stars) {
|
if (environment.sky.stars) {
|
||||||
drawStars(angle, opacity);
|
drawStars(angle, opacity);
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@
|
||||||
#include "typedefs.hpp"
|
#include "typedefs.hpp"
|
||||||
#include "world/Environment.hpp"
|
#include "world/Environment.hpp"
|
||||||
|
|
||||||
|
|
||||||
template <typename VertexStructure>
|
template <typename VertexStructure>
|
||||||
class Mesh;
|
class Mesh;
|
||||||
class Shader;
|
class Shader;
|
||||||
|
|
@ -28,14 +27,6 @@ struct SkyboxVertex {
|
||||||
{VertexAttribute::Type::FLOAT, false, 2}, {{}, 0}};
|
{VertexAttribute::Type::FLOAT, false, 2}, {{}, 0}};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SkySprite {
|
|
||||||
std::string texture;
|
|
||||||
float phase;
|
|
||||||
float distance;
|
|
||||||
bool emissive;
|
|
||||||
float altitude;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Skybox {
|
class Skybox {
|
||||||
SkyMode mode = SkyMode::SOLID;
|
SkyMode mode = SkyMode::SOLID;
|
||||||
uint size;
|
uint size;
|
||||||
|
|
@ -47,7 +38,6 @@ class Skybox {
|
||||||
|
|
||||||
std::unique_ptr<Mesh<SkyboxVertex>> mesh;
|
std::unique_ptr<Mesh<SkyboxVertex>> mesh;
|
||||||
std::unique_ptr<Batch3D> batch3d;
|
std::unique_ptr<Batch3D> batch3d;
|
||||||
std::vector<SkySprite> sprites;
|
|
||||||
int frameid = 0;
|
int frameid = 0;
|
||||||
|
|
||||||
float prevMie = -1.0f;
|
float prevMie = -1.0f;
|
||||||
|
|
@ -58,7 +48,12 @@ class Skybox {
|
||||||
|
|
||||||
void drawStars(float angle, float opacity);
|
void drawStars(float angle, float opacity);
|
||||||
void drawBackground(const Camera& camera, int width, int height);
|
void drawBackground(const Camera& camera, int width, int height);
|
||||||
void drawSkySprites(float daytime, float angle, float opacity);
|
void drawSkySprites(
|
||||||
|
float daytime,
|
||||||
|
float angle,
|
||||||
|
float opacity,
|
||||||
|
const std::vector<SkySprite>& sprites
|
||||||
|
);
|
||||||
void refreshFace(uint face, Cubemap& cubemap);
|
void refreshFace(uint face, Cubemap& cubemap);
|
||||||
public:
|
public:
|
||||||
Skybox(uint size, const Assets& assets);
|
Skybox(uint size, const Assets& assets);
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,22 @@
|
||||||
#include "data/dv_util.hpp"
|
#include "data/dv_util.hpp"
|
||||||
|
|
||||||
dv::value Environment::serialize() const {
|
dv::value Environment::serialize() const {
|
||||||
|
auto skySpritesList = dv::list();
|
||||||
|
for (const auto& sprite : sky.sprites) {
|
||||||
|
skySpritesList.add(dv::object({
|
||||||
|
{"texture", sprite.texture},
|
||||||
|
{"phase", sprite.phase},
|
||||||
|
{"distance", sprite.distance},
|
||||||
|
{"emissive", sprite.emissive},
|
||||||
|
{"altitude", sprite.altitude},
|
||||||
|
}));
|
||||||
|
}
|
||||||
return dv::object({
|
return dv::object({
|
||||||
{"sky", dv::object({
|
{"sky", dv::object({
|
||||||
{"mode", SkyModeMeta.getNameString(sky.mode)},
|
{"mode", SkyModeMeta.getNameString(sky.mode)},
|
||||||
{"stars", sky.stars},
|
{"stars", sky.stars},
|
||||||
{"clouds", sky.clouds},
|
{"clouds", sky.clouds},
|
||||||
{"sprites", sky.sprites},
|
{"sprites", std::move(skySpritesList)},
|
||||||
})},
|
})},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -20,6 +30,18 @@ void Environment::deserialize(const dv::value& src) {
|
||||||
skyItem->at("mode").get(sky.mode, SkyModeMeta);
|
skyItem->at("mode").get(sky.mode, SkyModeMeta);
|
||||||
skyItem->at("stars").get(sky.stars);
|
skyItem->at("stars").get(sky.stars);
|
||||||
skyItem->at("clouds").get(sky.clouds);
|
skyItem->at("clouds").get(sky.clouds);
|
||||||
skyItem->at("sprites").get(sky.sprites);
|
|
||||||
|
if (auto skySpritesList = skyItem->at("sprites")) {
|
||||||
|
for (int i = 0; i < skySpritesList->size(); i++) {
|
||||||
|
SkySprite sprite;
|
||||||
|
const auto& item = (*skySpritesList.ptr)[i];
|
||||||
|
item.at("texture").get(sprite.texture);
|
||||||
|
item.at("phase").get(sprite.phase);
|
||||||
|
item.at("distance").get(sprite.distance);
|
||||||
|
item.at("emissive").get(sprite.emissive);
|
||||||
|
item.at("altitude").get(sprite.altitude);
|
||||||
|
sky.sprites.push_back(std::move(sprite));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,9 @@
|
||||||
#include "interfaces/Serializable.hpp"
|
#include "interfaces/Serializable.hpp"
|
||||||
#include "util/EnumMetadata.hpp"
|
#include "util/EnumMetadata.hpp"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <glm/gtc/constants.hpp>
|
||||||
|
|
||||||
enum class SkyMode {
|
enum class SkyMode {
|
||||||
NONE, SOLID, BOX
|
NONE, SOLID, BOX
|
||||||
};
|
};
|
||||||
|
|
@ -13,13 +16,44 @@ VC_ENUM_METADATA(SkyMode)
|
||||||
{"box", SkyMode::BOX},
|
{"box", SkyMode::BOX},
|
||||||
VC_ENUM_END
|
VC_ENUM_END
|
||||||
|
|
||||||
|
struct SkySprite {
|
||||||
|
std::string texture;
|
||||||
|
float phase;
|
||||||
|
float distance;
|
||||||
|
bool emissive;
|
||||||
|
float altitude;
|
||||||
|
};
|
||||||
|
|
||||||
class Environment : public Serializable {
|
class Environment : public Serializable {
|
||||||
public:
|
public:
|
||||||
struct {
|
struct {
|
||||||
SkyMode mode = SkyMode::BOX;
|
SkyMode mode = SkyMode::BOX;
|
||||||
bool stars = true;
|
bool stars = true;
|
||||||
bool clouds = true;
|
bool clouds = true;
|
||||||
bool sprites = true;
|
// TODO: move defaults to config file
|
||||||
|
std::vector<SkySprite> sprites {
|
||||||
|
SkySprite {
|
||||||
|
"misc/moon",
|
||||||
|
glm::pi<float>() * 0.5f,
|
||||||
|
4.0f,
|
||||||
|
false,
|
||||||
|
glm::pi<float>() * 0.25f,
|
||||||
|
},
|
||||||
|
SkySprite {
|
||||||
|
"misc/moon_flare",
|
||||||
|
glm::pi<float>() * 0.5f,
|
||||||
|
0.5f,
|
||||||
|
false,
|
||||||
|
glm::pi<float>() * 0.25f,
|
||||||
|
},
|
||||||
|
SkySprite {
|
||||||
|
"misc/sun",
|
||||||
|
glm::pi<float>() * 1.5f,
|
||||||
|
4.0f,
|
||||||
|
true,
|
||||||
|
glm::pi<float>() * 0.25f,
|
||||||
|
},
|
||||||
|
};
|
||||||
} sky;
|
} sky;
|
||||||
|
|
||||||
Environment() = default;
|
Environment() = default;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue