2014-02-10 01:10:30 +00:00
/*************************************************************************/
/* resource.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 12:16:55 +00:00
/* https://godotengine.org */
2014-02-10 01:10:30 +00:00
/*************************************************************************/
2021-01-01 19:13:46 +00:00
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
2014-02-10 01:10:30 +00:00
/* */
/* 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. */
/*************************************************************************/
2018-01-04 23:50:27 +00:00
2014-02-10 01:10:30 +00:00
# ifndef RESOURCE_H
# define RESOURCE_H
2020-11-07 22:33:38 +00:00
# include "core/object/class_db.h"
# include "core/object/reference.h"
# include "core/templates/safe_refcount.h"
# include "core/templates/self_list.h"
2014-02-10 01:10:30 +00:00
2017-03-05 15:44:50 +00:00
# define RES_BASE_EXTENSION(m_ext) \
public : \
static void register_custom_data_to_otdb ( ) { ClassDB : : add_resource_base_extension ( m_ext , get_class_static ( ) ) ; } \
2020-07-10 10:34:39 +00:00
virtual String get_base_extension ( ) const override { return m_ext ; } \
2017-03-05 15:44:50 +00:00
\
2014-02-10 01:10:30 +00:00
private :
class Resource : public Reference {
2017-03-05 15:44:50 +00:00
GDCLASS ( Resource , Reference ) ;
2014-02-10 01:10:30 +00:00
OBJ_CATEGORY ( " Resources " ) ;
2020-07-10 10:34:39 +00:00
public :
static void register_custom_data_to_otdb ( ) { ClassDB : : add_resource_base_extension ( " res " , get_class_static ( ) ) ; }
virtual String get_base_extension ( ) const { return " res " ; }
private :
2014-02-10 01:10:30 +00:00
Set < ObjectID > owners ;
2017-03-05 15:44:50 +00:00
friend class ResBase ;
friend class ResourceCache ;
2016-03-08 23:00:52 +00:00
2014-02-10 01:10:30 +00:00
String name ;
String path_cache ;
2020-05-12 15:01:17 +00:00
int subindex = 0 ;
2014-02-10 01:10:30 +00:00
virtual bool _use_builtin_script ( ) const { return true ; }
# ifdef TOOLS_ENABLED
2020-05-12 15:01:17 +00:00
uint64_t last_modified_time = 0 ;
uint64_t import_last_modified_time = 0 ;
2017-02-01 12:45:45 +00:00
String import_path ;
2014-02-10 01:10:30 +00:00
# endif
2020-05-12 15:01:17 +00:00
bool local_to_scene = false ;
2017-03-05 15:44:50 +00:00
friend class SceneState ;
2020-05-12 15:01:17 +00:00
Node * local_scene = nullptr ;
2017-01-10 04:04:31 +00:00
2017-06-28 20:00:18 +00:00
SelfList < Resource > remapped_list ;
2014-02-10 01:10:30 +00:00
protected :
void emit_changed ( ) ;
void notify_change_to_owners ( ) ;
virtual void _resource_path_changed ( ) ;
static void _bind_methods ( ) ;
2014-06-30 04:28:05 +00:00
2017-03-05 15:44:50 +00:00
void _set_path ( const String & p_path ) ;
void _take_over_path ( const String & p_path ) ;
2019-07-16 16:46:40 +00:00
2017-03-05 15:44:50 +00:00
public :
static Node * ( * _get_local_scene_func ) ( ) ; //used by editor
2017-01-10 04:04:31 +00:00
2016-06-27 16:17:20 +00:00
virtual bool editor_can_reload_from_file ( ) ;
2021-02-11 17:18:45 +00:00
virtual void reset_state ( ) ; //for resources that use variable amount of properties, either via _validate_property or _get_property_list, this function needs to be implemented to correctly clear state
virtual Error copy_from ( const Ref < Resource > & p_resource ) ;
2014-02-10 01:10:30 +00:00
virtual void reload_from_file ( ) ;
void register_owner ( Object * p_owner ) ;
void unregister_owner ( Object * p_owner ) ;
2017-03-05 15:44:50 +00:00
void set_name ( const String & p_name ) ;
2014-02-10 01:10:30 +00:00
String get_name ( ) const ;
2017-03-05 15:44:50 +00:00
virtual void set_path ( const String & p_path , bool p_take_over = false ) ;
2014-02-10 01:10:30 +00:00
String get_path ( ) const ;
2015-06-22 03:03:19 +00:00
void set_subindex ( int p_sub_index ) ;
int get_subindex ( ) const ;
2017-05-17 10:36:47 +00:00
virtual Ref < Resource > duplicate ( bool p_subresources = false ) const ;
2020-03-17 06:33:00 +00:00
Ref < Resource > duplicate_for_local_scene ( Node * p_for_scene , Map < Ref < Resource > , Ref < Resource > > & remap_cache ) ;
void configure_for_local_scene ( Node * p_for_scene , Map < Ref < Resource > , Ref < Resource > > & remap_cache ) ;
2017-01-10 04:04:31 +00:00
void set_local_to_scene ( bool p_enable ) ;
bool is_local_to_scene ( ) const ;
virtual void setup_local_to_scene ( ) ;
2014-02-10 01:10:30 +00:00
2017-03-05 15:44:50 +00:00
Node * get_local_scene ( ) const ;
2016-05-27 17:18:40 +00:00
2014-02-10 01:10:30 +00:00
# ifdef TOOLS_ENABLED
2016-05-27 17:18:40 +00:00
uint32_t hash_edited_version ( ) const ;
2017-03-05 15:44:50 +00:00
virtual void set_last_modified_time ( uint64_t p_time ) { last_modified_time = p_time ; }
2014-02-10 01:10:30 +00:00
uint64_t get_last_modified_time ( ) const { return last_modified_time ; }
2017-03-05 15:44:50 +00:00
virtual void set_import_last_modified_time ( uint64_t p_time ) { import_last_modified_time = p_time ; }
2017-02-01 12:45:45 +00:00
uint64_t get_import_last_modified_time ( ) const { return import_last_modified_time ; }
2017-03-05 15:44:50 +00:00
void set_import_path ( const String & p_path ) { import_path = p_path ; }
2017-02-01 12:45:45 +00:00
String get_import_path ( ) const { return import_path ; }
2014-02-10 01:10:30 +00:00
# endif
2017-06-28 20:00:18 +00:00
void set_as_translation_remapped ( bool p_remapped ) ;
bool is_translation_remapped ( ) const ;
2014-02-10 01:10:30 +00:00
virtual RID get_rid ( ) const ; // some resources may offer conversion to RID
2019-04-11 17:35:23 +00:00
# ifdef TOOLS_ENABLED
//helps keep IDs same number when loading/saving scenes. -1 clears ID and it Returns -1 when no id stored
void set_id_for_path ( const String & p_path , int p_id ) ;
int get_id_for_path ( const String & p_path ) const ;
# endif
2016-03-08 23:00:52 +00:00
Resource ( ) ;
2014-02-10 01:10:30 +00:00
~ Resource ( ) ;
} ;
typedef Ref < Resource > RES ;
class ResourceCache {
2017-03-05 15:44:50 +00:00
friend class Resource ;
2017-06-28 20:00:18 +00:00
friend class ResourceLoader ; //need the lock
2021-01-18 13:01:38 +00:00
static RWLock lock ;
2017-03-05 15:44:50 +00:00
static HashMap < String , Resource * > resources ;
2019-07-16 16:46:40 +00:00
# ifdef TOOLS_ENABLED
2020-03-17 06:33:00 +00:00
static HashMap < String , HashMap < String , int > > resource_path_cache ; // each tscn has a set of resource paths and IDs
2021-01-18 13:01:38 +00:00
static RWLock path_cache_lock ;
2019-07-16 16:46:40 +00:00
# endif // TOOLS_ENABLED
2017-03-05 15:44:50 +00:00
friend void unregister_core_types ( ) ;
2014-02-10 01:10:30 +00:00
static void clear ( ) ;
2017-03-05 15:44:50 +00:00
friend void register_core_types ( ) ;
2014-02-10 01:10:30 +00:00
2017-03-05 15:44:50 +00:00
public :
2014-02-10 01:10:30 +00:00
static void reload_externals ( ) ;
2017-03-05 15:44:50 +00:00
static bool has ( const String & p_path ) ;
static Resource * get ( const String & p_path ) ;
2020-04-01 23:20:12 +00:00
static void dump ( const char * p_file = nullptr , bool p_short = false ) ;
2020-03-17 06:33:00 +00:00
static void get_cached_resources ( List < Ref < Resource > > * p_resources ) ;
2014-02-10 01:10:30 +00:00
static int get_cached_resource_count ( ) ;
} ;
2020-03-25 10:10:34 +00:00
# endif // RESOURCE_H