2020-05-10 12:53:46 +02:00
/**************************************************************************/
/* resource_importer_shader_file.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
2020-04-20 04:19:21 +02:00
# include "resource_importer_shader_file.h"
2021-06-11 14:51:48 +02:00
# include "core/io/file_access.h"
2020-04-20 04:19:21 +02:00
# include "core/io/marshalls.h"
# include "core/io/resource_saver.h"
# include "editor/editor_node.h"
# include "editor/plugins/shader_file_editor_plugin.h"
# include "servers/rendering/rendering_device_binds.h"
String ResourceImporterShaderFile : : get_importer_name ( ) const {
return " glsl " ;
}
String ResourceImporterShaderFile : : get_visible_name ( ) const {
return " GLSL Shader File " ;
}
2020-05-14 14:29:06 +02:00
2020-04-20 04:19:21 +02:00
void ResourceImporterShaderFile : : get_recognized_extensions ( List < String > * p_extensions ) const {
p_extensions - > push_back ( " glsl " ) ;
}
2020-05-14 14:29:06 +02:00
2020-04-20 04:19:21 +02:00
String ResourceImporterShaderFile : : get_save_extension ( ) const {
return " res " ;
}
String ResourceImporterShaderFile : : get_resource_type ( ) const {
return " RDShaderFile " ;
}
int ResourceImporterShaderFile : : get_preset_count ( ) const {
return 0 ;
}
2020-05-14 14:29:06 +02:00
2020-04-20 04:19:21 +02:00
String ResourceImporterShaderFile : : get_preset_name ( int p_idx ) const {
return String ( ) ;
}
2021-11-14 18:02:38 +01:00
void ResourceImporterShaderFile : : get_import_options ( const String & p_path , List < ImportOption > * r_options , int p_preset ) const {
2020-04-20 04:19:21 +02:00
}
2022-05-13 15:04:37 +02:00
bool ResourceImporterShaderFile : : get_option_visibility ( const String & p_path , const String & p_option , const HashMap < StringName , Variant > & p_options ) const {
2020-04-20 04:19:21 +02:00
return true ;
}
2020-05-14 14:29:06 +02:00
2020-04-20 04:19:21 +02:00
static String _include_function ( const String & p_path , void * userpointer ) {
Error err ;
String * base_path = ( String * ) userpointer ;
String include = p_path ;
2021-08-30 01:43:47 +02:00
if ( include . is_relative_path ( ) ) {
2022-08-30 02:34:01 +02:00
include = base_path - > path_join ( include ) ;
2020-04-20 04:19:21 +02:00
}
2022-03-23 10:08:58 +01:00
Ref < FileAccess > file_inc = FileAccess : : open ( include , FileAccess : : READ , & err ) ;
2020-04-20 04:19:21 +02:00
if ( err ! = OK ) {
return String ( ) ;
}
return file_inc - > get_as_utf8_string ( ) ;
}
2022-05-13 15:04:37 +02:00
Error ResourceImporterShaderFile : : import ( const String & p_source_file , const String & p_save_path , const HashMap < StringName , Variant > & p_options , List < String > * r_platform_variants , List < String > * r_gen_files , Variant * r_metadata ) {
2020-04-20 04:19:21 +02:00
/* STEP 1, Read shader code */
2023-01-13 21:53:19 +01:00
ERR_FAIL_COND_V_EDMSG ( ( OS : : get_singleton ( ) - > get_current_rendering_method ( ) = = " gl_compatibility " ) , ERR_UNAVAILABLE , " Cannot import custom .glsl shaders when using the gl_compatibility rendering_method. Please switch to the forward_plus or mobile rendering methods to use custom shaders. " ) ;
2024-05-30 13:51:35 +02:00
ERR_FAIL_COND_V_EDMSG ( ( DisplayServer : : get_singleton ( ) - > get_name ( ) = = " headless " ) , ERR_UNAVAILABLE , " Cannot import custom .glsl shaders when running in headless mode. " ) ;
2020-04-20 04:19:21 +02:00
Error err ;
2022-03-23 10:08:58 +01:00
Ref < FileAccess > file = FileAccess : : open ( p_source_file , FileAccess : : READ , & err ) ;
2020-04-20 04:19:21 +02:00
ERR_FAIL_COND_V ( err ! = OK , ERR_CANT_OPEN ) ;
2023-09-28 11:40:18 +02:00
ERR_FAIL_COND_V ( ! file . is_valid ( ) , ERR_CANT_OPEN ) ;
2020-04-20 04:19:21 +02:00
String file_txt = file - > get_as_utf8_string ( ) ;
Ref < RDShaderFile > shader_file ;
2021-06-18 00:03:09 +02:00
shader_file . instantiate ( ) ;
2020-04-20 04:19:21 +02:00
String base_path = p_source_file . get_base_dir ( ) ;
2020-05-01 14:34:23 +02:00
err = shader_file - > parse_versions_from_text ( file_txt , " " , _include_function , & base_path ) ;
2020-04-20 04:19:21 +02:00
if ( err ! = OK ) {
if ( ! ShaderFileEditor : : singleton - > is_visible_in_tree ( ) ) {
2024-05-27 13:29:57 +02:00
callable_mp_static ( & EditorNode : : add_io_error ) . call_deferred ( vformat ( TTR ( " Error importing GLSL shader file: '%s'. Open the file in the filesystem dock in order to see the reason. " ) , p_source_file ) ) ;
2020-04-20 04:19:21 +02:00
}
}
2022-06-03 01:33:42 +02:00
ResourceSaver : : save ( shader_file , p_save_path + " .res " ) ;
2020-04-20 04:19:21 +02:00
return OK ;
}
ResourceImporterShaderFile : : ResourceImporterShaderFile ( ) {
}