summaryrefslogtreecommitdiff
path: root/scene/resources
diff options
context:
space:
mode:
authorPedro J. Estébanez <pedrojrulez@gmail.com>2016-06-26 11:57:10 +0200
committerPedro J. Estébanez <pedrojrulez@gmail.com>2016-06-28 18:27:12 +0200
commita5e27503fd52589703d637d1245a023233a14a27 (patch)
tree7a451266b2e25021b65d04d82b24b429599a3048 /scene/resources
parent83740ab793079ff5094de372d499560589f68b81 (diff)
Homogeinize resource formats loaders/savers
Diffstat (limited to 'scene/resources')
-rw-r--r--scene/resources/scene_format_text.cpp1474
-rw-r--r--scene/resources/scene_format_text.h170
2 files changed, 0 insertions, 1644 deletions
diff --git a/scene/resources/scene_format_text.cpp b/scene/resources/scene_format_text.cpp
deleted file mode 100644
index 95645107d4..0000000000
--- a/scene/resources/scene_format_text.cpp
+++ /dev/null
@@ -1,1474 +0,0 @@
-/*************************************************************************/
-/* scene_format_text.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2016 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. */
-/*************************************************************************/
-#include "scene_format_text.h"
-
-#include "globals.h"
-#include "version.h"
-#include "os/dir_access.h"
-
-#define FORMAT_VERSION 1
-
-#include "version.h"
-#include "os/dir_access.h"
-
-#define _printerr() ERR_PRINT(String(res_path+":"+itos(lines)+" - Parse Error: "+error_text).utf8().get_data());
-
-
-
-
-///
-
-void ResourceInteractiveLoaderText::set_local_path(const String& p_local_path) {
-
- res_path=p_local_path;
-}
-
-Ref<Resource> ResourceInteractiveLoaderText::get_resource() {
-
- return resource;
-}
-
-Error ResourceInteractiveLoaderText::_parse_sub_resource(VariantParser::Stream* p_stream,Ref<Resource>& r_res,int &line,String &r_err_str) {
-
- VariantParser::Token token;
- VariantParser::get_token(p_stream,token,line,r_err_str);
- if (token.type!=VariantParser::TK_NUMBER) {
- r_err_str="Expected number (sub-resource index)";
- return ERR_PARSE_ERROR;
- }
-
- int index = token.value;
-
- String path = local_path+"::"+itos(index);
-
- if (!ignore_resource_parsing) {
-
- if (!ResourceCache::has(path)) {
- r_err_str="Can't load cached sub-resource: "+path;
- return ERR_PARSE_ERROR;
- }
-
- r_res=RES(ResourceCache::get(path));
- } else {
- r_res=RES();
- }
-
- VariantParser::get_token(p_stream,token,line,r_err_str);
- if (token.type!=VariantParser::TK_PARENTHESIS_CLOSE) {
- r_err_str="Expected ')'";
- return ERR_PARSE_ERROR;
- }
-
-
- return OK;
-}
-
-Error ResourceInteractiveLoaderText::_parse_ext_resource(VariantParser::Stream* p_stream,Ref<Resource>& r_res,int &line,String &r_err_str){
-
- VariantParser::Token token;
- VariantParser::get_token(p_stream,token,line,r_err_str);
- if (token.type!=VariantParser::TK_NUMBER) {
- r_err_str="Expected number (sub-resource index)";
- return ERR_PARSE_ERROR;
- }
-
- int id = token.value;
-
- if (!ignore_resource_parsing) {
-
- if (!ext_resources.has(id)) {
- r_err_str="Can't load cached ext-resource #"+itos(id);
- return ERR_PARSE_ERROR;
- }
-
- String path = ext_resources[id].path;
- String type = ext_resources[id].type;
-
- if (path.find("://")==-1 && path.is_rel_path()) {
- // path is relative to file being loaded, so convert to a resource path
- path=Globals::get_singleton()->localize_path(res_path.get_base_dir().plus_file(path));
-
- }
-
- r_res=ResourceLoader::load(path,type);
-
- if (r_res.is_null()) {
- WARN_PRINT(String("Couldn't load external resource: "+path).utf8().get_data());
- }
- } else {
- r_res=RES();
- }
-
- VariantParser::get_token(p_stream,token,line,r_err_str);
- if (token.type!=VariantParser::TK_PARENTHESIS_CLOSE) {
- r_err_str="Expected ')'";
- return ERR_PARSE_ERROR;
- }
-
-
- return OK;
-}
-
-
-Error ResourceInteractiveLoaderText::poll() {
-
- if (error!=OK)
- return error;
-
- if (next_tag.name=="ext_resource") {
-
-
- if (!next_tag.fields.has("path")) {
- error=ERR_FILE_CORRUPT;
- error_text="Missing 'path' in external resource tag";
- _printerr();
- return error;
- }
-
- if (!next_tag.fields.has("type")) {
- error=ERR_FILE_CORRUPT;
- error_text="Missing 'type' in external resource tag";
- _printerr();
- return error;
- }
-
- if (!next_tag.fields.has("id")) {
- error=ERR_FILE_CORRUPT;
- error_text="Missing 'id' in external resource tag";
- _printerr();
- return error;
- }
-
- String path=next_tag.fields["path"];
- String type=next_tag.fields["type"];
- int index=next_tag.fields["id"];
-
-
- if (path.find("://")==-1 && path.is_rel_path()) {
- // path is relative to file being loaded, so convert to a resource path
- path=Globals::get_singleton()->localize_path(local_path.get_base_dir().plus_file(path));
- }
-
- if (remaps.has(path)) {
- path=remaps[path];
- }
-
- RES res = ResourceLoader::load(path,type);
-
- if (res.is_null()) {
-
- if (ResourceLoader::get_abort_on_missing_resources()) {
- error=ERR_FILE_CORRUPT;
- error_text="[ext_resource] referenced nonexistent resource at: "+path;
- _printerr();
- return error;
- } else {
- ResourceLoader::notify_dependency_error(local_path,path,type);
- }
- } else {
-
- resource_cache.push_back(res);
- }
-
- ExtResource er;
- er.path=path;
- er.type=type;
- ext_resources[index]=er;
-
- error = VariantParser::parse_tag(&stream,lines,error_text,next_tag,&rp);
-
- if (error) {
- _printerr();
- }
-
- resource_current++;
- return error;
-
-
- } else if (next_tag.name=="sub_resource") {
-
-
- if (!next_tag.fields.has("type")) {
- error=ERR_FILE_CORRUPT;
- error_text="Missing 'type' in external resource tag";
- _printerr();
- return error;
- }
-
- if (!next_tag.fields.has("id")) {
- error=ERR_FILE_CORRUPT;
- error_text="Missing 'index' in external resource tag";
- _printerr();
- return error;
- }
-
- String type=next_tag.fields["type"];
- int id=next_tag.fields["id"];
-
- String path = local_path+"::"+itos(id);
-
-
- //bool exists=ResourceCache::has(path);
-
- Ref<Resource> res;
-
- if ( !ResourceCache::has(path)) { //only if it doesn't exist
-
- Object *obj = ObjectTypeDB::instance(type);
- if (!obj) {
-
- error_text+="Can't create sub resource of type: "+type;
- _printerr();
- error=ERR_FILE_CORRUPT;
- return error;
- }
-
-
- Resource *r = obj->cast_to<Resource>();
- if (!r) {
-
- error_text+="Can't create sub resource of type, because not a resource: "+type;
- _printerr();
- error=ERR_FILE_CORRUPT;
- return error;
- }
-
- res=Ref<Resource>(r);
- resource_cache.push_back(res);
- res->set_path(path);
-
- }
-
- resource_current++;
-
- while(true) {
-
- String assign;
- Variant value;
-
- error = VariantParser::parse_tag_assign_eof(&stream,lines,error_text,next_tag,assign,value,&rp);
-
- if (error) {
- _printerr();
- return error;
- }
-
- if (assign!=String()) {
- if (res.is_valid()) {
- res->set(assign,value);
- }
- //it's assignment
- } else if (next_tag.name!=String()) {
-
- error=OK;
- break;
- } else {
- error=ERR_FILE_CORRUPT;
- error_text="Premature end of file while parsing [sub_resource]";
- _printerr();
- return error;
- }
-
-
- }
-
- return OK;
-
- } else if (next_tag.name=="resource") {
-
- if (is_scene) {
-
- error_text+="found the 'resource' tag on a scene file!";
- _printerr();
- error=ERR_FILE_CORRUPT;
- return error;
- }
-
- Object *obj = ObjectTypeDB::instance(res_type);
- if (!obj) {
-
- error_text+="Can't create sub resource of type: "+res_type;
- _printerr();
- error=ERR_FILE_CORRUPT;
- return error;
- }
-
-
- Resource *r = obj->cast_to<Resource>();
- if (!r) {
-
- error_text+="Can't create sub resource of type, because not a resource: "+res_type;
- _printerr();
- error=ERR_FILE_CORRUPT;
- return error;
- }
-
- resource=Ref<Resource>(r);
-
- resource_current++;
-
- while(true) {
-
- String assign;
- Variant value;
-
- error = VariantParser::parse_tag_assign_eof(&stream,lines,error_text,next_tag,assign,value,&rp);
-
- if (error) {
- if (error!=ERR_FILE_EOF) {
- _printerr();
- } else {
- if (!ResourceCache::has(res_path)) {
- resource->set_path(res_path);
- }
- }
- return error;
- }
-
- if (assign!=String()) {
- resource->set(assign,value);
- //it's assignment
- } else if (next_tag.name!=String()) {
-
- error=ERR_FILE_CORRUPT;
- error_text="Extra tag found when parsing main resource file";
- _printerr();
- return error;
- } else {
- error=ERR_FILE_EOF;
- return error;
- }
-
- }
-
- return OK;
-
- } else if (next_tag.name=="node") {
-
- if (!is_scene) {
-
- error_text+="found the 'node' tag on a resource file!";
- _printerr();
- error=ERR_FILE_CORRUPT;
- return error;
- }
-
- /*
- int add_name(const StringName& p_name);
- int add_value(const Variant& p_value);
- int add_node_path(const NodePath& p_path);
- int add_node(int p_parent,int p_owner,int p_type,int p_name, int p_instance);
- void add_node_property(int p_node,int p_name,int p_value);
- void add_node_group(int p_node,int p_group);
- void set_base_scene(int p_idx);
- void add_connection(int p_from,int p_to, int p_signal, int p_method, int p_flags,const Vector<int>& p_binds);
- void add_editable_instance(const NodePath& p_path);
-
- */
-
- int parent=-1;
- int owner=-1;
- int type=-1;
- int name=-1;
- int instance=-1;
-// int base_scene=-1;
-
- if (next_tag.fields.has("name")) {
- name=packed_scene->get_state()->add_name(next_tag.fields["name"]);
- }
-
- if (next_tag.fields.has("parent")) {
- parent=packed_scene->get_state()->add_node_path(next_tag.fields["parent"]);
- }
-
-
-
- if (next_tag.fields.has("type")) {
- type=packed_scene->get_state()->add_name(next_tag.fields["type"]);
- } else {
- type=SceneState::TYPE_INSTANCED; //no type? assume this was instanced
- }
-
-
- if (next_tag.fields.has("instance")) {
-
- instance=packed_scene->get_state()->add_value(next_tag.fields["instance"]);
-
- if (packed_scene->get_state()->get_node_count()==0 && parent==-1) {
- packed_scene->get_state()->set_base_scene(instance);
- instance=-1;
- }
- }
-
- if (next_tag.fields.has("instance_placeholder")) {
-
- String path=next_tag.fields["instance_placeholder"];
-
- int path_v = packed_scene->get_state()->add_value(path);
-
- if (packed_scene->get_state()->get_node_count()==0) {
- error=ERR_FILE_CORRUPT;
- error_text="Instance Placeholder can't be used for inheritance.";
- _printerr();
- return error;
- }
-
- instance=path_v|SceneState::FLAG_INSTANCE_IS_PLACEHOLDER;
- }
-
- if (next_tag.fields.has("owner")) {
- owner=packed_scene->get_state()->add_node_path(next_tag.fields["owner"]);
- } else {
- if (parent!=-1 && !(type==SceneState::TYPE_INSTANCED && instance==-1))
- owner=0; //if no owner, owner is root
- }
-
- int node_id = packed_scene->get_state()->add_node(parent,owner,type,name,instance);
-
- if (next_tag.fields.has("groups")) {
-
- Array groups = next_tag.fields["groups"];
- for (int i=0;i<groups.size();i++) {
- packed_scene->get_state()->add_node_group(node_id,packed_scene->get_state()->add_name(groups[i]));
- }
- }
-
- while(true) {
-
- String assign;
- Variant value;
-
- error = VariantParser::parse_tag_assign_eof(&stream,lines,error_text,next_tag,assign,value,&rp);
-
- if (error) {
- if (error!=ERR_FILE_EOF) {
- _printerr();
- } else {
- resource=packed_scene;
- if (!ResourceCache::has(res_path)) {
- packed_scene->set_path(res_path);
- }
- }
- return error;
- }
-
- if (assign!=String()) {
- int nameidx = packed_scene->get_state()->add_name(assign);
- int valueidx = packed_scene->get_state()->add_value(value);
- packed_scene->get_state()->add_node_property(node_id,nameidx,valueidx);
- //it's assignment
- } else if (next_tag.name!=String()) {
-
- error=OK;
- return error;
- } else {
-
- resource=packed_scene;
- error=ERR_FILE_EOF;
- return error;
- }
-
- }
-
- return OK;
-
- } else if (next_tag.name=="connection") {
-
- if (!is_scene) {
-
- error_text+="found the 'connection' tag on a resource file!";
- _printerr();
- error=ERR_FILE_CORRUPT;
- return error;
- }
-
- if (!next_tag.fields.has("from")) {
- error=ERR_FILE_CORRUPT;
- error_text="missing 'from' field fron connection tag";
- return error;
- }
-
- if (!next_tag.fields.has("to")) {
- error=ERR_FILE_CORRUPT;
- error_text="missing 'to' field fron connection tag";
- return error;
- }
-
- if (!next_tag.fields.has("signal")) {
- error=ERR_FILE_CORRUPT;
- error_text="missing 'signal' field fron connection tag";
- return error;
- }
-
- if (!next_tag.fields.has("method")) {
- error=ERR_FILE_CORRUPT;
- error_text="missing 'method' field fron connection tag";
- return error;
- }
-
- NodePath from = next_tag.fields["from"];
- NodePath to = next_tag.fields["to"];
- StringName method = next_tag.fields["method"];
- StringName signal = next_tag.fields["signal"];
- int flags=CONNECT_PERSIST;
- Array binds;
-
- if (next_tag.fields.has("flags")) {
- flags=next_tag.fields["flags"];
- }
-
- if (next_tag.fields.has("binds")) {
- binds=next_tag.fields["binds"];
- }
-
- Vector<int> bind_ints;
- for(int i=0;i<binds.size();i++) {
- bind_ints.push_back( packed_scene->get_state()->add_value( binds[i] ) );
- }
-
- packed_scene->get_state()->add_connection(
- packed_scene->get_state()->add_node_path(from.simplified()),
- packed_scene->get_state()->add_node_path(to.simplified()),
- packed_scene->get_state()->add_name(signal),
- packed_scene->get_state()->add_name(method),
- flags,
- bind_ints
- );
-
- error = VariantParser::parse_tag(&stream,lines,error_text,next_tag,&rp);
-
- if (error) {
- if (error!=ERR_FILE_EOF) {
- _printerr();
- } else {
- resource=packed_scene;
- }
- }
-
- return error;
- } else if (next_tag.name=="editable") {
-
- if (!is_scene) {
-
- error_text+="found the 'editable' tag on a resource file!";
- _printerr();
- error=ERR_FILE_CORRUPT;
- return error;
- }
-
- if (!next_tag.fields.has("path")) {
- error=ERR_FILE_CORRUPT;
- error_text="missing 'path' field fron connection tag";
- _printerr();
- return error;
- }
-
- NodePath path = next_tag.fields["path"];
-
- packed_scene->get_state()->add_editable_instance(path.simplified());
-
- error = VariantParser::parse_tag(&stream,lines,error_text,next_tag,&rp);
-
- if (error) {
- if (error!=ERR_FILE_EOF) {
- _printerr();
- } else {
- resource=packed_scene;
- }
- }
-
- return error;
-
- } else {
-
- error_text+="Unknown tag in file: "+next_tag.name;
- _printerr();
- error=ERR_FILE_CORRUPT;
- return error;
- }
-
- return OK;
-}
-
-int ResourceInteractiveLoaderText::get_stage() const {
-
- return resource_current;
-}
-int ResourceInteractiveLoaderText::get_stage_count() const {
-
- return resources_total;//+ext_resources;
-}
-
-ResourceInteractiveLoaderText::~ResourceInteractiveLoaderText() {
-
- memdelete(f);
-}
-
-void ResourceInteractiveLoaderText::get_dependencies(FileAccess *f,List<String> *p_dependencies,bool p_add_types) {
-
-
- open(f);
- ignore_resource_parsing=true;
- ERR_FAIL_COND(error!=OK);
-
- while(next_tag.name=="ext_resource") {
-
- if (!next_tag.fields.has("type")) {
- error=ERR_FILE_CORRUPT;
- error_text="Missing 'type' in external resource tag";
- _printerr();
- return;
- }
-
- if (!next_tag.fields.has("id")) {
- error=ERR_FILE_CORRUPT;
- error_text="Missing 'index' in external resource tag";
- _printerr();
- return;
- }
-
- String path=next_tag.fields["path"];
- String type=next_tag.fields["type"];
-
-
- if (path.find("://")==-1 && path.is_rel_path()) {
- // path is relative to file being loaded, so convert to a resource path
- path=Globals::get_singleton()->localize_path(local_path.get_base_dir().plus_file(path));
- }
-
-
- if (p_add_types) {
- path+="::"+type;
- }
-
- p_dependencies->push_back(path);
-
- Error err = VariantParser::parse_tag(&stream,lines,error_text,next_tag,&rp);
-
- if (err) {
- print_line(error_text+" - "+itos(lines));
- error_text="Unexpected end of file";
- _printerr();
- error=ERR_FILE_CORRUPT;
- }
-
-
- }
-}
-
-Error ResourceInteractiveLoaderText::rename_dependencies(FileAccess *p_f, const String &p_path,const Map<String,String>& p_map) {
-
-
- open(p_f,true);
- ERR_FAIL_COND_V(error!=OK,error);
- ignore_resource_parsing=true;
- //FileAccess
-
- FileAccess *fw = NULL;
-
- String base_path=local_path.get_base_dir();
-
-
- uint64_t tag_end = f->get_pos();
-
-
- while(true) {
-
-
-
- Error err = VariantParser::parse_tag(&stream,lines,error_text,next_tag,&rp);
-
- if (err!=OK) {
- if (fw) {
- memdelete(fw);
- }
- error=ERR_FILE_CORRUPT;
- ERR_FAIL_V(error);
- }
-
- if (next_tag.name!="ext_resource") {
-
- //nothing was done
- if (!fw)
- return OK;
-
- break;
-
-
- } else {
-
- if (!fw) {
-
- fw=FileAccess::open(p_path+".depren",FileAccess::WRITE);
- if (is_scene) {
- fw->store_line("[gd_scene load_steps="+itos(resources_total)+" format="+itos(FORMAT_VERSION)+"]\n");
- } else {
- fw->store_line("[gd_resource type=\""+res_type+"\" load_steps="+itos(resources_total)+" format="+itos(FORMAT_VERSION)+"]\n");
- }
- }
-
- if (!next_tag.fields.has("path") || !next_tag.fields.has("id") || !next_tag.fields.has("type")) {
- memdelete(fw);
- error=ERR_FILE_CORRUPT;
- ERR_FAIL_V(error);
- }
-
- String path = next_tag.fields["path"];
- int index = next_tag.fields["id"];
- String type = next_tag.fields["type"];
-
-
- bool relative=false;
- if (!path.begins_with("res://")) {
- path=base_path.plus_file(path).simplify_path();
- relative=true;
- }
-
- if (p_map.has(path)) {
- String np=p_map[path];
- path=np;
- }
-
- if (relative) {
- //restore relative
- path=base_path.path_to_file(path);
- }
-
- fw->store_line("[ext_resource path=\""+path+"\" type=\""+type+"\" id="+itos(index)+"]");
-
- tag_end = f->get_pos();
-
- }
-
- }
-
- f->seek(tag_end);
-
- uint8_t c=f->get_8();
- while(!f->eof_reached()) {
- fw->store_8(c);
- c=f->get_8();
- }
- f->close();
-
- bool all_ok = fw->get_error()==OK;
-
- memdelete(fw);
-
- if (!all_ok) {
- return ERR_CANT_CREATE;
- }
-
- DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
- da->remove(p_path);
- da->rename(p_path+".depren",p_path);
- memdelete(da);
-
- return OK;
-
-}
-
-
-void ResourceInteractiveLoaderText::open(FileAccess *p_f,bool p_skip_first_tag) {
-
- error=OK;
-
- lines=1;
- f=p_f;
-
-
- stream.f=f;
- is_scene=false;
- ignore_resource_parsing=false;
- resource_current=0;
-
-
- VariantParser::Tag tag;
- Error err = VariantParser::parse_tag(&stream,lines,error_text,tag);
-
- if (err) {
-
- error=err;
- _printerr();
- return;
- }
-
- if (tag.fields.has("format")) {
- int fmt = tag.fields["format"];
- if (fmt>FORMAT_VERSION) {
- error_text="Saved with newer format version";
- _printerr();
- error=ERR_PARSE_ERROR;
- return;
- }
- }
-
-
- if (tag.name=="gd_scene") {
- is_scene=true;
- packed_scene.instance();
-
- } else if (tag.name=="gd_resource") {
- if (!tag.fields.has("type")) {
- error_text="Missing 'type' field in 'gd_resource' tag";
- _printerr();
- error=ERR_PARSE_ERROR;
- return;
- }
-
- res_type=tag.fields["type"];
-
- } else {
- error_text="Unrecognized file type: "+tag.name;
- _printerr();
- error=ERR_PARSE_ERROR;
- return;
-
- }
-
-
-
- if (tag.fields.has("load_steps")) {
- resources_total=tag.fields["load_steps"];
- } else {
- resources_total=0;
- }
-
- if (!p_skip_first_tag) {
-
- err = VariantParser::parse_tag(&stream,lines,error_text,next_tag,&rp);
-
- if (err) {
- error_text="Unexpected end of file";
- _printerr();
- error=ERR_FILE_CORRUPT;
- }
- }
-
- rp.ext_func=_parse_ext_resources;
- rp.sub_func=_parse_sub_resources;
- rp.func=NULL;
- rp.userdata=this;
-
-}
-
-
-
-
-String ResourceInteractiveLoaderText::recognize(FileAccess *p_f) {
-
- error=OK;
-
- lines=1;
- f=p_f;
-
- stream.f=f;
-
- ignore_resource_parsing=true;
-
-
- VariantParser::Tag tag;
- Error err = VariantParser::parse_tag(&stream,lines,error_text,tag);
-
- if (err) {
- _printerr();
- return "";
- }
-
- if (tag.fields.has("format")) {
- int fmt = tag.fields["format"];
- if (fmt>FORMAT_VERSION) {
- error_text="Saved with newer format version";
- _printerr();
- return "";
- }
- }
-
- if (tag.name=="gd_scene")
- return "PackedScene";
-
- if (tag.name!="gd_resource")
- return "";
-
-
-
- if (!tag.fields.has("type")) {
- error_text="Missing 'type' field in 'gd_resource' tag";
- _printerr();
- return "";
- }
-
- return tag.fields["type"];
-
-
-}
-
-/////////////////////
-
-Ref<ResourceInteractiveLoader> ResourceFormatLoaderText::load_interactive(const String &p_path, Error *r_error) {
-
- if (r_error)
- *r_error=ERR_CANT_OPEN;
-
- Error err;
- FileAccess *f = FileAccess::open(p_path,FileAccess::READ,&err);
-
-
- if (err!=OK) {
-
- ERR_FAIL_COND_V(err!=OK,Ref<ResourceInteractiveLoader>());
- }
-
- Ref<ResourceInteractiveLoaderText> ria = memnew( ResourceInteractiveLoaderText );
- ria->local_path=Globals::get_singleton()->localize_path(p_path);
- ria->res_path=ria->local_path;
-// ria->set_local_path( Globals::get_singleton()->localize_path(p_path) );
- ria->open(f);
-
- return ria;
-}
-
-void ResourceFormatLoaderText::get_recognized_extensions_for_type(const String& p_type,List<String> *p_extensions) const {
-
- if (p_type=="") {
- get_recognized_extensions(p_extensions);
- return;
- }
-
- if (p_type=="PackedScene")
- p_extensions->push_back("tscn");
- else
- p_extensions->push_back("tres");
-
-}
-
-void ResourceFormatLoaderText::get_recognized_extensions(List<String> *p_extensions) const{
-
- p_extensions->push_back("tscn");
- p_extensions->push_back("tres");
-}
-
-bool ResourceFormatLoaderText::handles_type(const String& p_type) const{
-
- return true;
-}
-String ResourceFormatLoaderText::get_resource_type(const String &p_path) const{
-
-
-
- String ext=p_path.extension().to_lower();
- if (ext=="tscn")
- return "PackedScene";
- else if (ext!="tres")
- return String();
-
- //for anyhting else must test..
-
- FileAccess *f = FileAccess::open(p_path,FileAccess::READ);
- if (!f) {
-
- return ""; //could not rwead
- }
-
- Ref<ResourceInteractiveLoaderText> ria = memnew( ResourceInteractiveLoaderText );
- ria->local_path=Globals::get_singleton()->localize_path(p_path);
- ria->res_path=ria->local_path;
-// ria->set_local_path( Globals::get_singleton()->localize_path(p_path) );
- String r = ria->recognize(f);
- return r;
-}
-
-
-void ResourceFormatLoaderText::get_dependencies(const String& p_path,List<String> *p_dependencies,bool p_add_types) {
-
- FileAccess *f = FileAccess::open(p_path,FileAccess::READ);
- if (!f) {
-
- ERR_FAIL();
- }
-
- Ref<ResourceInteractiveLoaderText> ria = memnew( ResourceInteractiveLoaderText );
- ria->local_path=Globals::get_singleton()->localize_path(p_path);
- ria->res_path=ria->local_path;
-// ria->set_local_path( Globals::get_singleton()->localize_path(p_path) );
- ria->get_dependencies(f,p_dependencies,p_add_types);
-
-
-}
-
-Error ResourceFormatLoaderText::rename_dependencies(const String &p_path,const Map<String,String>& p_map) {
-
- FileAccess *f = FileAccess::open(p_path,FileAccess::READ);
- if (!f) {
-
- ERR_FAIL_V(ERR_CANT_OPEN);
- }
-
- Ref<ResourceInteractiveLoaderText> ria = memnew( ResourceInteractiveLoaderText );
- ria->local_path=Globals::get_singleton()->localize_path(p_path);
- ria->res_path=ria->local_path;
-// ria->set_local_path( Globals::get_singleton()->localize_path(p_path) );
- return ria->rename_dependencies(f,p_path,p_map);
-}
-
-
-/*****************************************************************************************************/
-/*****************************************************************************************************/
-/*****************************************************************************************************/
-/*****************************************************************************************************/
-/*****************************************************************************************************/
-/*****************************************************************************************************/
-/*****************************************************************************************************/
-/*****************************************************************************************************/
-/*****************************************************************************************************/
-/*****************************************************************************************************/
-
-
-String ResourceFormatSaverTextInstance::_write_resources(void *ud,const RES& p_resource) {
-
- ResourceFormatSaverTextInstance *rsi=(ResourceFormatSaverTextInstance*)ud;
- return rsi->_write_resource(p_resource);
-
-}
-
-String ResourceFormatSaverTextInstance::_write_resource(const RES& res) {
-
- if (external_resources.has(res)) {
-
- return "ExtResource( "+itos(external_resources[res]+1)+" )";
- } else {
-
- if (internal_resources.has(res)) {
- return "SubResource( "+itos(internal_resources[res])+" )";
- } else if (res->get_path().length() && res->get_path().find("::")==-1) {
-
- //external resource
- String path=relative_paths?local_path.path_to_file(res->get_path()):res->get_path();
- return "Resource( \""+path+"\" )";
- } else {
- ERR_EXPLAIN("Resource was not pre cached for the resource section, bug?");
- ERR_FAIL_V("null");
- //internal resource
- }
- }
-
- return "null";
-}
-
-void ResourceFormatSaverTextInstance::_find_resources(const Variant& p_variant,bool p_main) {
-
-
- switch(p_variant.get_type()) {
- case Variant::OBJECT: {
-
-
- RES res = p_variant.operator RefPtr();
-
- if (res.is_null() || external_resources.has(res))
- return;
-
- if (!p_main && (!bundle_resources ) && res->get_path().length() && res->get_path().find("::") == -1 ) {
- int index = external_resources.size();
- external_resources[res]=index;
- return;
- }
-
- if (resource_set.has(res))
- return;
-
- List<PropertyInfo> property_list;
-
- res->get_property_list( &property_list );
- property_list.sort();
-
- List<PropertyInfo>::Element *I=property_list.front();
-
- while(I) {
-
- PropertyInfo pi=I->get();
-
- if (pi.usage&PROPERTY_USAGE_STORAGE || (bundle_resources && pi.usage&PROPERTY_USAGE_BUNDLE)) {
-
- Variant v=res->get(I->get().name);
- _find_resources(v);
- }
-
- I=I->next();
- }
-
- resource_set.insert( res ); //saved after, so the childs it needs are available when loaded
- saved_resources.push_back(res);
-
- } break;
- case Variant::ARRAY: {
-
- Array varray=p_variant;
- int len=varray.size();
- for(int i=0;i<len;i++) {
-
- Variant v=varray.get(i);
- _find_resources(v);
- }
-
- } break;
- case Variant::DICTIONARY: {
-
- Dictionary d=p_variant;
- List<Variant> keys;
- d.get_key_list(&keys);
- for(List<Variant>::Element *E=keys.front();E;E=E->next()) {
-
- Variant v = d[E->get()];
- _find_resources(v);
- }
- } break;
- default: {}
- }
-
-}
-
-static String _valprop(const String& p_name) {
-
- if (p_name.find("\"")!=-1 || p_name.find("=")!=-1 || p_name.find(" ")!=-1)
- return "\""+p_name.c_escape()+"\"";
- return p_name;
-}
-
-Error ResourceFormatSaverTextInstance::save(const String &p_path,const RES& p_resource,uint32_t p_flags) {
-
- if (p_path.ends_with(".tscn")) {
- packed_scene=p_resource;
- }
-
- Error err;
- f = FileAccess::open(p_path, FileAccess::WRITE,&err);
- ERR_FAIL_COND_V( err, ERR_CANT_OPEN );
- FileAccessRef _fref(f);
-
- local_path = Globals::get_singleton()->localize_path(p_path);
-
- relative_paths=p_flags&ResourceSaver::FLAG_RELATIVE_PATHS;
- skip_editor=p_flags&ResourceSaver::FLAG_OMIT_EDITOR_PROPERTIES;
- bundle_resources=p_flags&ResourceSaver::FLAG_BUNDLE_RESOURCES;
- takeover_paths=p_flags&ResourceSaver::FLAG_REPLACE_SUBRESOURCE_PATHS;
- if (!p_path.begins_with("res://")) {
- takeover_paths=false;
- }
-
- // save resources
- _find_resources(p_resource,true);
-
- if (packed_scene.is_valid()) {
- //add instances to external resources if saving a packed scene
- for(int i=0;i<packed_scene->get_state()->get_node_count();i++) {
- if (packed_scene->get_state()->is_node_instance_placeholder(i))
- continue;
-
- Ref<PackedScene> instance=packed_scene->get_state()->get_node_instance(i);
- if (instance.is_valid() && !external_resources.has(instance)) {
- int index = external_resources.size();
- external_resources[instance]=index;
- }
- }
- }
-
-
- ERR_FAIL_COND_V(err!=OK,err);
-
- {
- String title=packed_scene.is_valid()?"[gd_scene ":"[gd_resource ";
- if (packed_scene.is_null())
- title+="type=\""+p_resource->get_type()+"\" ";
- int load_steps=saved_resources.size()+external_resources.size();
- //if (packed_scene.is_valid()) {
- // load_steps+=packed_scene->get_node_count();
- //}
- //no, better to not use load steps from nodes, no point to that
-
- if (load_steps>1) {
- title+="load_steps="+itos(load_steps)+" ";
- }
- title+="format="+itos(FORMAT_VERSION)+"";
- //title+="engine_version=\""+itos(VERSION_MAJOR)+"."+itos(VERSION_MINOR)+"\"";
-
- f->store_string(title);
- f->store_line("]\n"); //one empty line
- }
-
-
- Vector<RES> sorted_er;
- sorted_er.resize(external_resources.size());
-
- for(Map<RES,int>::Element *E=external_resources.front();E;E=E->next()) {
-
- sorted_er[E->get()]=E->key();
- }
-
- for(int i=0;i<sorted_er.size();i++) {
- String p = sorted_er[i]->get_path();
-
- f->store_string("[ext_resource path=\""+p+"\" type=\""+sorted_er[i]->get_save_type()+"\" id="+itos(i+1)+"]\n"); //bundled
- }
-
- if (external_resources.size())
- f->store_line(String()); //separate
-
- Set<int> used_indices;
-
- for(List<RES>::Element *E=saved_resources.front();E;E=E->next()) {
-
- RES res = E->get();
- if (E->next() && (res->get_path()=="" || res->get_path().find("::") != -1 )) {
-
- if (res->get_subindex()!=0) {
- if (used_indices.has(res->get_subindex())) {
- res->set_subindex(0); //repeated
- } else {
- used_indices.insert(res->get_subindex());
- }
- }
- }
- }
-
- for(List<RES>::Element *E=saved_resources.front();E;E=E->next()) {
-
- RES res = E->get();
- ERR_CONTINUE(!resource_set.has(res));
- bool main = (E->next()==NULL);
-
- if (main && packed_scene.is_valid())
- break; //save as a scene
-
- if (main) {
- f->store_line("[resource]\n");
- } else {
- String line="[sub_resource ";
- if (res->get_subindex()==0) {
- int new_subindex=1;
- if (used_indices.size()) {
- new_subindex=used_indices.back()->get()+1;
- }
-
- res->set_subindex(new_subindex);
- used_indices.insert(new_subindex);
- }
-
- int idx = res->get_subindex();
- line+="type=\""+res->get_type()+"\" id="+itos(idx);
- f->store_line(line+"]\n");
- if (takeover_paths) {
- res->set_path(p_path+"::"+itos(idx),true);
- }
-
- internal_resources[res]=idx;
-
- }
-
-
- List<PropertyInfo> property_list;
- res->get_property_list(&property_list);
-// property_list.sort();
- for(List<PropertyInfo>::Element *PE = property_list.front();PE;PE=PE->next()) {
-
-
- if (skip_editor && PE->get().name.begins_with("__editor"))
- continue;
-
- if (PE->get().usage&PROPERTY_USAGE_STORAGE || (bundle_resources && PE->get().usage&PROPERTY_USAGE_BUNDLE)) {
-
- String name = PE->get().name;
- Variant value = res->get(name);
-
-
- if ((PE->get().usage&PROPERTY_USAGE_STORE_IF_NONZERO && value.is_zero())||(PE->get().usage&PROPERTY_USAGE_STORE_IF_NONONE && value.is_one()) )
- continue;
-
- if (PE->get().type==Variant::OBJECT && value.is_zero() && !(PE->get().usage&PROPERTY_USAGE_STORE_IF_NULL))
- continue;
-
- String vars;
- VariantWriter::write_to_string(value,vars,_write_resources,this);
- f->store_string(_valprop(name)+" = "+vars+"\n");
- }
-
-
- }
-
- f->store_string("\n");
-
- }
-
- if (packed_scene.is_valid()) {
- //if this is a scene, save nodes and connections!
- Ref<SceneState> state = packed_scene->get_state();
- for(int i=0;i<state->get_node_count();i++) {
-
- StringName type = state->get_node_type(i);
- StringName name = state->get_node_name(i);
- NodePath path = state->get_node_path(i,true);
- NodePath owner = state->get_node_owner_path(i);
- Ref<PackedScene> instance = state->get_node_instance(i);
- String instance_placeholder = state->get_node_instance_placeholder(i);
- Vector<StringName> groups = state->get_node_groups(i);
-
-
-
- String header="[node";
- header+=" name=\""+String(name)+"\"";
- if (type!=StringName()) {
- header+=" type=\""+String(type)+"\"";
- }
- if (path!=NodePath()) {
- header+=" parent=\""+String(path.simplified())+"\"";
- }
- if (owner!=NodePath() && owner!=NodePath(".")) {
- header+=" owner=\""+String(owner.simplified())+"\"";
- }
-
- if (groups.size()) {
- String sgroups=" groups=[ ";
- for(int j=0;j<groups.size();j++) {
- if (j>0)
- sgroups+=", ";
- sgroups+="\""+groups[j].operator String().c_escape()+"\"";
- }
- sgroups+=" ]";
- header+=sgroups;
- }
-
- f->store_string(header);
-
- if (instance_placeholder!=String()) {
-
- String vars;
- f->store_string(" instance_placeholder=");
- VariantWriter::write_to_string(instance_placeholder,vars,_write_resources,this);
- f->store_string(vars);
- }
-
- if (instance.is_valid()) {
-
- String vars;
- f->store_string(" instance=");
- VariantWriter::write_to_string(instance,vars,_write_resources,this);
- f->store_string(vars);
-
- }
-
- f->store_line("]\n");
-
- for(int j=0;j<state->get_node_property_count(i);j++) {
-
- String vars;
- VariantWriter::write_to_string(state->get_node_property_value(i,j),vars,_write_resources,this);
-
- f->store_string(_valprop(String(state->get_node_property_name(i,j)))+" = "+vars+"\n");
- }
-
- if (state->get_node_property_count(i)) {
- //add space
- f->store_line(String());
- }
-
- }
-
- for(int i=0;i<state->get_connection_count();i++) {
-
- String connstr="[connection";
- connstr+=" signal=\""+String(state->get_connection_signal(i))+"\"";
- connstr+=" from=\""+String(state->get_connection_source(i).simplified())+"\"";
- connstr+=" to=\""+String(state->get_connection_target(i).simplified())+"\"";
- connstr+=" method=\""+String(state->get_connection_method(i))+"\"";
- int flags = state->get_connection_flags(i);
- if (flags!=Object::CONNECT_PERSIST) {
- connstr+=" flags="+itos(flags);
- }
-
- Array binds=state->get_connection_binds(i);
- f->store_string(connstr);
- if (binds.size()) {
- String vars;
- VariantWriter::write_to_string(binds,vars,_write_resources,this);
- f->store_string(" binds= "+vars);
-
- }
-
- f->store_line("]\n");
- }
-
- f->store_line(String());
-
- Vector<NodePath> editable_instances = state->get_editable_instances();
- for(int i=0;i<editable_instances.size();i++) {
- f->store_line("[editable path=\""+editable_instances[i].operator String()+"\"]");
- }
- }
-
- if (f->get_error()!=OK && f->get_error()!=ERR_FILE_EOF) {
- f->close();
- return ERR_CANT_CREATE;
- }
-
- f->close();
- //memdelete(f);
-
- return OK;
-}
-
-
-
-Error ResourceFormatSaverText::save(const String &p_path,const RES& p_resource,uint32_t p_flags) {
-
- if (p_path.ends_with(".sct") && p_resource->get_type()!="PackedScene") {
- return ERR_FILE_UNRECOGNIZED;
- }
-
- ResourceFormatSaverTextInstance saver;
- return saver.save(p_path,p_resource,p_flags);
-
-}
-
-bool ResourceFormatSaverText::recognize(const RES& p_resource) const {
-
-
- return true; // all recognized!
-}
-void ResourceFormatSaverText::get_recognized_extensions(const RES& p_resource,List<String> *p_extensions) const {
-
- if (p_resource->get_type()=="PackedScene")
- p_extensions->push_back("tscn"); //text scene
- else
- p_extensions->push_back("tres"); //text resource
-
-}
-
-ResourceFormatSaverText* ResourceFormatSaverText::singleton=NULL;
-ResourceFormatSaverText::ResourceFormatSaverText() {
- singleton=this;
-}
diff --git a/scene/resources/scene_format_text.h b/scene/resources/scene_format_text.h
deleted file mode 100644
index 6122a1f9d8..0000000000
--- a/scene/resources/scene_format_text.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/*************************************************************************/
-/* scene_format_text.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2016 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. */
-/*************************************************************************/
-#ifndef SCENE_FORMAT_TEXT_H
-#define SCENE_FORMAT_TEXT_H
-
-#include "io/resource_loader.h"
-#include "io/resource_saver.h"
-#include "os/file_access.h"
-#include "scene/resources/packed_scene.h"
-#include "variant_parser.h"
-
-
-
-class ResourceInteractiveLoaderText : public ResourceInteractiveLoader {
-
- String local_path;
- String res_path;
- String error_text;
-
- FileAccess *f;
-
- VariantParser::StreamFile stream;
-
- struct ExtResource {
- String path;
- String type;
- };
-
-
- bool is_scene;
- String res_type;
-
- bool ignore_resource_parsing;
-
-// Map<String,String> remaps;
-
- Map<int,ExtResource> ext_resources;
-
- int resources_total;
- int resource_current;
- String resource_type;
-
- VariantParser::Tag next_tag;
-
- mutable int lines;
-
- Map<String,String> remaps;
- //void _printerr();
-
- static Error _parse_sub_resources(void* p_self, VariantParser::Stream* p_stream,Ref<Resource>& r_res,int &line,String &r_err_str) { return reinterpret_cast<ResourceInteractiveLoaderText*>(p_self)->_parse_sub_resource(p_stream,r_res,line,r_err_str); }
- static Error _parse_ext_resources(void* p_self, VariantParser::Stream* p_stream,Ref<Resource>& r_res,int &line,String &r_err_str) { return reinterpret_cast<ResourceInteractiveLoaderText*>(p_self)->_parse_ext_resource(p_stream,r_res,line,r_err_str); }
-
- Error _parse_sub_resource(VariantParser::Stream* p_stream,Ref<Resource>& r_res,int &line,String &r_err_str);
- Error _parse_ext_resource(VariantParser::Stream* p_stream,Ref<Resource>& r_res,int &line,String &r_err_str);
-
- VariantParser::ResourceParser rp;
-
-
- Ref<PackedScene> packed_scene;
-
-
-friend class ResourceFormatLoaderText;
-
- List<RES> resource_cache;
- Error error;
-
- RES resource;
-
-public:
-
- virtual void set_local_path(const String& p_local_path);
- virtual Ref<Resource> get_resource();
- virtual Error poll();
- virtual int get_stage() const;
- virtual int get_stage_count() const;
-
- void open(FileAccess *p_f, bool p_skip_first_tag=false);
- String recognize(FileAccess *p_f);
- void get_dependencies(FileAccess *p_f, List<String> *p_dependencies, bool p_add_types);
- Error rename_dependencies(FileAccess *p_f, const String &p_path,const Map<String,String>& p_map);
-
-
- ~ResourceInteractiveLoaderText();
-
-};
-
-
-
-class ResourceFormatLoaderText : public ResourceFormatLoader {
-public:
-
- virtual Ref<ResourceInteractiveLoader> load_interactive(const String &p_path,Error *r_error=NULL);
- virtual void get_recognized_extensions_for_type(const String& p_type,List<String> *p_extensions) const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual bool handles_type(const String& p_type) const;
- virtual String get_resource_type(const String &p_path) const;
- virtual void get_dependencies(const String& p_path, List<String> *p_dependencies, bool p_add_types=false);
- virtual Error rename_dependencies(const String &p_path,const Map<String,String>& p_map);
-
-
-};
-
-
-class ResourceFormatSaverTextInstance {
-
- String local_path;
-
- Ref<PackedScene> packed_scene;
-
- bool takeover_paths;
- bool relative_paths;
- bool bundle_resources;
- bool skip_editor;
- FileAccess *f;
- Set<RES> resource_set;
- List<RES> saved_resources;
- Map<RES,int> external_resources;
- Map<RES,int> internal_resources;
-
- void _find_resources(const Variant& p_variant,bool p_main=false);
-
- static String _write_resources(void *ud,const RES& p_resource);
- String _write_resource(const RES& res);
-
-
-public:
-
- Error save(const String &p_path,const RES& p_resource,uint32_t p_flags=0);
-
-
-};
-
-class ResourceFormatSaverText : public ResourceFormatSaver {
-public:
- static ResourceFormatSaverText* singleton;
- virtual Error save(const String &p_path,const RES& p_resource,uint32_t p_flags=0);
- virtual bool recognize(const RES& p_resource) const;
- virtual void get_recognized_extensions(const RES& p_resource,List<String> *p_extensions) const;
-
- ResourceFormatSaverText();
-};
-
-
-#endif // SCENE_FORMAT_TEXT_H