[GDExtension] Expose some low level functions and String operators.
This commit is contained in:
parent
cd0a9ccdfd
commit
db7d8c2d87
@ -31,8 +31,11 @@
|
|||||||
#include "gdextension_interface.h"
|
#include "gdextension_interface.h"
|
||||||
|
|
||||||
#include "core/config/engine.h"
|
#include "core/config/engine.h"
|
||||||
|
#include "core/io/file_access.h"
|
||||||
|
#include "core/io/xml_parser.h"
|
||||||
#include "core/object/class_db.h"
|
#include "core/object/class_db.h"
|
||||||
#include "core/object/script_language_extension.h"
|
#include "core/object/script_language_extension.h"
|
||||||
|
#include "core/object/worker_thread_pool.h"
|
||||||
#include "core/os/memory.h"
|
#include "core/os/memory.h"
|
||||||
#include "core/variant/variant.h"
|
#include "core/variant/variant.h"
|
||||||
#include "core/version.h"
|
#include "core/version.h"
|
||||||
@ -678,6 +681,59 @@ static const char32_t *gdextension_string_operator_index_const(GDExtensionConstS
|
|||||||
return &self->ptr()[p_index];
|
return &self->ptr()[p_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gdextension_string_operator_plus_eq_string(GDExtensionStringPtr p_self, GDExtensionConstStringPtr p_b) {
|
||||||
|
String *self = (String *)p_self;
|
||||||
|
const String *b = (const String *)p_b;
|
||||||
|
*self += *b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gdextension_string_operator_plus_eq_char(GDExtensionStringPtr p_self, char32_t p_b) {
|
||||||
|
String *self = (String *)p_self;
|
||||||
|
*self += p_b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gdextension_string_operator_plus_eq_cstr(GDExtensionStringPtr p_self, const char *p_b) {
|
||||||
|
String *self = (String *)p_self;
|
||||||
|
*self += p_b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gdextension_string_operator_plus_eq_wcstr(GDExtensionStringPtr p_self, const wchar_t *p_b) {
|
||||||
|
String *self = (String *)p_self;
|
||||||
|
*self += p_b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gdextension_string_operator_plus_eq_c32str(GDExtensionStringPtr p_self, const char32_t *p_b) {
|
||||||
|
String *self = (String *)p_self;
|
||||||
|
*self += p_b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GDExtensionInt gdextension_xml_parser_open_buffer(GDExtensionObjectPtr p_instance, const uint8_t *p_buffer, size_t p_size) {
|
||||||
|
XMLParser *xml = (XMLParser *)p_instance;
|
||||||
|
return (GDExtensionInt)xml->_open_buffer(p_buffer, p_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gdextension_file_access_store_buffer(GDExtensionObjectPtr p_instance, const uint8_t *p_src, uint64_t p_length) {
|
||||||
|
FileAccess *fa = (FileAccess *)p_instance;
|
||||||
|
fa->store_buffer(p_src, p_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint64_t gdextension_file_access_get_buffer(GDExtensionConstObjectPtr p_instance, uint8_t *p_dst, uint64_t p_length) {
|
||||||
|
const FileAccess *fa = (FileAccess *)p_instance;
|
||||||
|
return fa->get_buffer(p_dst, p_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64_t gdextension_worker_thread_pool_add_native_group_task(GDExtensionObjectPtr p_instance, void (*p_func)(void *, uint32_t), void *p_userdata, int p_elements, int p_tasks, bool p_high_priority, GDExtensionConstStringPtr p_description) {
|
||||||
|
WorkerThreadPool *p = (WorkerThreadPool *)p_instance;
|
||||||
|
const String *description = (const String *)p_description;
|
||||||
|
return (int64_t)p->add_native_group_task(p_func, p_userdata, p_elements, p_tasks, p_high_priority, *description);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64_t gdextension_worker_thread_pool_add_native_task(GDExtensionObjectPtr p_instance, void (*p_func)(void *), void *p_userdata, bool p_high_priority, GDExtensionConstStringPtr p_description) {
|
||||||
|
WorkerThreadPool *p = (WorkerThreadPool *)p_instance;
|
||||||
|
const String *description = (const String *)p_description;
|
||||||
|
return (int64_t)p->add_native_task(p_func, p_userdata, p_high_priority, *description);
|
||||||
|
}
|
||||||
|
|
||||||
/* Packed array functions */
|
/* Packed array functions */
|
||||||
|
|
||||||
static uint8_t *gdextension_packed_byte_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
|
static uint8_t *gdextension_packed_byte_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
|
||||||
@ -1025,6 +1081,25 @@ void gdextension_setup_interface(GDExtensionInterface *p_interface) {
|
|||||||
gde_interface.string_to_wide_chars = gdextension_string_to_wide_chars;
|
gde_interface.string_to_wide_chars = gdextension_string_to_wide_chars;
|
||||||
gde_interface.string_operator_index = gdextension_string_operator_index;
|
gde_interface.string_operator_index = gdextension_string_operator_index;
|
||||||
gde_interface.string_operator_index_const = gdextension_string_operator_index_const;
|
gde_interface.string_operator_index_const = gdextension_string_operator_index_const;
|
||||||
|
gde_interface.string_operator_plus_eq_string = gdextension_string_operator_plus_eq_string;
|
||||||
|
gde_interface.string_operator_plus_eq_char = gdextension_string_operator_plus_eq_char;
|
||||||
|
gde_interface.string_operator_plus_eq_cstr = gdextension_string_operator_plus_eq_cstr;
|
||||||
|
gde_interface.string_operator_plus_eq_wcstr = gdextension_string_operator_plus_eq_wcstr;
|
||||||
|
gde_interface.string_operator_plus_eq_c32str = gdextension_string_operator_plus_eq_c32str;
|
||||||
|
|
||||||
|
/* XMLParser extra utilities */
|
||||||
|
|
||||||
|
gde_interface.xml_parser_open_buffer = gdextension_xml_parser_open_buffer;
|
||||||
|
|
||||||
|
/* FileAccess extra utilities */
|
||||||
|
|
||||||
|
gde_interface.file_access_store_buffer = gdextension_file_access_store_buffer;
|
||||||
|
gde_interface.file_access_get_buffer = gdextension_file_access_get_buffer;
|
||||||
|
|
||||||
|
/* WorkerThreadPool extra utilities */
|
||||||
|
|
||||||
|
gde_interface.worker_thread_pool_add_native_group_task = gdextension_worker_thread_pool_add_native_group_task;
|
||||||
|
gde_interface.worker_thread_pool_add_native_task = gdextension_worker_thread_pool_add_native_task;
|
||||||
|
|
||||||
/* Packed array functions */
|
/* Packed array functions */
|
||||||
|
|
||||||
|
@ -503,6 +503,26 @@ typedef struct {
|
|||||||
char32_t *(*string_operator_index)(GDExtensionStringPtr p_self, GDExtensionInt p_index);
|
char32_t *(*string_operator_index)(GDExtensionStringPtr p_self, GDExtensionInt p_index);
|
||||||
const char32_t *(*string_operator_index_const)(GDExtensionConstStringPtr p_self, GDExtensionInt p_index);
|
const char32_t *(*string_operator_index_const)(GDExtensionConstStringPtr p_self, GDExtensionInt p_index);
|
||||||
|
|
||||||
|
void (*string_operator_plus_eq_string)(GDExtensionStringPtr p_self, GDExtensionConstStringPtr p_b);
|
||||||
|
void (*string_operator_plus_eq_char)(GDExtensionStringPtr p_self, char32_t p_b);
|
||||||
|
void (*string_operator_plus_eq_cstr)(GDExtensionStringPtr p_self, const char *p_b);
|
||||||
|
void (*string_operator_plus_eq_wcstr)(GDExtensionStringPtr p_self, const wchar_t *p_b);
|
||||||
|
void (*string_operator_plus_eq_c32str)(GDExtensionStringPtr p_self, const char32_t *p_b);
|
||||||
|
|
||||||
|
/* XMLParser extra utilities */
|
||||||
|
|
||||||
|
GDExtensionInt (*xml_parser_open_buffer)(GDExtensionObjectPtr p_instance, const uint8_t *p_buffer, size_t p_size);
|
||||||
|
|
||||||
|
/* FileAccess extra utilities */
|
||||||
|
|
||||||
|
void (*file_access_store_buffer)(GDExtensionObjectPtr p_instance, const uint8_t *p_src, uint64_t p_length);
|
||||||
|
uint64_t (*file_access_get_buffer)(GDExtensionConstObjectPtr p_instance, uint8_t *p_dst, uint64_t p_length);
|
||||||
|
|
||||||
|
/* WorkerThreadPool extra utilities */
|
||||||
|
|
||||||
|
int64_t (*worker_thread_pool_add_native_group_task)(GDExtensionObjectPtr p_instance, void (*p_func)(void *, uint32_t), void *p_userdata, int p_elements, int p_tasks, bool p_high_priority, GDExtensionConstStringPtr p_description);
|
||||||
|
int64_t (*worker_thread_pool_add_native_task)(GDExtensionObjectPtr p_instance, void (*p_func)(void *), void *p_userdata, bool p_high_priority, GDExtensionConstStringPtr p_description);
|
||||||
|
|
||||||
/* Packed array functions */
|
/* Packed array functions */
|
||||||
|
|
||||||
uint8_t *(*packed_byte_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedByteArray
|
uint8_t *(*packed_byte_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedByteArray
|
||||||
|
@ -292,7 +292,7 @@ real_t FileAccess::get_real() const {
|
|||||||
|
|
||||||
Variant FileAccess::get_var(bool p_allow_objects) const {
|
Variant FileAccess::get_var(bool p_allow_objects) const {
|
||||||
uint32_t len = get_32();
|
uint32_t len = get_32();
|
||||||
Vector<uint8_t> buff = _get_buffer(len);
|
Vector<uint8_t> buff = get_buffer(len);
|
||||||
ERR_FAIL_COND_V((uint32_t)buff.size() != len, Variant());
|
ERR_FAIL_COND_V((uint32_t)buff.size() != len, Variant());
|
||||||
|
|
||||||
const uint8_t *r = buff.ptr();
|
const uint8_t *r = buff.ptr();
|
||||||
@ -469,7 +469,7 @@ uint64_t FileAccess::get_buffer(uint8_t *p_dst, uint64_t p_length) const {
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<uint8_t> FileAccess::_get_buffer(int64_t p_length) const {
|
Vector<uint8_t> FileAccess::get_buffer(int64_t p_length) const {
|
||||||
Vector<uint8_t> data;
|
Vector<uint8_t> data;
|
||||||
|
|
||||||
ERR_FAIL_COND_V_MSG(p_length < 0, data, "Length of buffer cannot be smaller than 0.");
|
ERR_FAIL_COND_V_MSG(p_length < 0, data, "Length of buffer cannot be smaller than 0.");
|
||||||
@ -663,7 +663,7 @@ void FileAccess::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileAccess::_store_buffer(const Vector<uint8_t> &p_buffer) {
|
void FileAccess::store_buffer(const Vector<uint8_t> &p_buffer) {
|
||||||
uint64_t len = p_buffer.size();
|
uint64_t len = p_buffer.size();
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
return;
|
return;
|
||||||
@ -687,7 +687,7 @@ void FileAccess::store_var(const Variant &p_var, bool p_full_objects) {
|
|||||||
ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant.");
|
ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant.");
|
||||||
|
|
||||||
store_32(len);
|
store_32(len);
|
||||||
_store_buffer(buff);
|
store_buffer(buff);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<uint8_t> FileAccess::get_file_as_bytes(const String &p_path, Error *r_error) {
|
Vector<uint8_t> FileAccess::get_file_as_bytes(const String &p_path, Error *r_error) {
|
||||||
@ -829,7 +829,7 @@ void FileAccess::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("get_float"), &FileAccess::get_float);
|
ClassDB::bind_method(D_METHOD("get_float"), &FileAccess::get_float);
|
||||||
ClassDB::bind_method(D_METHOD("get_double"), &FileAccess::get_double);
|
ClassDB::bind_method(D_METHOD("get_double"), &FileAccess::get_double);
|
||||||
ClassDB::bind_method(D_METHOD("get_real"), &FileAccess::get_real);
|
ClassDB::bind_method(D_METHOD("get_real"), &FileAccess::get_real);
|
||||||
ClassDB::bind_method(D_METHOD("get_buffer", "length"), &FileAccess::_get_buffer);
|
ClassDB::bind_method(D_METHOD("get_buffer", "length"), (Vector<uint8_t>(FileAccess::*)(int64_t) const) & FileAccess::get_buffer);
|
||||||
ClassDB::bind_method(D_METHOD("get_line"), &FileAccess::get_line);
|
ClassDB::bind_method(D_METHOD("get_line"), &FileAccess::get_line);
|
||||||
ClassDB::bind_method(D_METHOD("get_csv_line", "delim"), &FileAccess::get_csv_line, DEFVAL(","));
|
ClassDB::bind_method(D_METHOD("get_csv_line", "delim"), &FileAccess::get_csv_line, DEFVAL(","));
|
||||||
ClassDB::bind_method(D_METHOD("get_as_text", "skip_cr"), &FileAccess::get_as_text, DEFVAL(false));
|
ClassDB::bind_method(D_METHOD("get_as_text", "skip_cr"), &FileAccess::get_as_text, DEFVAL(false));
|
||||||
@ -847,7 +847,7 @@ void FileAccess::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("store_float", "value"), &FileAccess::store_float);
|
ClassDB::bind_method(D_METHOD("store_float", "value"), &FileAccess::store_float);
|
||||||
ClassDB::bind_method(D_METHOD("store_double", "value"), &FileAccess::store_double);
|
ClassDB::bind_method(D_METHOD("store_double", "value"), &FileAccess::store_double);
|
||||||
ClassDB::bind_method(D_METHOD("store_real", "value"), &FileAccess::store_real);
|
ClassDB::bind_method(D_METHOD("store_real", "value"), &FileAccess::store_real);
|
||||||
ClassDB::bind_method(D_METHOD("store_buffer", "buffer"), &FileAccess::_store_buffer);
|
ClassDB::bind_method(D_METHOD("store_buffer", "buffer"), (void(FileAccess::*)(const Vector<uint8_t> &)) & FileAccess::store_buffer);
|
||||||
ClassDB::bind_method(D_METHOD("store_line", "line"), &FileAccess::store_line);
|
ClassDB::bind_method(D_METHOD("store_line", "line"), &FileAccess::store_line);
|
||||||
ClassDB::bind_method(D_METHOD("store_csv_line", "values", "delim"), &FileAccess::store_csv_line, DEFVAL(","));
|
ClassDB::bind_method(D_METHOD("store_csv_line", "values", "delim"), &FileAccess::store_csv_line, DEFVAL(","));
|
||||||
ClassDB::bind_method(D_METHOD("store_string", "string"), &FileAccess::store_string);
|
ClassDB::bind_method(D_METHOD("store_string", "string"), &FileAccess::store_string);
|
||||||
|
@ -127,7 +127,7 @@ public:
|
|||||||
Variant get_var(bool p_allow_objects = false) const;
|
Variant get_var(bool p_allow_objects = false) const;
|
||||||
|
|
||||||
virtual uint64_t get_buffer(uint8_t *p_dst, uint64_t p_length) const; ///< get an array of bytes
|
virtual uint64_t get_buffer(uint8_t *p_dst, uint64_t p_length) const; ///< get an array of bytes
|
||||||
Vector<uint8_t> _get_buffer(int64_t p_length) const;
|
Vector<uint8_t> get_buffer(int64_t p_length) const;
|
||||||
virtual String get_line() const;
|
virtual String get_line() const;
|
||||||
virtual String get_token() const;
|
virtual String get_token() const;
|
||||||
virtual Vector<String> get_csv_line(const String &p_delim = ",") const;
|
virtual Vector<String> get_csv_line(const String &p_delim = ",") const;
|
||||||
@ -162,7 +162,7 @@ public:
|
|||||||
virtual String get_pascal_string();
|
virtual String get_pascal_string();
|
||||||
|
|
||||||
virtual void store_buffer(const uint8_t *p_src, uint64_t p_length); ///< store an array of bytes
|
virtual void store_buffer(const uint8_t *p_src, uint64_t p_length); ///< store an array of bytes
|
||||||
void _store_buffer(const Vector<uint8_t> &p_buffer);
|
void store_buffer(const Vector<uint8_t> &p_buffer);
|
||||||
|
|
||||||
void store_var(const Variant &p_var, bool p_full_objects = false);
|
void store_var(const Variant &p_var, bool p_full_objects = false);
|
||||||
|
|
||||||
|
@ -354,10 +354,10 @@ void XMLParser::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("get_node_offset"), &XMLParser::get_node_offset);
|
ClassDB::bind_method(D_METHOD("get_node_offset"), &XMLParser::get_node_offset);
|
||||||
ClassDB::bind_method(D_METHOD("get_attribute_count"), &XMLParser::get_attribute_count);
|
ClassDB::bind_method(D_METHOD("get_attribute_count"), &XMLParser::get_attribute_count);
|
||||||
ClassDB::bind_method(D_METHOD("get_attribute_name", "idx"), &XMLParser::get_attribute_name);
|
ClassDB::bind_method(D_METHOD("get_attribute_name", "idx"), &XMLParser::get_attribute_name);
|
||||||
ClassDB::bind_method(D_METHOD("get_attribute_value", "idx"), (String(XMLParser::*)(int) const) & XMLParser::get_attribute_value);
|
ClassDB::bind_method(D_METHOD("get_attribute_value", "idx"), &XMLParser::get_attribute_value);
|
||||||
ClassDB::bind_method(D_METHOD("has_attribute", "name"), &XMLParser::has_attribute);
|
ClassDB::bind_method(D_METHOD("has_attribute", "name"), &XMLParser::has_attribute);
|
||||||
ClassDB::bind_method(D_METHOD("get_named_attribute_value", "name"), (String(XMLParser::*)(const String &) const) & XMLParser::get_attribute_value);
|
ClassDB::bind_method(D_METHOD("get_named_attribute_value", "name"), &XMLParser::get_named_attribute_value);
|
||||||
ClassDB::bind_method(D_METHOD("get_named_attribute_value_safe", "name"), &XMLParser::get_attribute_value_safe);
|
ClassDB::bind_method(D_METHOD("get_named_attribute_value_safe", "name"), &XMLParser::get_named_attribute_value_safe);
|
||||||
ClassDB::bind_method(D_METHOD("is_empty"), &XMLParser::is_empty);
|
ClassDB::bind_method(D_METHOD("is_empty"), &XMLParser::is_empty);
|
||||||
ClassDB::bind_method(D_METHOD("get_current_line"), &XMLParser::get_current_line);
|
ClassDB::bind_method(D_METHOD("get_current_line"), &XMLParser::get_current_line);
|
||||||
ClassDB::bind_method(D_METHOD("skip_section"), &XMLParser::skip_section);
|
ClassDB::bind_method(D_METHOD("skip_section"), &XMLParser::skip_section);
|
||||||
@ -422,7 +422,7 @@ bool XMLParser::has_attribute(const String &p_name) const {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
String XMLParser::get_attribute_value(const String &p_name) const {
|
String XMLParser::get_named_attribute_value(const String &p_name) const {
|
||||||
int idx = -1;
|
int idx = -1;
|
||||||
for (int i = 0; i < attributes.size(); i++) {
|
for (int i = 0; i < attributes.size(); i++) {
|
||||||
if (attributes[i].name == p_name) {
|
if (attributes[i].name == p_name) {
|
||||||
@ -436,7 +436,7 @@ String XMLParser::get_attribute_value(const String &p_name) const {
|
|||||||
return attributes[idx].value;
|
return attributes[idx].value;
|
||||||
}
|
}
|
||||||
|
|
||||||
String XMLParser::get_attribute_value_safe(const String &p_name) const {
|
String XMLParser::get_named_attribute_value_safe(const String &p_name) const {
|
||||||
int idx = -1;
|
int idx = -1;
|
||||||
for (int i = 0; i < attributes.size(); i++) {
|
for (int i = 0; i < attributes.size(); i++) {
|
||||||
if (attributes[i].name == p_name) {
|
if (attributes[i].name == p_name) {
|
||||||
|
@ -109,8 +109,8 @@ public:
|
|||||||
String get_attribute_name(int p_idx) const;
|
String get_attribute_name(int p_idx) const;
|
||||||
String get_attribute_value(int p_idx) const;
|
String get_attribute_value(int p_idx) const;
|
||||||
bool has_attribute(const String &p_name) const;
|
bool has_attribute(const String &p_name) const;
|
||||||
String get_attribute_value(const String &p_name) const;
|
String get_named_attribute_value(const String &p_name) const;
|
||||||
String get_attribute_value_safe(const String &p_name) const; // do not print error if doesn't exist
|
String get_named_attribute_value_safe(const String &p_name) const; // do not print error if doesn't exist
|
||||||
bool is_empty() const;
|
bool is_empty() const;
|
||||||
int get_current_line() const;
|
int get_current_line() const;
|
||||||
|
|
||||||
|
@ -1021,15 +1021,15 @@ static Error _parse_methods(Ref<XMLParser> &parser, Vector<DocData::MethodDoc> &
|
|||||||
if (parser->get_node_name() == element) {
|
if (parser->get_node_name() == element) {
|
||||||
DocData::MethodDoc method;
|
DocData::MethodDoc method;
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
||||||
method.name = parser->get_attribute_value("name");
|
method.name = parser->get_named_attribute_value("name");
|
||||||
if (parser->has_attribute("qualifiers")) {
|
if (parser->has_attribute("qualifiers")) {
|
||||||
method.qualifiers = parser->get_attribute_value("qualifiers");
|
method.qualifiers = parser->get_named_attribute_value("qualifiers");
|
||||||
}
|
}
|
||||||
if (parser->has_attribute("is_deprecated")) {
|
if (parser->has_attribute("is_deprecated")) {
|
||||||
method.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true";
|
method.is_deprecated = parser->get_named_attribute_value("is_deprecated").to_lower() == "true";
|
||||||
}
|
}
|
||||||
if (parser->has_attribute("is_experimental")) {
|
if (parser->has_attribute("is_experimental")) {
|
||||||
method.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true";
|
method.is_experimental = parser->get_named_attribute_value("is_experimental").to_lower() == "true";
|
||||||
}
|
}
|
||||||
|
|
||||||
while (parser->read() == OK) {
|
while (parser->read() == OK) {
|
||||||
@ -1037,21 +1037,21 @@ static Error _parse_methods(Ref<XMLParser> &parser, Vector<DocData::MethodDoc> &
|
|||||||
String name = parser->get_node_name();
|
String name = parser->get_node_name();
|
||||||
if (name == "return") {
|
if (name == "return") {
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
|
||||||
method.return_type = parser->get_attribute_value("type");
|
method.return_type = parser->get_named_attribute_value("type");
|
||||||
if (parser->has_attribute("enum")) {
|
if (parser->has_attribute("enum")) {
|
||||||
method.return_enum = parser->get_attribute_value("enum");
|
method.return_enum = parser->get_named_attribute_value("enum");
|
||||||
}
|
}
|
||||||
} else if (name == "returns_error") {
|
} else if (name == "returns_error") {
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("number"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("number"), ERR_FILE_CORRUPT);
|
||||||
method.errors_returned.push_back(parser->get_attribute_value("number").to_int());
|
method.errors_returned.push_back(parser->get_named_attribute_value("number").to_int());
|
||||||
} else if (name == "param") {
|
} else if (name == "param") {
|
||||||
DocData::ArgumentDoc argument;
|
DocData::ArgumentDoc argument;
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
||||||
argument.name = parser->get_attribute_value("name");
|
argument.name = parser->get_named_attribute_value("name");
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
|
||||||
argument.type = parser->get_attribute_value("type");
|
argument.type = parser->get_named_attribute_value("type");
|
||||||
if (parser->has_attribute("enum")) {
|
if (parser->has_attribute("enum")) {
|
||||||
argument.enumeration = parser->get_attribute_value("enum");
|
argument.enumeration = parser->get_named_attribute_value("enum");
|
||||||
}
|
}
|
||||||
|
|
||||||
method.arguments.push_back(argument);
|
method.arguments.push_back(argument);
|
||||||
@ -1153,21 +1153,21 @@ Error DocTools::_load(Ref<XMLParser> parser) {
|
|||||||
ERR_FAIL_COND_V(parser->get_node_name() != "class", ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(parser->get_node_name() != "class", ERR_FILE_CORRUPT);
|
||||||
|
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
||||||
String name = parser->get_attribute_value("name");
|
String name = parser->get_named_attribute_value("name");
|
||||||
class_list[name] = DocData::ClassDoc();
|
class_list[name] = DocData::ClassDoc();
|
||||||
DocData::ClassDoc &c = class_list[name];
|
DocData::ClassDoc &c = class_list[name];
|
||||||
|
|
||||||
c.name = name;
|
c.name = name;
|
||||||
if (parser->has_attribute("inherits")) {
|
if (parser->has_attribute("inherits")) {
|
||||||
c.inherits = parser->get_attribute_value("inherits");
|
c.inherits = parser->get_named_attribute_value("inherits");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parser->has_attribute("is_deprecated")) {
|
if (parser->has_attribute("is_deprecated")) {
|
||||||
c.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true";
|
c.is_deprecated = parser->get_named_attribute_value("is_deprecated").to_lower() == "true";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parser->has_attribute("is_experimental")) {
|
if (parser->has_attribute("is_experimental")) {
|
||||||
c.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true";
|
c.is_experimental = parser->get_named_attribute_value("is_experimental").to_lower() == "true";
|
||||||
}
|
}
|
||||||
|
|
||||||
while (parser->read() == OK) {
|
while (parser->read() == OK) {
|
||||||
@ -1193,7 +1193,7 @@ Error DocTools::_load(Ref<XMLParser> parser) {
|
|||||||
if (name3 == "link") {
|
if (name3 == "link") {
|
||||||
DocData::TutorialDoc tutorial;
|
DocData::TutorialDoc tutorial;
|
||||||
if (parser->has_attribute("title")) {
|
if (parser->has_attribute("title")) {
|
||||||
tutorial.title = parser->get_attribute_value("title");
|
tutorial.title = parser->get_named_attribute_value("title");
|
||||||
}
|
}
|
||||||
parser->read();
|
parser->read();
|
||||||
if (parser->get_node_type() == XMLParser::NODE_TEXT) {
|
if (parser->get_node_type() == XMLParser::NODE_TEXT) {
|
||||||
@ -1231,23 +1231,23 @@ Error DocTools::_load(Ref<XMLParser> parser) {
|
|||||||
DocData::PropertyDoc prop2;
|
DocData::PropertyDoc prop2;
|
||||||
|
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
||||||
prop2.name = parser->get_attribute_value("name");
|
prop2.name = parser->get_named_attribute_value("name");
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
|
||||||
prop2.type = parser->get_attribute_value("type");
|
prop2.type = parser->get_named_attribute_value("type");
|
||||||
if (parser->has_attribute("setter")) {
|
if (parser->has_attribute("setter")) {
|
||||||
prop2.setter = parser->get_attribute_value("setter");
|
prop2.setter = parser->get_named_attribute_value("setter");
|
||||||
}
|
}
|
||||||
if (parser->has_attribute("getter")) {
|
if (parser->has_attribute("getter")) {
|
||||||
prop2.getter = parser->get_attribute_value("getter");
|
prop2.getter = parser->get_named_attribute_value("getter");
|
||||||
}
|
}
|
||||||
if (parser->has_attribute("enum")) {
|
if (parser->has_attribute("enum")) {
|
||||||
prop2.enumeration = parser->get_attribute_value("enum");
|
prop2.enumeration = parser->get_named_attribute_value("enum");
|
||||||
}
|
}
|
||||||
if (parser->has_attribute("is_deprecated")) {
|
if (parser->has_attribute("is_deprecated")) {
|
||||||
prop2.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true";
|
prop2.is_deprecated = parser->get_named_attribute_value("is_deprecated").to_lower() == "true";
|
||||||
}
|
}
|
||||||
if (parser->has_attribute("is_experimental")) {
|
if (parser->has_attribute("is_experimental")) {
|
||||||
prop2.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true";
|
prop2.is_experimental = parser->get_named_attribute_value("is_experimental").to_lower() == "true";
|
||||||
}
|
}
|
||||||
if (!parser->is_empty()) {
|
if (!parser->is_empty()) {
|
||||||
parser->read();
|
parser->read();
|
||||||
@ -1274,11 +1274,11 @@ Error DocTools::_load(Ref<XMLParser> parser) {
|
|||||||
DocData::ThemeItemDoc prop2;
|
DocData::ThemeItemDoc prop2;
|
||||||
|
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
||||||
prop2.name = parser->get_attribute_value("name");
|
prop2.name = parser->get_named_attribute_value("name");
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
|
||||||
prop2.type = parser->get_attribute_value("type");
|
prop2.type = parser->get_named_attribute_value("type");
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("data_type"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("data_type"), ERR_FILE_CORRUPT);
|
||||||
prop2.data_type = parser->get_attribute_value("data_type");
|
prop2.data_type = parser->get_named_attribute_value("data_type");
|
||||||
if (!parser->is_empty()) {
|
if (!parser->is_empty()) {
|
||||||
parser->read();
|
parser->read();
|
||||||
if (parser->get_node_type() == XMLParser::NODE_TEXT) {
|
if (parser->get_node_type() == XMLParser::NODE_TEXT) {
|
||||||
@ -1303,21 +1303,21 @@ Error DocTools::_load(Ref<XMLParser> parser) {
|
|||||||
if (name3 == "constant") {
|
if (name3 == "constant") {
|
||||||
DocData::ConstantDoc constant2;
|
DocData::ConstantDoc constant2;
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
|
||||||
constant2.name = parser->get_attribute_value("name");
|
constant2.name = parser->get_named_attribute_value("name");
|
||||||
ERR_FAIL_COND_V(!parser->has_attribute("value"), ERR_FILE_CORRUPT);
|
ERR_FAIL_COND_V(!parser->has_attribute("value"), ERR_FILE_CORRUPT);
|
||||||
constant2.value = parser->get_attribute_value("value");
|
constant2.value = parser->get_named_attribute_value("value");
|
||||||
constant2.is_value_valid = true;
|
constant2.is_value_valid = true;
|
||||||
if (parser->has_attribute("enum")) {
|
if (parser->has_attribute("enum")) {
|
||||||
constant2.enumeration = parser->get_attribute_value("enum");
|
constant2.enumeration = parser->get_named_attribute_value("enum");
|
||||||
}
|
}
|
||||||
if (parser->has_attribute("is_bitfield")) {
|
if (parser->has_attribute("is_bitfield")) {
|
||||||
constant2.is_bitfield = parser->get_attribute_value("is_bitfield").to_lower() == "true";
|
constant2.is_bitfield = parser->get_named_attribute_value("is_bitfield").to_lower() == "true";
|
||||||
}
|
}
|
||||||
if (parser->has_attribute("is_deprecated")) {
|
if (parser->has_attribute("is_deprecated")) {
|
||||||
constant2.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true";
|
constant2.is_deprecated = parser->get_named_attribute_value("is_deprecated").to_lower() == "true";
|
||||||
}
|
}
|
||||||
if (parser->has_attribute("is_experimental")) {
|
if (parser->has_attribute("is_experimental")) {
|
||||||
constant2.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true";
|
constant2.is_experimental = parser->get_named_attribute_value("is_experimental").to_lower() == "true";
|
||||||
}
|
}
|
||||||
if (!parser->is_empty()) {
|
if (!parser->is_empty()) {
|
||||||
parser->read();
|
parser->read();
|
||||||
|
@ -262,7 +262,7 @@ void Collada::_parse_asset(XMLParser &parser) {
|
|||||||
|
|
||||||
COLLADA_PRINT("up axis: " + parser.get_node_data());
|
COLLADA_PRINT("up axis: " + parser.get_node_data());
|
||||||
} else if (name == "unit") {
|
} else if (name == "unit") {
|
||||||
state.unit_scale = parser.get_attribute_value("meter").to_float();
|
state.unit_scale = parser.get_named_attribute_value("meter").to_float();
|
||||||
COLLADA_PRINT("unit scale: " + rtos(state.unit_scale));
|
COLLADA_PRINT("unit scale: " + rtos(state.unit_scale));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,7 +273,7 @@ void Collada::_parse_asset(XMLParser &parser) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Collada::_parse_image(XMLParser &parser) {
|
void Collada::_parse_image(XMLParser &parser) {
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
|
|
||||||
if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
|
if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
|
||||||
if (!parser.is_empty()) {
|
if (!parser.is_empty()) {
|
||||||
@ -286,7 +286,7 @@ void Collada::_parse_image(XMLParser &parser) {
|
|||||||
|
|
||||||
if (state.version < State::Version(1, 4, 0)) {
|
if (state.version < State::Version(1, 4, 0)) {
|
||||||
/* <1.4 */
|
/* <1.4 */
|
||||||
String path = parser.get_attribute_value("source").strip_edges();
|
String path = parser.get_named_attribute_value("source").strip_edges();
|
||||||
if (!path.contains("://") && path.is_relative_path()) {
|
if (!path.contains("://") && path.is_relative_path()) {
|
||||||
// path is relative to file being loaded, so convert to a resource path
|
// path is relative to file being loaded, so convert to a resource path
|
||||||
image.path = ProjectSettings::get_singleton()->localize_path(state.local_path.get_base_dir().path_join(path.uri_decode()));
|
image.path = ProjectSettings::get_singleton()->localize_path(state.local_path.get_base_dir().path_join(path.uri_decode()));
|
||||||
@ -337,9 +337,9 @@ void Collada::_parse_material(XMLParser &parser) {
|
|||||||
|
|
||||||
Material material;
|
Material material;
|
||||||
|
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
if (parser.has_attribute("name")) {
|
if (parser.has_attribute("name")) {
|
||||||
material.name = parser.get_attribute_value("name");
|
material.name = parser.get_named_attribute_value("name");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.version < State::Version(1, 4, 0)) {
|
if (state.version < State::Version(1, 4, 0)) {
|
||||||
@ -348,7 +348,7 @@ void Collada::_parse_material(XMLParser &parser) {
|
|||||||
} else {
|
} else {
|
||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT && parser.get_node_name() == "instance_effect") {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT && parser.get_node_name() == "instance_effect") {
|
||||||
material.instance_effect = _uri_to_id(parser.get_attribute_value("url"));
|
material.instance_effect = _uri_to_id(parser.get_named_attribute_value("url"));
|
||||||
} else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "material") {
|
} else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "material") {
|
||||||
break; //end of <asset>
|
break; //end of <asset>
|
||||||
}
|
}
|
||||||
@ -549,7 +549,7 @@ void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String &
|
|||||||
_parse_effect_material(parser, effect, id); // try again
|
_parse_effect_material(parser, effect, id); // try again
|
||||||
|
|
||||||
} else if (parser.get_node_name() == "newparam") {
|
} else if (parser.get_node_name() == "newparam") {
|
||||||
String name = parser.get_attribute_value("sid");
|
String name = parser.get_named_attribute_value("sid");
|
||||||
Variant value = _parse_param(parser);
|
Variant value = _parse_param(parser);
|
||||||
effect.params[name] = value;
|
effect.params[name] = value;
|
||||||
COLLADA_PRINT("param: " + name + " value:" + String(value));
|
COLLADA_PRINT("param: " + name + " value:" + String(value));
|
||||||
@ -591,7 +591,7 @@ void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String &
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else if (parser.get_node_name() == "texture") {
|
} else if (parser.get_node_name() == "texture") {
|
||||||
String sampler = parser.get_attribute_value("texture");
|
String sampler = parser.get_named_attribute_value("texture");
|
||||||
if (!effect.params.has(sampler)) {
|
if (!effect.params.has(sampler)) {
|
||||||
ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data());
|
ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data());
|
||||||
} else {
|
} else {
|
||||||
@ -609,7 +609,7 @@ void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String &
|
|||||||
} else if (what == "emission") {
|
} else if (what == "emission") {
|
||||||
effect.emission.texture = uri;
|
effect.emission.texture = uri;
|
||||||
} else if (what == "bump") {
|
} else if (what == "bump") {
|
||||||
if (parser.has_attribute("bumptype") && parser.get_attribute_value("bumptype") != "NORMALMAP") {
|
if (parser.has_attribute("bumptype") && parser.get_named_attribute_value("bumptype") != "NORMALMAP") {
|
||||||
WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.");
|
WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -654,7 +654,7 @@ void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String &
|
|||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
if (parser.get_node_name() == "texture") {
|
if (parser.get_node_name() == "texture") {
|
||||||
String sampler = parser.get_attribute_value("texture");
|
String sampler = parser.get_named_attribute_value("texture");
|
||||||
if (!effect.params.has(sampler)) {
|
if (!effect.params.has(sampler)) {
|
||||||
ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data());
|
ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data());
|
||||||
} else {
|
} else {
|
||||||
@ -665,7 +665,7 @@ void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String &
|
|||||||
} else {
|
} else {
|
||||||
String uri = effect.params[surface];
|
String uri = effect.params[surface];
|
||||||
|
|
||||||
if (parser.has_attribute("bumptype") && parser.get_attribute_value("bumptype") != "NORMALMAP") {
|
if (parser.has_attribute("bumptype") && parser.get_named_attribute_value("bumptype") != "NORMALMAP") {
|
||||||
WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.");
|
WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -703,11 +703,11 @@ void Collada::_parse_effect(XMLParser &parser) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
|
|
||||||
Effect effect;
|
Effect effect;
|
||||||
if (parser.has_attribute("name")) {
|
if (parser.has_attribute("name")) {
|
||||||
effect.name = parser.get_attribute_value("name");
|
effect.name = parser.get_named_attribute_value("name");
|
||||||
}
|
}
|
||||||
_parse_effect_material(parser, effect, id);
|
_parse_effect_material(parser, effect, id);
|
||||||
|
|
||||||
@ -724,7 +724,7 @@ void Collada::_parse_camera(XMLParser &parser) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
|
|
||||||
state.camera_data_map[id] = CameraData();
|
state.camera_data_map[id] = CameraData();
|
||||||
CameraData &camera = state.camera_data_map[id];
|
CameraData &camera = state.camera_data_map[id];
|
||||||
@ -780,7 +780,7 @@ void Collada::_parse_light(XMLParser &parser) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
|
|
||||||
state.light_data_map[id] = LightData();
|
state.light_data_map[id] = LightData();
|
||||||
LightData &light = state.light_data_map[id];
|
LightData &light = state.light_data_map[id];
|
||||||
@ -848,7 +848,7 @@ void Collada::_parse_curve_geometry(XMLParser &parser, String p_id, String p_nam
|
|||||||
|
|
||||||
CurveData &curvedata = state.curve_data_map[p_id];
|
CurveData &curvedata = state.curve_data_map[p_id];
|
||||||
curvedata.name = p_name;
|
curvedata.name = p_name;
|
||||||
String closed = parser.get_attribute_value_safe("closed").to_lower();
|
String closed = parser.get_named_attribute_value_safe("closed").to_lower();
|
||||||
curvedata.closed = closed == "true" || closed == "1";
|
curvedata.closed = closed == "true" || closed == "1";
|
||||||
|
|
||||||
COLLADA_PRINT("curve name: " + p_name);
|
COLLADA_PRINT("curve name: " + p_name);
|
||||||
@ -865,7 +865,7 @@ void Collada::_parse_curve_geometry(XMLParser &parser, String p_id, String p_nam
|
|||||||
String section = parser.get_node_name();
|
String section = parser.get_node_name();
|
||||||
|
|
||||||
if (section == "source") {
|
if (section == "source") {
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
curvedata.sources[id] = CurveData::Source();
|
curvedata.sources[id] = CurveData::Source();
|
||||||
current_source = id;
|
current_source = id;
|
||||||
COLLADA_PRINT("source data: " + id);
|
COLLADA_PRINT("source data: " + id);
|
||||||
@ -888,15 +888,15 @@ void Collada::_parse_curve_geometry(XMLParser &parser, String p_id, String p_nam
|
|||||||
} else if (section == "accessor") { // child of source (below a technique tag)
|
} else if (section == "accessor") { // child of source (below a technique tag)
|
||||||
|
|
||||||
if (curvedata.sources.has(current_source)) {
|
if (curvedata.sources.has(current_source)) {
|
||||||
curvedata.sources[current_source].stride = parser.get_attribute_value("stride").to_int();
|
curvedata.sources[current_source].stride = parser.get_named_attribute_value("stride").to_int();
|
||||||
COLLADA_PRINT("section: " + current_source + " stride " + itos(curvedata.sources[current_source].stride));
|
COLLADA_PRINT("section: " + current_source + " stride " + itos(curvedata.sources[current_source].stride));
|
||||||
}
|
}
|
||||||
} else if (section == "control_vertices") {
|
} else if (section == "control_vertices") {
|
||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
if (parser.get_node_name() == "input") {
|
if (parser.get_node_name() == "input") {
|
||||||
String semantic = parser.get_attribute_value("semantic");
|
String semantic = parser.get_named_attribute_value("semantic");
|
||||||
String source = _uri_to_id(parser.get_attribute_value("source"));
|
String source = _uri_to_id(parser.get_named_attribute_value("source"));
|
||||||
|
|
||||||
curvedata.control_vertices[semantic] = source;
|
curvedata.control_vertices[semantic] = source;
|
||||||
|
|
||||||
@ -945,7 +945,7 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name
|
|||||||
String section = parser.get_node_name();
|
String section = parser.get_node_name();
|
||||||
|
|
||||||
if (section == "source") {
|
if (section == "source") {
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
meshdata.sources[id] = MeshData::Source();
|
meshdata.sources[id] = MeshData::Source();
|
||||||
current_source = id;
|
current_source = id;
|
||||||
COLLADA_PRINT("source data: " + id);
|
COLLADA_PRINT("source data: " + id);
|
||||||
@ -961,19 +961,19 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name
|
|||||||
} else if (section == "accessor") { // child of source (below a technique tag)
|
} else if (section == "accessor") { // child of source (below a technique tag)
|
||||||
|
|
||||||
if (meshdata.sources.has(current_source)) {
|
if (meshdata.sources.has(current_source)) {
|
||||||
meshdata.sources[current_source].stride = parser.get_attribute_value("stride").to_int();
|
meshdata.sources[current_source].stride = parser.get_named_attribute_value("stride").to_int();
|
||||||
COLLADA_PRINT("section: " + current_source + " stride " + itos(meshdata.sources[current_source].stride));
|
COLLADA_PRINT("section: " + current_source + " stride " + itos(meshdata.sources[current_source].stride));
|
||||||
}
|
}
|
||||||
} else if (section == "vertices") {
|
} else if (section == "vertices") {
|
||||||
MeshData::Vertices vert;
|
MeshData::Vertices vert;
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
int last_ref = 0;
|
int last_ref = 0;
|
||||||
|
|
||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
if (parser.get_node_name() == "input") {
|
if (parser.get_node_name() == "input") {
|
||||||
String semantic = parser.get_attribute_value("semantic");
|
String semantic = parser.get_named_attribute_value("semantic");
|
||||||
String source = _uri_to_id(parser.get_attribute_value("source"));
|
String source = _uri_to_id(parser.get_named_attribute_value("source"));
|
||||||
|
|
||||||
if (semantic == "TEXCOORD") {
|
if (semantic == "TEXCOORD") {
|
||||||
semantic = "TEXCOORD" + itos(last_ref++);
|
semantic = "TEXCOORD" + itos(last_ref++);
|
||||||
@ -998,22 +998,22 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name
|
|||||||
MeshData::Primitives prim;
|
MeshData::Primitives prim;
|
||||||
|
|
||||||
if (parser.has_attribute("material")) {
|
if (parser.has_attribute("material")) {
|
||||||
prim.material = parser.get_attribute_value("material");
|
prim.material = parser.get_named_attribute_value("material");
|
||||||
}
|
}
|
||||||
prim.count = parser.get_attribute_value("count").to_int();
|
prim.count = parser.get_named_attribute_value("count").to_int();
|
||||||
prim.vertex_size = 0;
|
prim.vertex_size = 0;
|
||||||
int last_ref = 0;
|
int last_ref = 0;
|
||||||
|
|
||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
if (parser.get_node_name() == "input") {
|
if (parser.get_node_name() == "input") {
|
||||||
String semantic = parser.get_attribute_value("semantic");
|
String semantic = parser.get_named_attribute_value("semantic");
|
||||||
String source = _uri_to_id(parser.get_attribute_value("source"));
|
String source = _uri_to_id(parser.get_named_attribute_value("source"));
|
||||||
|
|
||||||
if (semantic == "TEXCOORD") {
|
if (semantic == "TEXCOORD") {
|
||||||
semantic = "TEXCOORD" + itos(last_ref++);
|
semantic = "TEXCOORD" + itos(last_ref++);
|
||||||
}
|
}
|
||||||
int offset = parser.get_attribute_value("offset").to_int();
|
int offset = parser.get_named_attribute_value("offset").to_int();
|
||||||
|
|
||||||
MeshData::Primitives::SourceRef sref;
|
MeshData::Primitives::SourceRef sref;
|
||||||
sref.source = source;
|
sref.source = source;
|
||||||
@ -1074,7 +1074,7 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) {
|
|||||||
state.skin_controller_data_map[p_id] = SkinControllerData();
|
state.skin_controller_data_map[p_id] = SkinControllerData();
|
||||||
SkinControllerData &skindata = state.skin_controller_data_map[p_id];
|
SkinControllerData &skindata = state.skin_controller_data_map[p_id];
|
||||||
|
|
||||||
skindata.base = _uri_to_id(parser.get_attribute_value("source"));
|
skindata.base = _uri_to_id(parser.get_named_attribute_value("source"));
|
||||||
|
|
||||||
String current_source;
|
String current_source;
|
||||||
|
|
||||||
@ -1091,7 +1091,7 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) {
|
|||||||
COLLADA_PRINT("skeleton bind shape transform: " + skindata.bind_shape);
|
COLLADA_PRINT("skeleton bind shape transform: " + skindata.bind_shape);
|
||||||
|
|
||||||
} else if (section == "source") {
|
} else if (section == "source") {
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
skindata.sources[id] = SkinControllerData::Source();
|
skindata.sources[id] = SkinControllerData::Source();
|
||||||
current_source = id;
|
current_source = id;
|
||||||
COLLADA_PRINT("source data: " + id);
|
COLLADA_PRINT("source data: " + id);
|
||||||
@ -1125,7 +1125,7 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) {
|
|||||||
if (skindata.sources.has(current_source)) {
|
if (skindata.sources.has(current_source)) {
|
||||||
int stride = 1;
|
int stride = 1;
|
||||||
if (parser.has_attribute("stride")) {
|
if (parser.has_attribute("stride")) {
|
||||||
stride = parser.get_attribute_value("stride").to_int();
|
stride = parser.get_named_attribute_value("stride").to_int();
|
||||||
}
|
}
|
||||||
|
|
||||||
skindata.sources[current_source].stride = stride;
|
skindata.sources[current_source].stride = stride;
|
||||||
@ -1138,8 +1138,8 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) {
|
|||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
if (parser.get_node_name() == "input") {
|
if (parser.get_node_name() == "input") {
|
||||||
String semantic = parser.get_attribute_value("semantic");
|
String semantic = parser.get_named_attribute_value("semantic");
|
||||||
String source = _uri_to_id(parser.get_attribute_value("source"));
|
String source = _uri_to_id(parser.get_named_attribute_value("source"));
|
||||||
|
|
||||||
joint.sources[semantic] = source;
|
joint.sources[semantic] = source;
|
||||||
|
|
||||||
@ -1155,15 +1155,15 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) {
|
|||||||
} else if (section == "vertex_weights") {
|
} else if (section == "vertex_weights") {
|
||||||
SkinControllerData::Weights weights;
|
SkinControllerData::Weights weights;
|
||||||
|
|
||||||
weights.count = parser.get_attribute_value("count").to_int();
|
weights.count = parser.get_named_attribute_value("count").to_int();
|
||||||
|
|
||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
if (parser.get_node_name() == "input") {
|
if (parser.get_node_name() == "input") {
|
||||||
String semantic = parser.get_attribute_value("semantic");
|
String semantic = parser.get_named_attribute_value("semantic");
|
||||||
String source = _uri_to_id(parser.get_attribute_value("source"));
|
String source = _uri_to_id(parser.get_named_attribute_value("source"));
|
||||||
|
|
||||||
int offset = parser.get_attribute_value("offset").to_int();
|
int offset = parser.get_named_attribute_value("offset").to_int();
|
||||||
|
|
||||||
SkinControllerData::Weights::SourceRef sref;
|
SkinControllerData::Weights::SourceRef sref;
|
||||||
sref.source = source;
|
sref.source = source;
|
||||||
@ -1228,8 +1228,8 @@ void Collada::_parse_morph_controller(XMLParser &parser, String p_id) {
|
|||||||
state.morph_controller_data_map[p_id] = MorphControllerData();
|
state.morph_controller_data_map[p_id] = MorphControllerData();
|
||||||
MorphControllerData &morphdata = state.morph_controller_data_map[p_id];
|
MorphControllerData &morphdata = state.morph_controller_data_map[p_id];
|
||||||
|
|
||||||
morphdata.mesh = _uri_to_id(parser.get_attribute_value("source"));
|
morphdata.mesh = _uri_to_id(parser.get_named_attribute_value("source"));
|
||||||
morphdata.mode = parser.get_attribute_value("method");
|
morphdata.mode = parser.get_named_attribute_value("method");
|
||||||
String current_source;
|
String current_source;
|
||||||
|
|
||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
@ -1237,7 +1237,7 @@ void Collada::_parse_morph_controller(XMLParser &parser, String p_id) {
|
|||||||
String section = parser.get_node_name();
|
String section = parser.get_node_name();
|
||||||
|
|
||||||
if (section == "source") {
|
if (section == "source") {
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
morphdata.sources[id] = MorphControllerData::Source();
|
morphdata.sources[id] = MorphControllerData::Source();
|
||||||
current_source = id;
|
current_source = id;
|
||||||
COLLADA_PRINT("source data: " + id);
|
COLLADA_PRINT("source data: " + id);
|
||||||
@ -1261,7 +1261,7 @@ void Collada::_parse_morph_controller(XMLParser &parser, String p_id) {
|
|||||||
if (morphdata.sources.has(current_source)) {
|
if (morphdata.sources.has(current_source)) {
|
||||||
int stride = 1;
|
int stride = 1;
|
||||||
if (parser.has_attribute("stride")) {
|
if (parser.has_attribute("stride")) {
|
||||||
stride = parser.get_attribute_value("stride").to_int();
|
stride = parser.get_named_attribute_value("stride").to_int();
|
||||||
}
|
}
|
||||||
|
|
||||||
morphdata.sources[current_source].stride = stride;
|
morphdata.sources[current_source].stride = stride;
|
||||||
@ -1272,8 +1272,8 @@ void Collada::_parse_morph_controller(XMLParser &parser, String p_id) {
|
|||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
if (parser.get_node_name() == "input") {
|
if (parser.get_node_name() == "input") {
|
||||||
String semantic = parser.get_attribute_value("semantic");
|
String semantic = parser.get_named_attribute_value("semantic");
|
||||||
String source = _uri_to_id(parser.get_attribute_value("source"));
|
String source = _uri_to_id(parser.get_named_attribute_value("source"));
|
||||||
|
|
||||||
morphdata.targets[semantic] = source;
|
morphdata.targets[semantic] = source;
|
||||||
|
|
||||||
@ -1295,7 +1295,7 @@ void Collada::_parse_morph_controller(XMLParser &parser, String p_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Collada::_parse_controller(XMLParser &parser) {
|
void Collada::_parse_controller(XMLParser &parser) {
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
|
|
||||||
if (parser.is_empty()) {
|
if (parser.is_empty()) {
|
||||||
return;
|
return;
|
||||||
@ -1320,7 +1320,7 @@ Collada::Node *Collada::_parse_visual_instance_geometry(XMLParser &parser) {
|
|||||||
String type = parser.get_node_name();
|
String type = parser.get_node_name();
|
||||||
NodeGeometry *geom = memnew(NodeGeometry);
|
NodeGeometry *geom = memnew(NodeGeometry);
|
||||||
geom->controller = type == "instance_controller";
|
geom->controller = type == "instance_controller";
|
||||||
geom->source = _uri_to_id(parser.get_attribute_value_safe("url"));
|
geom->source = _uri_to_id(parser.get_named_attribute_value_safe("url"));
|
||||||
|
|
||||||
if (parser.is_empty()) { //nothing else to parse...
|
if (parser.is_empty()) { //nothing else to parse...
|
||||||
return geom;
|
return geom;
|
||||||
@ -1329,8 +1329,8 @@ Collada::Node *Collada::_parse_visual_instance_geometry(XMLParser &parser) {
|
|||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
if (parser.get_node_name() == "instance_material") {
|
if (parser.get_node_name() == "instance_material") {
|
||||||
String symbol = parser.get_attribute_value("symbol");
|
String symbol = parser.get_named_attribute_value("symbol");
|
||||||
String target = _uri_to_id(parser.get_attribute_value("target"));
|
String target = _uri_to_id(parser.get_named_attribute_value("target"));
|
||||||
|
|
||||||
NodeGeometry::Material mat;
|
NodeGeometry::Material mat;
|
||||||
mat.target = target;
|
mat.target = target;
|
||||||
@ -1370,7 +1370,7 @@ Collada::Node *Collada::_parse_visual_instance_geometry(XMLParser &parser) {
|
|||||||
|
|
||||||
Collada::Node *Collada::_parse_visual_instance_camera(XMLParser &parser) {
|
Collada::Node *Collada::_parse_visual_instance_camera(XMLParser &parser) {
|
||||||
NodeCamera *cam = memnew(NodeCamera);
|
NodeCamera *cam = memnew(NodeCamera);
|
||||||
cam->camera = _uri_to_id(parser.get_attribute_value_safe("url"));
|
cam->camera = _uri_to_id(parser.get_named_attribute_value_safe("url"));
|
||||||
|
|
||||||
if (state.up_axis == Vector3::AXIS_Z) { //collada weirdness
|
if (state.up_axis == Vector3::AXIS_Z) { //collada weirdness
|
||||||
cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5);
|
cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5);
|
||||||
@ -1391,7 +1391,7 @@ Collada::Node *Collada::_parse_visual_instance_camera(XMLParser &parser) {
|
|||||||
|
|
||||||
Collada::Node *Collada::_parse_visual_instance_light(XMLParser &parser) {
|
Collada::Node *Collada::_parse_visual_instance_light(XMLParser &parser) {
|
||||||
NodeLight *cam = memnew(NodeLight);
|
NodeLight *cam = memnew(NodeLight);
|
||||||
cam->light = _uri_to_id(parser.get_attribute_value_safe("url"));
|
cam->light = _uri_to_id(parser.get_named_attribute_value_safe("url"));
|
||||||
|
|
||||||
if (state.up_axis == Vector3::AXIS_Z) { //collada weirdness
|
if (state.up_axis == Vector3::AXIS_Z) { //collada weirdness
|
||||||
cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5);
|
cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5);
|
||||||
@ -1437,7 +1437,7 @@ Collada::Node *Collada::_parse_visual_node_instance_data(XMLParser &parser) {
|
|||||||
Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
|
Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
|
||||||
String name;
|
String name;
|
||||||
|
|
||||||
String id = parser.get_attribute_value_safe("id");
|
String id = parser.get_named_attribute_value_safe("id");
|
||||||
|
|
||||||
bool found_name = false;
|
bool found_name = false;
|
||||||
|
|
||||||
@ -1455,25 +1455,25 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
|
|||||||
|
|
||||||
Node *node = nullptr;
|
Node *node = nullptr;
|
||||||
|
|
||||||
name = parser.has_attribute("name") ? parser.get_attribute_value_safe("name") : parser.get_attribute_value_safe("id");
|
name = parser.has_attribute("name") ? parser.get_named_attribute_value_safe("name") : parser.get_named_attribute_value_safe("id");
|
||||||
if (name.is_empty()) {
|
if (name.is_empty()) {
|
||||||
name = id;
|
name = id;
|
||||||
} else {
|
} else {
|
||||||
found_name = true;
|
found_name = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((parser.has_attribute("type") && parser.get_attribute_value("type") == "JOINT") || state.idref_joints.has(name)) {
|
if ((parser.has_attribute("type") && parser.get_named_attribute_value("type") == "JOINT") || state.idref_joints.has(name)) {
|
||||||
// handle a bone
|
// handle a bone
|
||||||
|
|
||||||
NodeJoint *joint = memnew(NodeJoint);
|
NodeJoint *joint = memnew(NodeJoint);
|
||||||
|
|
||||||
if (parser.has_attribute("sid")) { //bones may not have sid
|
if (parser.has_attribute("sid")) { //bones may not have sid
|
||||||
joint->sid = parser.get_attribute_value("sid");
|
joint->sid = parser.get_named_attribute_value("sid");
|
||||||
//state.bone_map[joint->sid]=joint;
|
//state.bone_map[joint->sid]=joint;
|
||||||
} else if (state.idref_joints.has(name)) {
|
} else if (state.idref_joints.has(name)) {
|
||||||
joint->sid = name; //kind of a cheat but..
|
joint->sid = name; //kind of a cheat but..
|
||||||
} else if (parser.has_attribute("name")) {
|
} else if (parser.has_attribute("name")) {
|
||||||
joint->sid = parser.get_attribute_value_safe("name");
|
joint->sid = parser.get_named_attribute_value_safe("name");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!joint->sid.is_empty()) {
|
if (!joint->sid.is_empty()) {
|
||||||
@ -1490,7 +1490,7 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
|
|||||||
if (section == "translate") {
|
if (section == "translate") {
|
||||||
Node::XForm xf;
|
Node::XForm xf;
|
||||||
if (parser.has_attribute("sid")) {
|
if (parser.has_attribute("sid")) {
|
||||||
xf.id = parser.get_attribute_value("sid");
|
xf.id = parser.get_named_attribute_value("sid");
|
||||||
}
|
}
|
||||||
xf.op = Node::XForm::OP_TRANSLATE;
|
xf.op = Node::XForm::OP_TRANSLATE;
|
||||||
|
|
||||||
@ -1501,7 +1501,7 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
|
|||||||
} else if (section == "rotate") {
|
} else if (section == "rotate") {
|
||||||
Node::XForm xf;
|
Node::XForm xf;
|
||||||
if (parser.has_attribute("sid")) {
|
if (parser.has_attribute("sid")) {
|
||||||
xf.id = parser.get_attribute_value("sid");
|
xf.id = parser.get_named_attribute_value("sid");
|
||||||
}
|
}
|
||||||
xf.op = Node::XForm::OP_ROTATE;
|
xf.op = Node::XForm::OP_ROTATE;
|
||||||
|
|
||||||
@ -1513,7 +1513,7 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
|
|||||||
} else if (section == "scale") {
|
} else if (section == "scale") {
|
||||||
Node::XForm xf;
|
Node::XForm xf;
|
||||||
if (parser.has_attribute("sid")) {
|
if (parser.has_attribute("sid")) {
|
||||||
xf.id = parser.get_attribute_value("sid");
|
xf.id = parser.get_named_attribute_value("sid");
|
||||||
}
|
}
|
||||||
|
|
||||||
xf.op = Node::XForm::OP_SCALE;
|
xf.op = Node::XForm::OP_SCALE;
|
||||||
@ -1527,7 +1527,7 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
|
|||||||
} else if (section == "matrix") {
|
} else if (section == "matrix") {
|
||||||
Node::XForm xf;
|
Node::XForm xf;
|
||||||
if (parser.has_attribute("sid")) {
|
if (parser.has_attribute("sid")) {
|
||||||
xf.id = parser.get_attribute_value("sid");
|
xf.id = parser.get_named_attribute_value("sid");
|
||||||
}
|
}
|
||||||
xf.op = Node::XForm::OP_MATRIX;
|
xf.op = Node::XForm::OP_MATRIX;
|
||||||
|
|
||||||
@ -1544,7 +1544,7 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
|
|||||||
} else if (section == "visibility") {
|
} else if (section == "visibility") {
|
||||||
Node::XForm xf;
|
Node::XForm xf;
|
||||||
if (parser.has_attribute("sid")) {
|
if (parser.has_attribute("sid")) {
|
||||||
xf.id = parser.get_attribute_value("sid");
|
xf.id = parser.get_named_attribute_value("sid");
|
||||||
}
|
}
|
||||||
xf.op = Node::XForm::OP_VISIBILITY;
|
xf.op = Node::XForm::OP_VISIBILITY;
|
||||||
|
|
||||||
@ -1609,7 +1609,7 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Collada::_parse_visual_scene(XMLParser &parser) {
|
void Collada::_parse_visual_scene(XMLParser &parser) {
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
|
|
||||||
if (parser.is_empty()) {
|
if (parser.is_empty()) {
|
||||||
return;
|
return;
|
||||||
@ -1619,7 +1619,7 @@ void Collada::_parse_visual_scene(XMLParser &parser) {
|
|||||||
VisualScene &vscene = state.visual_scene_map[id];
|
VisualScene &vscene = state.visual_scene_map[id];
|
||||||
|
|
||||||
if (parser.has_attribute("name")) {
|
if (parser.has_attribute("name")) {
|
||||||
vscene.name = parser.get_attribute_value("name");
|
vscene.name = parser.get_named_attribute_value("name");
|
||||||
}
|
}
|
||||||
|
|
||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
@ -1656,7 +1656,7 @@ void Collada::_parse_animation(XMLParser &parser) {
|
|||||||
|
|
||||||
String id = "";
|
String id = "";
|
||||||
if (parser.has_attribute("id")) {
|
if (parser.has_attribute("id")) {
|
||||||
id = parser.get_attribute_value("id");
|
id = parser.get_named_attribute_value("id");
|
||||||
}
|
}
|
||||||
|
|
||||||
String current_source;
|
String current_source;
|
||||||
@ -1668,7 +1668,7 @@ void Collada::_parse_animation(XMLParser &parser) {
|
|||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
String name = parser.get_node_name();
|
String name = parser.get_node_name();
|
||||||
if (name == "source") {
|
if (name == "source") {
|
||||||
current_source = parser.get_attribute_value("id");
|
current_source = parser.get_named_attribute_value("id");
|
||||||
source_param_names[current_source] = Vector<String>();
|
source_param_names[current_source] = Vector<String>();
|
||||||
source_param_types[current_source] = Vector<String>();
|
source_param_types[current_source] = Vector<String>();
|
||||||
|
|
||||||
@ -1683,32 +1683,32 @@ void Collada::_parse_animation(XMLParser &parser) {
|
|||||||
}
|
}
|
||||||
} else if (name == "accessor") {
|
} else if (name == "accessor") {
|
||||||
if (!current_source.is_empty() && parser.has_attribute("stride")) {
|
if (!current_source.is_empty() && parser.has_attribute("stride")) {
|
||||||
source_strides[current_source] = parser.get_attribute_value("stride").to_int();
|
source_strides[current_source] = parser.get_named_attribute_value("stride").to_int();
|
||||||
}
|
}
|
||||||
} else if (name == "sampler") {
|
} else if (name == "sampler") {
|
||||||
current_sampler = parser.get_attribute_value("id");
|
current_sampler = parser.get_named_attribute_value("id");
|
||||||
samplers[current_sampler] = HashMap<String, String>();
|
samplers[current_sampler] = HashMap<String, String>();
|
||||||
} else if (name == "param") {
|
} else if (name == "param") {
|
||||||
if (parser.has_attribute("name")) {
|
if (parser.has_attribute("name")) {
|
||||||
source_param_names[current_source].push_back(parser.get_attribute_value("name"));
|
source_param_names[current_source].push_back(parser.get_named_attribute_value("name"));
|
||||||
} else {
|
} else {
|
||||||
source_param_names[current_source].push_back("");
|
source_param_names[current_source].push_back("");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parser.has_attribute("type")) {
|
if (parser.has_attribute("type")) {
|
||||||
source_param_types[current_source].push_back(parser.get_attribute_value("type"));
|
source_param_types[current_source].push_back(parser.get_named_attribute_value("type"));
|
||||||
} else {
|
} else {
|
||||||
source_param_types[current_source].push_back("");
|
source_param_types[current_source].push_back("");
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (name == "input") {
|
} else if (name == "input") {
|
||||||
if (!current_sampler.is_empty()) {
|
if (!current_sampler.is_empty()) {
|
||||||
samplers[current_sampler][parser.get_attribute_value("semantic")] = parser.get_attribute_value("source");
|
samplers[current_sampler][parser.get_named_attribute_value("semantic")] = parser.get_named_attribute_value("source");
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (name == "channel") {
|
} else if (name == "channel") {
|
||||||
channel_sources.push_back(parser.get_attribute_value("source"));
|
channel_sources.push_back(parser.get_named_attribute_value("source"));
|
||||||
channel_targets.push_back(parser.get_attribute_value("target"));
|
channel_targets.push_back(parser.get_named_attribute_value("target"));
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "animation") {
|
} else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "animation") {
|
||||||
@ -1857,22 +1857,22 @@ void Collada::_parse_animation_clip(XMLParser &parser) {
|
|||||||
AnimationClip clip;
|
AnimationClip clip;
|
||||||
|
|
||||||
if (parser.has_attribute("name")) {
|
if (parser.has_attribute("name")) {
|
||||||
clip.name = parser.get_attribute_value("name");
|
clip.name = parser.get_named_attribute_value("name");
|
||||||
} else if (parser.has_attribute("id")) {
|
} else if (parser.has_attribute("id")) {
|
||||||
clip.name = parser.get_attribute_value("id");
|
clip.name = parser.get_named_attribute_value("id");
|
||||||
}
|
}
|
||||||
if (parser.has_attribute("start")) {
|
if (parser.has_attribute("start")) {
|
||||||
clip.begin = parser.get_attribute_value("start").to_float();
|
clip.begin = parser.get_named_attribute_value("start").to_float();
|
||||||
}
|
}
|
||||||
if (parser.has_attribute("end")) {
|
if (parser.has_attribute("end")) {
|
||||||
clip.end = parser.get_attribute_value("end").to_float();
|
clip.end = parser.get_named_attribute_value("end").to_float();
|
||||||
}
|
}
|
||||||
|
|
||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
String name = parser.get_node_name();
|
String name = parser.get_node_name();
|
||||||
if (name == "instance_animation") {
|
if (name == "instance_animation") {
|
||||||
String url = _uri_to_id(parser.get_attribute_value("url"));
|
String url = _uri_to_id(parser.get_named_attribute_value("url"));
|
||||||
clip.tracks.push_back(url);
|
clip.tracks.push_back(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1894,9 +1894,9 @@ void Collada::_parse_scene(XMLParser &parser) {
|
|||||||
String name = parser.get_node_name();
|
String name = parser.get_node_name();
|
||||||
|
|
||||||
if (name == "instance_visual_scene") {
|
if (name == "instance_visual_scene") {
|
||||||
state.root_visual_scene = _uri_to_id(parser.get_attribute_value("url"));
|
state.root_visual_scene = _uri_to_id(parser.get_named_attribute_value("url"));
|
||||||
} else if (name == "instance_physics_scene") {
|
} else if (name == "instance_physics_scene") {
|
||||||
state.root_physics_scene = _uri_to_id(parser.get_attribute_value("url"));
|
state.root_physics_scene = _uri_to_id(parser.get_named_attribute_value("url"));
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "scene") {
|
} else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "scene") {
|
||||||
@ -1925,8 +1925,8 @@ void Collada::_parse_library(XMLParser &parser) {
|
|||||||
} else if (name == "light") {
|
} else if (name == "light") {
|
||||||
_parse_light(parser);
|
_parse_light(parser);
|
||||||
} else if (name == "geometry") {
|
} else if (name == "geometry") {
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_named_attribute_value("id");
|
||||||
String name2 = parser.get_attribute_value_safe("name");
|
String name2 = parser.get_named_attribute_value_safe("name");
|
||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
if (parser.get_node_name() == "mesh") {
|
if (parser.get_node_name() == "mesh") {
|
||||||
@ -2346,7 +2346,7 @@ Error Collada::load(const String &p_path, int p_flags) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
//version
|
//version
|
||||||
String version = parser.get_attribute_value("version");
|
String version = parser.get_named_attribute_value("version");
|
||||||
state.version.major = version.get_slice(".", 0).to_int();
|
state.version.major = version.get_slice(".", 0).to_int();
|
||||||
state.version.minor = version.get_slice(".", 1).to_int();
|
state.version.minor = version.get_slice(".", 1).to_int();
|
||||||
state.version.rev = version.get_slice(".", 2).to_int();
|
state.version.rev = version.get_slice(".", 2).to_int();
|
||||||
|
@ -423,11 +423,7 @@ bool TextServerAdvanced::_load_support_data(const String &p_filename) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
uint64_t len = f->get_length();
|
uint64_t len = f->get_length();
|
||||||
#ifdef GDEXTENSION
|
|
||||||
PackedByteArray icu_data = f->get_buffer(len);
|
PackedByteArray icu_data = f->get_buffer(len);
|
||||||
#else
|
|
||||||
PackedByteArray icu_data = f->_get_buffer(len);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
UErrorCode err = U_ZERO_ERROR;
|
UErrorCode err = U_ZERO_ERROR;
|
||||||
udata_setCommonData(icu_data.ptr(), &err);
|
udata_setCommonData(icu_data.ptr(), &err);
|
||||||
@ -476,11 +472,7 @@ bool TextServerAdvanced::_save_support_data(const String &p_filename) const {
|
|||||||
PackedByteArray icu_data;
|
PackedByteArray icu_data;
|
||||||
icu_data.resize(U_ICUDATA_SIZE);
|
icu_data.resize(U_ICUDATA_SIZE);
|
||||||
memcpy(icu_data.ptrw(), U_ICUDATA_ENTRY_POINT, U_ICUDATA_SIZE);
|
memcpy(icu_data.ptrw(), U_ICUDATA_ENTRY_POINT, U_ICUDATA_SIZE);
|
||||||
#ifdef GDEXTENSION
|
|
||||||
f->store_buffer(icu_data);
|
f->store_buffer(icu_data);
|
||||||
#else
|
|
||||||
f->_store_buffer(icu_data);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
@ -824,29 +816,17 @@ _FORCE_INLINE_ TextServerAdvanced::FontTexturePosition TextServerAdvanced::find_
|
|||||||
// Could not find texture to fit, create one.
|
// Could not find texture to fit, create one.
|
||||||
int texsize = MAX(p_data->size.x * p_data->oversampling * 8, 256);
|
int texsize = MAX(p_data->size.x * p_data->oversampling * 8, 256);
|
||||||
|
|
||||||
#ifdef GDEXTENSION
|
|
||||||
texsize = Math::next_power_of_2(texsize);
|
|
||||||
#else
|
|
||||||
texsize = next_power_of_2(texsize);
|
texsize = next_power_of_2(texsize);
|
||||||
#endif
|
|
||||||
if (p_msdf) {
|
if (p_msdf) {
|
||||||
texsize = MIN(texsize, 2048);
|
texsize = MIN(texsize, 2048);
|
||||||
} else {
|
} else {
|
||||||
texsize = MIN(texsize, 1024);
|
texsize = MIN(texsize, 1024);
|
||||||
}
|
}
|
||||||
if (mw > texsize) { // Special case, adapt to it?
|
if (mw > texsize) { // Special case, adapt to it?
|
||||||
#ifdef GDEXTENSION
|
|
||||||
texsize = Math::next_power_of_2(mw);
|
|
||||||
#else
|
|
||||||
texsize = next_power_of_2(mw);
|
texsize = next_power_of_2(mw);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
if (mh > texsize) { // Special case, adapt to it?
|
if (mh > texsize) { // Special case, adapt to it?
|
||||||
#ifdef GDEXTENSION
|
|
||||||
texsize = Math::next_power_of_2(mh);
|
|
||||||
#else
|
|
||||||
texsize = next_power_of_2(mh);
|
texsize = next_power_of_2(mh);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ShelfPackTexture tex = ShelfPackTexture(texsize, texsize);
|
ShelfPackTexture tex = ShelfPackTexture(texsize, texsize);
|
||||||
@ -949,14 +929,14 @@ static int ft_cubic_to(const FT_Vector *control1, const FT_Vector *control2, con
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextServerAdvanced::_generateMTSDF_threaded(uint32_t y, void *p_td) const {
|
void TextServerAdvanced::_generateMTSDF_threaded(void *p_td, uint32_t p_y) {
|
||||||
MSDFThreadData *td = static_cast<MSDFThreadData *>(p_td);
|
MSDFThreadData *td = static_cast<MSDFThreadData *>(p_td);
|
||||||
|
|
||||||
msdfgen::ShapeDistanceFinder<msdfgen::OverlappingContourCombiner<msdfgen::MultiAndTrueDistanceSelector>> distanceFinder(*td->shape);
|
msdfgen::ShapeDistanceFinder<msdfgen::OverlappingContourCombiner<msdfgen::MultiAndTrueDistanceSelector>> distanceFinder(*td->shape);
|
||||||
int row = td->shape->inverseYAxis ? td->output->height() - y - 1 : y;
|
int row = td->shape->inverseYAxis ? td->output->height() - p_y - 1 : p_y;
|
||||||
for (int col = 0; col < td->output->width(); ++col) {
|
for (int col = 0; col < td->output->width(); ++col) {
|
||||||
int x = (y % 2) ? td->output->width() - col - 1 : col;
|
int x = (p_y % 2) ? td->output->width() - col - 1 : col;
|
||||||
msdfgen::Point2 p = td->projection->unproject(msdfgen::Point2(x + .5, y + .5));
|
msdfgen::Point2 p = td->projection->unproject(msdfgen::Point2(x + .5, p_y + .5));
|
||||||
msdfgen::MultiAndTrueDistance distance = distanceFinder.distance(p);
|
msdfgen::MultiAndTrueDistance distance = distanceFinder.distance(p);
|
||||||
td->distancePixelConversion->operator()(td->output->operator()(x, row), distance);
|
td->distancePixelConversion->operator()(td->output->operator()(x, row), distance);
|
||||||
}
|
}
|
||||||
@ -1026,14 +1006,8 @@ _FORCE_INLINE_ TextServerAdvanced::FontGlyph TextServerAdvanced::rasterize_msdf(
|
|||||||
td.projection = &projection;
|
td.projection = &projection;
|
||||||
td.distancePixelConversion = &distancePixelConversion;
|
td.distancePixelConversion = &distancePixelConversion;
|
||||||
|
|
||||||
#ifdef GDEXTENSION
|
WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_native_group_task(&TextServerAdvanced::_generateMTSDF_threaded, &td, h, -1, true, String("FontServerRasterizeMSDF"));
|
||||||
for (int i = 0; i < h; i++) {
|
|
||||||
_generateMTSDF_threaded(i, &td);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_template_group_task(this, &TextServerAdvanced::_generateMTSDF_threaded, &td, h, -1, true, SNAME("FontServerRasterizeMSDF"));
|
|
||||||
WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_task);
|
WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_task);
|
||||||
#endif
|
|
||||||
|
|
||||||
msdfgen::msdfErrorCorrection(image, shape, projection, p_pixel_range, config);
|
msdfgen::msdfErrorCorrection(image, shape, projection, p_pixel_range, config);
|
||||||
|
|
||||||
|
@ -72,7 +72,6 @@
|
|||||||
#include <godot_cpp/templates/hash_map.hpp>
|
#include <godot_cpp/templates/hash_map.hpp>
|
||||||
#include <godot_cpp/templates/hash_set.hpp>
|
#include <godot_cpp/templates/hash_set.hpp>
|
||||||
#include <godot_cpp/templates/rid_owner.hpp>
|
#include <godot_cpp/templates/rid_owner.hpp>
|
||||||
|
|
||||||
#include <godot_cpp/templates/vector.hpp>
|
#include <godot_cpp/templates/vector.hpp>
|
||||||
|
|
||||||
using namespace godot;
|
using namespace godot;
|
||||||
@ -350,7 +349,7 @@ class TextServerAdvanced : public TextServerExtension {
|
|||||||
_FORCE_INLINE_ bool _ensure_glyph(FontAdvanced *p_font_data, const Vector2i &p_size, int32_t p_glyph) const;
|
_FORCE_INLINE_ bool _ensure_glyph(FontAdvanced *p_font_data, const Vector2i &p_size, int32_t p_glyph) const;
|
||||||
_FORCE_INLINE_ bool _ensure_cache_for_size(FontAdvanced *p_font_data, const Vector2i &p_size) const;
|
_FORCE_INLINE_ bool _ensure_cache_for_size(FontAdvanced *p_font_data, const Vector2i &p_size) const;
|
||||||
_FORCE_INLINE_ void _font_clear_cache(FontAdvanced *p_font_data);
|
_FORCE_INLINE_ void _font_clear_cache(FontAdvanced *p_font_data);
|
||||||
void _generateMTSDF_threaded(uint32_t y, void *p_td) const;
|
static void _generateMTSDF_threaded(void *p_td, uint32_t p_y);
|
||||||
|
|
||||||
_FORCE_INLINE_ Vector2i _get_size(const FontAdvanced *p_font_data, int p_size) const {
|
_FORCE_INLINE_ Vector2i _get_size(const FontAdvanced *p_font_data, int p_size) const {
|
||||||
if (p_font_data->msdf) {
|
if (p_font_data->msdf) {
|
||||||
|
@ -88,24 +88,13 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
|||||||
if (!gl_state.ready) {
|
if (!gl_state.ready) {
|
||||||
Ref<XMLParser> parser;
|
Ref<XMLParser> parser;
|
||||||
parser.instantiate();
|
parser.instantiate();
|
||||||
#ifdef GDEXTENSION
|
|
||||||
PackedByteArray data;
|
|
||||||
data.resize(document->svg_document_length);
|
|
||||||
memcpy(data.ptrw(), document->svg_document, document->svg_document_length);
|
|
||||||
parser->open_buffer(data);
|
|
||||||
#else
|
|
||||||
parser->_open_buffer((const uint8_t *)document->svg_document, document->svg_document_length);
|
parser->_open_buffer((const uint8_t *)document->svg_document, document->svg_document_length);
|
||||||
#endif
|
|
||||||
|
|
||||||
float aspect = 1.0f;
|
float aspect = 1.0f;
|
||||||
String xml_body;
|
String xml_body;
|
||||||
while (parser->read() == OK) {
|
while (parser->read() == OK) {
|
||||||
if (parser->has_attribute("id")) {
|
if (parser->has_attribute("id")) {
|
||||||
#ifdef GDEXTENSION
|
|
||||||
const String &gl_name = parser->get_named_attribute_value("id");
|
const String &gl_name = parser->get_named_attribute_value("id");
|
||||||
#else
|
|
||||||
const String &gl_name = parser->get_attribute_value("id");
|
|
||||||
#endif
|
|
||||||
if (gl_name.begins_with("glyph")) {
|
if (gl_name.begins_with("glyph")) {
|
||||||
int dot_pos = gl_name.find(".");
|
int dot_pos = gl_name.find(".");
|
||||||
int64_t gl_idx = gl_name.substr(5, (dot_pos > 0) ? dot_pos - 5 : -1).to_int();
|
int64_t gl_idx = gl_name.substr(5, (dot_pos > 0) ? dot_pos - 5 : -1).to_int();
|
||||||
@ -117,11 +106,7 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
|||||||
}
|
}
|
||||||
if (parser->get_node_type() == XMLParser::NODE_ELEMENT && parser->get_node_name() == "svg") {
|
if (parser->get_node_type() == XMLParser::NODE_ELEMENT && parser->get_node_name() == "svg") {
|
||||||
if (parser->has_attribute("viewBox")) {
|
if (parser->has_attribute("viewBox")) {
|
||||||
#ifdef GDEXTENSION
|
|
||||||
PackedStringArray vb = parser->get_named_attribute_value("viewBox").split(" ");
|
PackedStringArray vb = parser->get_named_attribute_value("viewBox").split(" ");
|
||||||
#else
|
|
||||||
Vector<String> vb = parser->get_attribute_value("viewBox").split(" ");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (vb.size() == 4) {
|
if (vb.size() == 4) {
|
||||||
aspect = vb[2].to_float() / vb[3].to_float();
|
aspect = vb[2].to_float() / vb[3].to_float();
|
||||||
@ -129,19 +114,6 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
|||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#ifdef GDEXTENSION
|
|
||||||
if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
|
|
||||||
xml_body = xml_body + "<" + parser->get_node_name();
|
|
||||||
for (int i = 0; i < parser->get_attribute_count(); i++) {
|
|
||||||
xml_body = xml_body + " " + parser->get_attribute_name(i) + "=\"" + parser->get_attribute_value(i) + "\"";
|
|
||||||
}
|
|
||||||
xml_body = xml_body + ">";
|
|
||||||
} else if (parser->get_node_type() == XMLParser::NODE_TEXT) {
|
|
||||||
xml_body = xml_body + parser->get_node_data();
|
|
||||||
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END) {
|
|
||||||
xml_body = xml_body + "</" + parser->get_node_name() + ">";
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
xml_body += vformat("<%s", parser->get_node_name());
|
xml_body += vformat("<%s", parser->get_node_name());
|
||||||
for (int i = 0; i < parser->get_attribute_count(); i++) {
|
for (int i = 0; i < parser->get_attribute_count(); i++) {
|
||||||
@ -153,7 +125,6 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
|||||||
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END) {
|
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END) {
|
||||||
xml_body += vformat("</%s>", parser->get_node_name());
|
xml_body += vformat("</%s>", parser->get_node_name());
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
String temp_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 0 0\">" + xml_body;
|
String temp_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 0 0\">" + xml_body;
|
||||||
|
|
||||||
@ -175,11 +146,7 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
|||||||
new_h = (new_w / aspect);
|
new_h = (new_w / aspect);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GDEXTENSION
|
|
||||||
gl_state.xml_code = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"" + rtos(min_x) + " " + rtos(min_y) + " " + rtos(new_w) + " " + rtos(new_h) + "\">" + xml_body;
|
gl_state.xml_code = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"" + rtos(min_x) + " " + rtos(min_y) + " " + rtos(new_w) + " " + rtos(new_h) + "\">" + xml_body;
|
||||||
#else
|
|
||||||
gl_state.xml_code = vformat("<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"%f %f %f %f\">", min_x, min_y, new_w, new_h) + xml_body;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
picture = tvg::Picture::gen();
|
picture = tvg::Picture::gen();
|
||||||
result = picture->load(gl_state.xml_code.utf8().get_data(), gl_state.xml_code.utf8().length(), "svg+xml", false);
|
result = picture->load(gl_state.xml_code.utf8().get_data(), gl_state.xml_code.utf8().length(), "svg+xml", false);
|
||||||
|
@ -248,11 +248,7 @@ _FORCE_INLINE_ TextServerFallback::FontTexturePosition TextServerFallback::find_
|
|||||||
// Could not find texture to fit, create one.
|
// Could not find texture to fit, create one.
|
||||||
int texsize = MAX(p_data->size.x * p_data->oversampling * 8, 256);
|
int texsize = MAX(p_data->size.x * p_data->oversampling * 8, 256);
|
||||||
|
|
||||||
#ifdef GDEXTENSION
|
|
||||||
texsize = Math::next_power_of_2(texsize);
|
|
||||||
#else
|
|
||||||
texsize = next_power_of_2(texsize);
|
texsize = next_power_of_2(texsize);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (p_msdf) {
|
if (p_msdf) {
|
||||||
texsize = MIN(texsize, 2048);
|
texsize = MIN(texsize, 2048);
|
||||||
@ -260,18 +256,10 @@ _FORCE_INLINE_ TextServerFallback::FontTexturePosition TextServerFallback::find_
|
|||||||
texsize = MIN(texsize, 1024);
|
texsize = MIN(texsize, 1024);
|
||||||
}
|
}
|
||||||
if (mw > texsize) { // Special case, adapt to it?
|
if (mw > texsize) { // Special case, adapt to it?
|
||||||
#ifdef GDEXTENSION
|
|
||||||
texsize = Math::next_power_of_2(mw);
|
|
||||||
#else
|
|
||||||
texsize = next_power_of_2(mw);
|
texsize = next_power_of_2(mw);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
if (mh > texsize) { // Special case, adapt to it?
|
if (mh > texsize) { // Special case, adapt to it?
|
||||||
#ifdef GDEXTENSION
|
|
||||||
texsize = Math::next_power_of_2(mh);
|
|
||||||
#else
|
|
||||||
texsize = next_power_of_2(mh);
|
texsize = next_power_of_2(mh);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ShelfPackTexture tex = ShelfPackTexture(texsize, texsize);
|
ShelfPackTexture tex = ShelfPackTexture(texsize, texsize);
|
||||||
@ -374,14 +362,14 @@ static int ft_cubic_to(const FT_Vector *control1, const FT_Vector *control2, con
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextServerFallback::_generateMTSDF_threaded(uint32_t y, void *p_td) const {
|
void TextServerFallback::_generateMTSDF_threaded(void *p_td, uint32_t p_y) {
|
||||||
MSDFThreadData *td = static_cast<MSDFThreadData *>(p_td);
|
MSDFThreadData *td = static_cast<MSDFThreadData *>(p_td);
|
||||||
|
|
||||||
msdfgen::ShapeDistanceFinder<msdfgen::OverlappingContourCombiner<msdfgen::MultiAndTrueDistanceSelector>> distanceFinder(*td->shape);
|
msdfgen::ShapeDistanceFinder<msdfgen::OverlappingContourCombiner<msdfgen::MultiAndTrueDistanceSelector>> distanceFinder(*td->shape);
|
||||||
int row = td->shape->inverseYAxis ? td->output->height() - y - 1 : y;
|
int row = td->shape->inverseYAxis ? td->output->height() - p_y - 1 : p_y;
|
||||||
for (int col = 0; col < td->output->width(); ++col) {
|
for (int col = 0; col < td->output->width(); ++col) {
|
||||||
int x = (y % 2) ? td->output->width() - col - 1 : col;
|
int x = (p_y % 2) ? td->output->width() - col - 1 : col;
|
||||||
msdfgen::Point2 p = td->projection->unproject(msdfgen::Point2(x + .5, y + .5));
|
msdfgen::Point2 p = td->projection->unproject(msdfgen::Point2(x + .5, p_y + .5));
|
||||||
msdfgen::MultiAndTrueDistance distance = distanceFinder.distance(p);
|
msdfgen::MultiAndTrueDistance distance = distanceFinder.distance(p);
|
||||||
td->distancePixelConversion->operator()(td->output->operator()(x, row), distance);
|
td->distancePixelConversion->operator()(td->output->operator()(x, row), distance);
|
||||||
}
|
}
|
||||||
@ -451,14 +439,8 @@ _FORCE_INLINE_ TextServerFallback::FontGlyph TextServerFallback::rasterize_msdf(
|
|||||||
td.projection = &projection;
|
td.projection = &projection;
|
||||||
td.distancePixelConversion = &distancePixelConversion;
|
td.distancePixelConversion = &distancePixelConversion;
|
||||||
|
|
||||||
#ifdef GDEXTENSION
|
WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_native_group_task(&TextServerFallback::_generateMTSDF_threaded, &td, h, -1, true, String("TextServerFBRenderMSDF"));
|
||||||
for (int i = 0; i < h; i++) {
|
WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_task);
|
||||||
_generateMTSDF_threaded(i, &td);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
WorkerThreadPool::GroupID group_id = WorkerThreadPool::get_singleton()->add_template_group_task(this, &TextServerFallback::_generateMTSDF_threaded, &td, h, -1, true, SNAME("TextServerFBRenderMSDF"));
|
|
||||||
WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_id);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
msdfgen::msdfErrorCorrection(image, shape, projection, p_pixel_range, config);
|
msdfgen::msdfErrorCorrection(image, shape, projection, p_pixel_range, config);
|
||||||
|
|
||||||
|
@ -67,11 +67,11 @@
|
|||||||
#include <godot_cpp/classes/image.hpp>
|
#include <godot_cpp/classes/image.hpp>
|
||||||
#include <godot_cpp/classes/image_texture.hpp>
|
#include <godot_cpp/classes/image_texture.hpp>
|
||||||
#include <godot_cpp/classes/ref.hpp>
|
#include <godot_cpp/classes/ref.hpp>
|
||||||
|
#include <godot_cpp/classes/worker_thread_pool.hpp>
|
||||||
|
|
||||||
#include <godot_cpp/templates/hash_map.hpp>
|
#include <godot_cpp/templates/hash_map.hpp>
|
||||||
#include <godot_cpp/templates/hash_set.hpp>
|
#include <godot_cpp/templates/hash_set.hpp>
|
||||||
#include <godot_cpp/templates/rid_owner.hpp>
|
#include <godot_cpp/templates/rid_owner.hpp>
|
||||||
#include <godot_cpp/templates/thread_work_pool.hpp>
|
|
||||||
#include <godot_cpp/templates/vector.hpp>
|
#include <godot_cpp/templates/vector.hpp>
|
||||||
|
|
||||||
using namespace godot;
|
using namespace godot;
|
||||||
@ -303,7 +303,7 @@ class TextServerFallback : public TextServerExtension {
|
|||||||
_FORCE_INLINE_ bool _ensure_glyph(FontFallback *p_font_data, const Vector2i &p_size, int32_t p_glyph) const;
|
_FORCE_INLINE_ bool _ensure_glyph(FontFallback *p_font_data, const Vector2i &p_size, int32_t p_glyph) const;
|
||||||
_FORCE_INLINE_ bool _ensure_cache_for_size(FontFallback *p_font_data, const Vector2i &p_size) const;
|
_FORCE_INLINE_ bool _ensure_cache_for_size(FontFallback *p_font_data, const Vector2i &p_size) const;
|
||||||
_FORCE_INLINE_ void _font_clear_cache(FontFallback *p_font_data);
|
_FORCE_INLINE_ void _font_clear_cache(FontFallback *p_font_data);
|
||||||
void _generateMTSDF_threaded(uint32_t y, void *p_td) const;
|
static void _generateMTSDF_threaded(void *p_td, uint32_t p_y);
|
||||||
|
|
||||||
_FORCE_INLINE_ Vector2i _get_size(const FontFallback *p_font_data, int p_size) const {
|
_FORCE_INLINE_ Vector2i _get_size(const FontFallback *p_font_data, int p_size) const {
|
||||||
if (p_font_data->msdf) {
|
if (p_font_data->msdf) {
|
||||||
|
@ -88,24 +88,13 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
|||||||
if (!gl_state.ready) {
|
if (!gl_state.ready) {
|
||||||
Ref<XMLParser> parser;
|
Ref<XMLParser> parser;
|
||||||
parser.instantiate();
|
parser.instantiate();
|
||||||
#ifdef GDEXTENSION
|
|
||||||
PackedByteArray data;
|
|
||||||
data.resize(document->svg_document_length);
|
|
||||||
memcpy(data.ptrw(), document->svg_document, document->svg_document_length);
|
|
||||||
parser->open_buffer(data);
|
|
||||||
#else
|
|
||||||
parser->_open_buffer((const uint8_t *)document->svg_document, document->svg_document_length);
|
parser->_open_buffer((const uint8_t *)document->svg_document, document->svg_document_length);
|
||||||
#endif
|
|
||||||
|
|
||||||
float aspect = 1.0f;
|
float aspect = 1.0f;
|
||||||
String xml_body;
|
String xml_body;
|
||||||
while (parser->read() == OK) {
|
while (parser->read() == OK) {
|
||||||
if (parser->has_attribute("id")) {
|
if (parser->has_attribute("id")) {
|
||||||
#ifdef GDEXTENSION
|
|
||||||
const String &gl_name = parser->get_named_attribute_value("id");
|
const String &gl_name = parser->get_named_attribute_value("id");
|
||||||
#else
|
|
||||||
const String &gl_name = parser->get_attribute_value("id");
|
|
||||||
#endif
|
|
||||||
if (gl_name.begins_with("glyph")) {
|
if (gl_name.begins_with("glyph")) {
|
||||||
int dot_pos = gl_name.find(".");
|
int dot_pos = gl_name.find(".");
|
||||||
int64_t gl_idx = gl_name.substr(5, (dot_pos > 0) ? dot_pos - 5 : -1).to_int();
|
int64_t gl_idx = gl_name.substr(5, (dot_pos > 0) ? dot_pos - 5 : -1).to_int();
|
||||||
@ -117,11 +106,7 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
|||||||
}
|
}
|
||||||
if (parser->get_node_type() == XMLParser::NODE_ELEMENT && parser->get_node_name() == "svg") {
|
if (parser->get_node_type() == XMLParser::NODE_ELEMENT && parser->get_node_name() == "svg") {
|
||||||
if (parser->has_attribute("viewBox")) {
|
if (parser->has_attribute("viewBox")) {
|
||||||
#ifdef GDEXTENSION
|
|
||||||
PackedStringArray vb = parser->get_named_attribute_value("viewBox").split(" ");
|
PackedStringArray vb = parser->get_named_attribute_value("viewBox").split(" ");
|
||||||
#else
|
|
||||||
Vector<String> vb = parser->get_attribute_value("viewBox").split(" ");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (vb.size() == 4) {
|
if (vb.size() == 4) {
|
||||||
aspect = vb[2].to_float() / vb[3].to_float();
|
aspect = vb[2].to_float() / vb[3].to_float();
|
||||||
@ -129,19 +114,6 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
|||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#ifdef GDEXTENSION
|
|
||||||
if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
|
|
||||||
xml_body = xml_body + "<" + parser->get_node_name();
|
|
||||||
for (int i = 0; i < parser->get_attribute_count(); i++) {
|
|
||||||
xml_body = xml_body + " " + parser->get_attribute_name(i) + "=\"" + parser->get_attribute_value(i) + "\"";
|
|
||||||
}
|
|
||||||
xml_body = xml_body + ">";
|
|
||||||
} else if (parser->get_node_type() == XMLParser::NODE_TEXT) {
|
|
||||||
xml_body = xml_body + parser->get_node_data();
|
|
||||||
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END) {
|
|
||||||
xml_body = xml_body + "</" + parser->get_node_name() + ">";
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
xml_body += vformat("<%s", parser->get_node_name());
|
xml_body += vformat("<%s", parser->get_node_name());
|
||||||
for (int i = 0; i < parser->get_attribute_count(); i++) {
|
for (int i = 0; i < parser->get_attribute_count(); i++) {
|
||||||
@ -153,7 +125,6 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
|||||||
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END) {
|
} else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END) {
|
||||||
xml_body += vformat("</%s>", parser->get_node_name());
|
xml_body += vformat("</%s>", parser->get_node_name());
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
String temp_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 0 0\">" + xml_body;
|
String temp_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 0 0\">" + xml_body;
|
||||||
|
|
||||||
@ -175,11 +146,7 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
|
|||||||
new_h = (new_w / aspect);
|
new_h = (new_w / aspect);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GDEXTENSION
|
|
||||||
gl_state.xml_code = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"" + rtos(min_x) + " " + rtos(min_y) + " " + rtos(new_w) + " " + rtos(new_h) + "\">" + xml_body;
|
gl_state.xml_code = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"" + rtos(min_x) + " " + rtos(min_y) + " " + rtos(new_w) + " " + rtos(new_h) + "\">" + xml_body;
|
||||||
#else
|
|
||||||
gl_state.xml_code = vformat("<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"%f %f %f %f\">", min_x, min_y, new_w, new_h) + xml_body;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
picture = tvg::Picture::gen();
|
picture = tvg::Picture::gen();
|
||||||
result = picture->load(gl_state.xml_code.utf8().get_data(), gl_state.xml_code.utf8().length(), "svg+xml", false);
|
result = picture->load(gl_state.xml_code.utf8().get_data(), gl_state.xml_code.utf8().length(), "svg+xml", false);
|
||||||
|
@ -355,20 +355,20 @@ void OS_Android::_load_system_font_config() {
|
|||||||
if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
in_font_node = false;
|
in_font_node = false;
|
||||||
if (parser->get_node_name() == "familyset") {
|
if (parser->get_node_name() == "familyset") {
|
||||||
int ver = parser->has_attribute("version") ? parser->get_attribute_value("version").to_int() : 0;
|
int ver = parser->has_attribute("version") ? parser->get_named_attribute_value("version").to_int() : 0;
|
||||||
if (ver < 21) {
|
if (ver < 21) {
|
||||||
ERR_PRINT(vformat("Unsupported font config version %s", ver));
|
ERR_PRINT(vformat("Unsupported font config version %s", ver));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (parser->get_node_name() == "alias") {
|
} else if (parser->get_node_name() == "alias") {
|
||||||
String name = parser->has_attribute("name") ? parser->get_attribute_value("name").strip_edges() : String();
|
String name = parser->has_attribute("name") ? parser->get_named_attribute_value("name").strip_edges() : String();
|
||||||
String to = parser->has_attribute("to") ? parser->get_attribute_value("to").strip_edges() : String();
|
String to = parser->has_attribute("to") ? parser->get_named_attribute_value("to").strip_edges() : String();
|
||||||
if (!name.is_empty() && !to.is_empty()) {
|
if (!name.is_empty() && !to.is_empty()) {
|
||||||
font_aliases[name] = to;
|
font_aliases[name] = to;
|
||||||
}
|
}
|
||||||
} else if (parser->get_node_name() == "family") {
|
} else if (parser->get_node_name() == "family") {
|
||||||
fn = parser->has_attribute("name") ? parser->get_attribute_value("name").strip_edges() : String();
|
fn = parser->has_attribute("name") ? parser->get_named_attribute_value("name").strip_edges() : String();
|
||||||
String lang_code = parser->has_attribute("lang") ? parser->get_attribute_value("lang").strip_edges() : String();
|
String lang_code = parser->has_attribute("lang") ? parser->get_named_attribute_value("lang").strip_edges() : String();
|
||||||
Vector<String> lang_codes = lang_code.split(",");
|
Vector<String> lang_codes = lang_code.split(",");
|
||||||
for (int i = 0; i < lang_codes.size(); i++) {
|
for (int i = 0; i < lang_codes.size(); i++) {
|
||||||
Vector<String> lang_code_elements = lang_codes[i].split("-");
|
Vector<String> lang_code_elements = lang_codes[i].split("-");
|
||||||
@ -412,9 +412,9 @@ void OS_Android::_load_system_font_config() {
|
|||||||
}
|
}
|
||||||
} else if (parser->get_node_name() == "font") {
|
} else if (parser->get_node_name() == "font") {
|
||||||
in_font_node = true;
|
in_font_node = true;
|
||||||
fb = parser->has_attribute("fallbackFor") ? parser->get_attribute_value("fallbackFor").strip_edges() : String();
|
fb = parser->has_attribute("fallbackFor") ? parser->get_named_attribute_value("fallbackFor").strip_edges() : String();
|
||||||
fi.weight = parser->has_attribute("weight") ? parser->get_attribute_value("weight").to_int() : 400;
|
fi.weight = parser->has_attribute("weight") ? parser->get_named_attribute_value("weight").to_int() : 400;
|
||||||
fi.italic = parser->has_attribute("style") && parser->get_attribute_value("style").strip_edges() == "italic";
|
fi.italic = parser->has_attribute("style") && parser->get_named_attribute_value("style").strip_edges() == "italic";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (parser->get_node_type() == XMLParser::NODE_TEXT) {
|
if (parser->get_node_type() == XMLParser::NODE_TEXT) {
|
||||||
|
@ -54,7 +54,7 @@ TEST_CASE("[XMLParser] End-to-end") {
|
|||||||
CHECK(parser.get_node_type() == XMLParser::NodeType::NODE_ELEMENT);
|
CHECK(parser.get_node_type() == XMLParser::NodeType::NODE_ELEMENT);
|
||||||
CHECK(parser.get_node_name() == "top");
|
CHECK(parser.get_node_name() == "top");
|
||||||
CHECK(parser.has_attribute("attr"));
|
CHECK(parser.has_attribute("attr"));
|
||||||
CHECK(parser.get_attribute_value("attr") == "attr value");
|
CHECK(parser.get_named_attribute_value("attr") == "attr value");
|
||||||
|
|
||||||
CHECK(parser.read() == OK);
|
CHECK(parser.read() == OK);
|
||||||
CHECK(parser.get_node_type() == XMLParser::NodeType::NODE_TEXT);
|
CHECK(parser.get_node_type() == XMLParser::NodeType::NODE_TEXT);
|
||||||
|
Loading…
Reference in New Issue
Block a user