2016-11-19 17:23:37 +01:00
# 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 ( ) {
2017-02-13 12:47:24 +01:00
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 ) ;
2016-11-19 17:23:37 +01:00
2017-02-12 01:11:37 +01:00
ADD_PROPERTY ( PropertyInfo ( Variant : : INT , " radiance_size " , PROPERTY_HINT_ENUM , " 256,512,1024,2048 " ) , " set_radiance_size " , " get_radiance_size " ) ;
2016-11-19 17:23:37 +01:00
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 ; i < IMAGE_PATH_MAX ; i + + ) {
if ( image_path [ i ] = = String ( ) ) {
all_ok = false ;
}
}
cube_map_valid = false ;
if ( all_ok ) {
Image images [ IMAGE_PATH_MAX ] ;
int w = 0 , h = 0 ;
Image : : Format format ;
for ( int i = 0 ; i < IMAGE_PATH_MAX ; i + + ) {
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 ( ) ;
}
}
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 ( ) {
2017-02-13 12:47:24 +01:00
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 ) ;
2016-11-19 17:23:37 +01:00
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 ( ) ;
}
2017-01-04 05:16:14 +01:00
ADD_GROUP ( " Image Path " , " image_path_ " ) ;
2017-02-12 01:11:37 +01:00
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 ) ;
2016-11-19 17:23:37 +01:00
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 ) ;
}