-fix bug in cache for atlas import/export

-fix some menus
-fixed bug in out transition curves
-detect and remove file:/// in collada
-remove multiscript for now
-remove dependencies on mouse in OS, moved to Input
-avoid fscache from screwing up (fix might make it slower, but it works)
-funcref was missing, it's there now
This commit is contained in:
Juan Linietsky
2014-03-13 22:57:24 -03:00
parent a65edb4caa
commit 31ce3c5fd0
136 changed files with 10784 additions and 1578 deletions

View File

@@ -264,26 +264,94 @@ Error decode_variant(Variant& r_variant,const uint8_t *p_buffer, int p_len,int *
}
r_variant=img;
if (r_len)
if (r_len) {
if (datalen%4)
(*r_len)+=4-datalen%4;
(*r_len)+=4*5+datalen;
}
} break;
case Variant::NODE_PATH: {
ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
uint32_t strlen = decode_uint32(buf);
buf+=4;
len-=4;
ERR_FAIL_COND_V((int)strlen>len,ERR_INVALID_DATA);
if (strlen&0x80000000) {
//new format
ERR_FAIL_COND_V(len<12,ERR_INVALID_DATA);
Vector<StringName> names;
Vector<StringName> subnames;
bool absolute;
StringName prop;
int i=0;
uint32_t namecount=strlen&=0x7FFFFFFF;
uint32_t subnamecount = decode_uint32(buf+4);
uint32_t flags = decode_uint32(buf+8);
len-=12;
buf+=12;
int total=namecount+subnamecount;
if (flags&2)
total++;
if (r_len)
(*r_len)+=12;
String str;
str.parse_utf8((const char*)buf,strlen);
for(int i=0;i<total;i++) {
r_variant=NodePath(str);
ERR_FAIL_COND_V((int)len<4,ERR_INVALID_DATA);
strlen = decode_uint32(buf);
if (r_len)
(*r_len)+=4+strlen;
int pad=0;
if (strlen%4)
pad+=4-strlen%4;
buf+=4;
len-=4;
ERR_FAIL_COND_V((int)strlen+pad>len,ERR_INVALID_DATA);
String str;
str.parse_utf8((const char*)buf,strlen);
if (i<namecount)
names.push_back(str);
else if (i<namecount+subnamecount)
subnames.push_back(str);
else
prop=str;
buf+=strlen+pad;
len-=strlen+pad;
if (r_len)
(*r_len)+=4+strlen+pad;
}
r_variant=NodePath(names,subnames,flags&1,prop);
} else {
//old format, just a string
buf+=4;
len-=4;
ERR_FAIL_COND_V((int)strlen>len,ERR_INVALID_DATA);
String str;
str.parse_utf8((const char*)buf,strlen);
r_variant=NodePath(str);
if (r_len)
(*r_len)+=4+strlen;
}
} break;
/*case Variant::RESOURCE: {
@@ -713,7 +781,59 @@ Error encode_variant(const Variant& p_variant, uint8_t *r_buffer, int &r_len) {
r_len+=4;
} break;
case Variant::NODE_PATH:
case Variant::NODE_PATH: {
NodePath np=p_variant;
if (buf) {
encode_uint32(uint32_t(np.get_name_count())|0x80000000,buf); //for compatibility with the old format
encode_uint32(np.get_subname_count(),buf+4);
uint32_t flags=0;
if (np.is_absolute())
flags|=1;
if (np.get_property()!=StringName())
flags|=2;
encode_uint32(flags,buf+8);
buf+=12;
}
r_len+=12;
int total = np.get_name_count()+np.get_subname_count();
if (np.get_property()!=StringName())
total++;
for(int i=0;i<total;i++) {
String str;
if (i<np.get_name_count())
str=np.get_name(i);
else if (i<np.get_name_count()+np.get_subname_count())
str=np.get_subname(i-np.get_subname_count());
else
str=np.get_property();
CharString utf8 = str.utf8();
int pad = 0;
if (utf8.length()%4)
pad=4-utf8.length()%4;
if (buf) {
encode_uint32(utf8.length(),buf);
buf+=4;
copymem(buf,utf8.get_data(),utf8.length());
buf+=pad+utf8.length();
}
r_len+=4+utf8.length()+pad;
}
} break;
case Variant::STRING: {
@@ -879,7 +999,11 @@ Error encode_variant(const Variant& p_variant, uint8_t *r_buffer, int &r_len) {
copymem(&buf[20],&r[0],ds);
}
r_len+=data.size()+5*4;
int pad=0;
if (data.size()%4)
pad=4-data.size()%4;
r_len+=data.size()+5*4+pad;
} break;
/*case Variant::RESOURCE: {