#include "sky_box.h" #include "io/image_loader.h" void SkyBox::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 { return radiance_size; } void SkyBox::_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); ADD_PROPERTY(PropertyInfo(Variant::INT,"radiance_size",PROPERTY_HINT_ENUM,"256,512,1024,2048"),"set_radiance_size","get_radiance_size"); BIND_CONSTANT( RADIANCE_SIZE_256 ); BIND_CONSTANT( RADIANCE_SIZE_512 ); BIND_CONSTANT( RADIANCE_SIZE_1024 ); BIND_CONSTANT( RADIANCE_SIZE_2048 ); BIND_CONSTANT( RADIANCE_SIZE_MAX ); } SkyBox::SkyBox() { radiance_size=RADIANCE_SIZE_512; } ///////////////////////////////////////// void ImageSkyBox::_radiance_changed() { if (cube_map_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()]); } } void ImageSkyBox::set_image_path(ImagePath p_image,const String &p_path) { ERR_FAIL_INDEX(p_image,IMAGE_PATH_MAX); image_path[p_image]=p_path; bool all_ok=true; for(int i=0;itexture_allocate(cube_map,w,h,format,VS::TEXTURE_FLAG_FILTER|VS::TEXTURE_FLAG_CUBEMAP|VS::TEXTURE_FLAG_MIPMAPS); for(int i=0;itexture_set_data(cube_map,images[i],VS::CubeMapSide(i)); } cube_map_valid=true; _radiance_changed(); } } String ImageSkyBox::get_image_path(ImagePath p_image) const { ERR_FAIL_INDEX_V(p_image,IMAGE_PATH_MAX,String()); return image_path[p_image]; } RID ImageSkyBox::get_rid() const { return sky_box; } void ImageSkyBox::_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 extensions; ImageLoader::get_recognized_extensions(&extensions); String hints; for(List::Element *E=extensions.front();E;E=E->next()) { if (hints!=String()) { hints+=","; } hints+="*."+E->get(); } 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 ); } ImageSkyBox::ImageSkyBox() { cube_map=VS::get_singleton()->texture_create(); sky_box=VS::get_singleton()->skybox_create(); cube_map_valid=false; } ImageSkyBox::~ImageSkyBox() { VS::get_singleton()->free(cube_map); VS::get_singleton()->free(sky_box); }