summaryrefslogtreecommitdiff
path: root/scene/resources/sky_box.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/resources/sky_box.cpp')
-rw-r--r--scene/resources/sky_box.cpp119
1 files changed, 27 insertions, 92 deletions
diff --git a/scene/resources/sky_box.cpp b/scene/resources/sky_box.cpp
index 2fd074de0f..59ade4a729 100644
--- a/scene/resources/sky_box.cpp
+++ b/scene/resources/sky_box.cpp
@@ -30,22 +30,22 @@
#include "sky_box.h"
#include "io/image_loader.h"
-void SkyBox::set_radiance_size(RadianceSize p_size) {
+void Sky::set_radiance_size(RadianceSize p_size) {
ERR_FAIL_INDEX(p_size, RADIANCE_SIZE_MAX);
radiance_size = p_size;
_radiance_changed();
}
-SkyBox::RadianceSize SkyBox::get_radiance_size() const {
+Sky::RadianceSize Sky::get_radiance_size() const {
return radiance_size;
}
-void SkyBox::_bind_methods() {
+void Sky::_bind_methods() {
- ClassDB::bind_method(D_METHOD("set_radiance_size", "size"), &SkyBox::set_radiance_size);
- ClassDB::bind_method(D_METHOD("get_radiance_size"), &SkyBox::get_radiance_size);
+ ClassDB::bind_method(D_METHOD("set_radiance_size", "size"), &Sky::set_radiance_size);
+ ClassDB::bind_method(D_METHOD("get_radiance_size"), &Sky::get_radiance_size);
ADD_PROPERTY(PropertyInfo(Variant::INT, "radiance_size", PROPERTY_HINT_ENUM, "256,512,1024,2048"), "set_radiance_size", "get_radiance_size");
@@ -56,124 +56,59 @@ void SkyBox::_bind_methods() {
BIND_CONSTANT(RADIANCE_SIZE_MAX);
}
-SkyBox::SkyBox() {
+Sky::Sky() {
radiance_size = RADIANCE_SIZE_512;
}
/////////////////////////////////////////
-void ImageSkyBox::_radiance_changed() {
+void PanoramaSky::_radiance_changed() {
- if (cube_map_valid) {
+ if (panorama.is_valid()) {
static const int size[RADIANCE_SIZE_MAX] = {
256, 512, 1024, 2048
};
- VS::get_singleton()->skybox_set_texture(sky_box, cube_map, size[get_radiance_size()]);
+ VS::get_singleton()->sky_set_texture(sky, panorama->get_rid(), size[get_radiance_size()]);
}
}
-void ImageSkyBox::set_image_path(ImagePath p_image, const String &p_path) {
+void PanoramaSky::set_panorama(const Ref<Texture> &p_panorama) {
- ERR_FAIL_INDEX(p_image, IMAGE_PATH_MAX);
- image_path[p_image] = p_path;
+ panorama = p_panorama;
- bool all_ok = true;
- for (int i = 0; i < IMAGE_PATH_MAX; i++) {
- if (image_path[i] == String()) {
- all_ok = false;
- }
- }
+ if (panorama.is_valid()) {
- cube_map_valid = false;
-
- if (all_ok) {
-
- Ref<Image> images[IMAGE_PATH_MAX];
- int w = 0, h = 0;
- Image::Format format;
-
- for (int i = 0; i < IMAGE_PATH_MAX; i++) {
- images[i].instance();
- Error err = ImageLoader::load_image(image_path[i], images[i]);
- if (err) {
- ERR_PRINTS("Error loading image for skybox: " + image_path[i]);
- return;
- }
-
- if (i == 0) {
- w = images[0]->get_width();
- h = images[0]->get_height();
- format = images[0]->get_format();
- } else {
- if (images[i]->get_width() != w || images[i]->get_height() != h || images[i]->get_format() != format) {
- ERR_PRINTS("Image size mismatch (" + itos(images[i]->get_width()) + "," + itos(images[i]->get_height()) + ":" + Image::get_format_name(images[i]->get_format()) + " when it should be " + itos(w) + "," + itos(h) + ":" + Image::get_format_name(format) + "): " + image_path[i]);
- return;
- }
- }
- }
-
- VS::get_singleton()->texture_allocate(cube_map, w, h, format, VS::TEXTURE_FLAG_FILTER | VS::TEXTURE_FLAG_CUBEMAP | VS::TEXTURE_FLAG_MIPMAPS);
- for (int i = 0; i < IMAGE_PATH_MAX; i++) {
- VS::get_singleton()->texture_set_data(cube_map, images[i], VS::CubeMapSide(i));
- }
-
- cube_map_valid = true;
_radiance_changed();
+
+ } else {
+ VS::get_singleton()->sky_set_texture(sky, RID(), 0);
}
}
-String ImageSkyBox::get_image_path(ImagePath p_image) const {
+Ref<Texture> PanoramaSky::get_panorama() const {
- ERR_FAIL_INDEX_V(p_image, IMAGE_PATH_MAX, String());
- return image_path[p_image];
+ return panorama;
}
-RID ImageSkyBox::get_rid() const {
+RID PanoramaSky::get_rid() const {
- return sky_box;
+ return sky;
}
-void ImageSkyBox::_bind_methods() {
+void PanoramaSky::_bind_methods() {
- ClassDB::bind_method(D_METHOD("set_image_path", "image", "path"), &ImageSkyBox::set_image_path);
- ClassDB::bind_method(D_METHOD("get_image_path", "image"), &ImageSkyBox::get_image_path);
-
- List<String> extensions;
- ImageLoader::get_recognized_extensions(&extensions);
- String hints;
- for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
- if (hints != String()) {
- hints += ",";
- }
- hints += "*." + E->get();
- }
+ ClassDB::bind_method(D_METHOD("set_panorama", "texture:Texture"), &PanoramaSky::set_panorama);
+ ClassDB::bind_method(D_METHOD("get_panorama:Texture"), &PanoramaSky::get_panorama);
- ADD_GROUP("Image Path", "image_path_");
- ADD_PROPERTYI(PropertyInfo(Variant::STRING, "image_path_negative_x", PROPERTY_HINT_FILE, hints), "set_image_path", "get_image_path", IMAGE_PATH_NEGATIVE_X);
- ADD_PROPERTYI(PropertyInfo(Variant::STRING, "image_path_positive_x", PROPERTY_HINT_FILE, hints), "set_image_path", "get_image_path", IMAGE_PATH_POSITIVE_X);
- ADD_PROPERTYI(PropertyInfo(Variant::STRING, "image_path_negative_y", PROPERTY_HINT_FILE, hints), "set_image_path", "get_image_path", IMAGE_PATH_NEGATIVE_Y);
- ADD_PROPERTYI(PropertyInfo(Variant::STRING, "image_path_positive_y", PROPERTY_HINT_FILE, hints), "set_image_path", "get_image_path", IMAGE_PATH_POSITIVE_Y);
- ADD_PROPERTYI(PropertyInfo(Variant::STRING, "image_path_negative_z", PROPERTY_HINT_FILE, hints), "set_image_path", "get_image_path", IMAGE_PATH_NEGATIVE_Z);
- ADD_PROPERTYI(PropertyInfo(Variant::STRING, "image_path_positive_z", PROPERTY_HINT_FILE, hints), "set_image_path", "get_image_path", IMAGE_PATH_POSITIVE_Z);
-
- BIND_CONSTANT(IMAGE_PATH_NEGATIVE_X);
- BIND_CONSTANT(IMAGE_PATH_POSITIVE_X);
- BIND_CONSTANT(IMAGE_PATH_NEGATIVE_Y);
- BIND_CONSTANT(IMAGE_PATH_POSITIVE_Y);
- BIND_CONSTANT(IMAGE_PATH_NEGATIVE_Z);
- BIND_CONSTANT(IMAGE_PATH_POSITIVE_Z);
- BIND_CONSTANT(IMAGE_PATH_MAX);
+ ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "panorama", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_panorama", "get_panorama");
}
-ImageSkyBox::ImageSkyBox() {
+PanoramaSky::PanoramaSky() {
- cube_map = VS::get_singleton()->texture_create();
- sky_box = VS::get_singleton()->skybox_create();
- cube_map_valid = false;
+ sky = VS::get_singleton()->sky_create();
}
-ImageSkyBox::~ImageSkyBox() {
+PanoramaSky::~PanoramaSky() {
- VS::get_singleton()->free(cube_map);
- VS::get_singleton()->free(sky_box);
+ VS::get_singleton()->free(sky);
}