MCPcopy Create free account
hub / github.com/GDRETools/gdsdecomp / recognize

Method recognize

compat/texture_loader_compat.cpp:97–169  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

95}
96
97TextureLoaderCompat::TextureVersionType TextureLoaderCompat::recognize(const String &p_path, Error *r_err) {
98 Error err = OK;
99 if (!r_err) {
100 r_err = &err;
101 }
102 *r_err = OK;
103 const String res_path = p_path;
104 Ref<FileAccess> f = FileAccess::open(res_path, FileAccess::READ, r_err);
105
106 ERR_FAIL_COND_V_MSG(*r_err != OK || f.is_null(), FORMAT_NOT_TEXTURE, "Can't open texture file " + p_path);
107
108 uint8_t header[4];
109 uint64_t got = f->get_buffer(header, 4);
110 if (got != 4) { // empty file/corrupt
111 *r_err = ERR_FILE_EOF;
112 return FORMAT_NOT_TEXTURE;
113 }
114 //Only reading the header
115 if (header[0] == 'G' && header[1] == 'D' && header[2] == 'S' && header[3] == 'T') {
116 return TextureVersionType::FORMAT_V3_STREAM_TEXTURE2D;
117 } else if (header[0] == 'G' && header[1] == 'D' && header[2] == '3' && header[3] == 'T') {
118 return TextureVersionType::FORMAT_V3_STREAM_TEXTURE3D;
119 } else if (header[0] == 'G' && header[1] == 'D' && header[2] == 'A' && header[3] == 'T') {
120 return TextureVersionType::FORMAT_V3_STREAM_TEXTUREARRAY;
121 } else if (header[0] == 'G' && header[1] == 'S' && header[2] == 'T' && header[3] == 'L') {
122 String ext = p_path.get_extension();
123 if (ext == "ctexarray" || ext == "ccube" || ext == "ccubearray") {
124 return TextureVersionType::FORMAT_V4_COMPRESSED_TEXTURELAYERED;
125 }
126 return TextureVersionType::FORMAT_V4_COMPRESSED_TEXTURE3D;
127 } else if (header[0] == 'G' && header[1] == 'S' && header[2] == 'T' && header[3] == '2') {
128 return TextureVersionType::FORMAT_V4_COMPRESSED_TEXTURE2D;
129 } else if ((header[0] == 'R' && header[1] == 'S' && header[2] == 'R' && header[3] == 'C') ||
130 (header[0] == 'R' && header[1] == 'S' && header[2] == 'C' && header[3] == 'C')) {
131 // check if this is a V2 texture
132 ResourceFormatLoaderCompatBinary rlcb;
133 Ref<ResourceInfo> i_info = rlcb.get_resource_info(p_path, r_err);
134
135 if (*r_err == ERR_PRINTER_ON_FIRE) {
136 // no import metadata
137 *r_err = OK;
138 } else if (*r_err) {
139 ERR_FAIL_V_MSG(FORMAT_NOT_TEXTURE, "Can't open texture file " + p_path);
140 }
141 String type = i_info->type;
142 if (type == "Texture") {
143 return FORMAT_V2_TEXTURE;
144 } else if (type == "ImageTexture") {
145 if (i_info->ver_major <= 2) {
146 return FORMAT_V2_IMAGE_TEXTURE;
147 } else if (i_info->ver_major == 3) {
148 return FORMAT_V3_IMAGE_TEXTURE;
149 }
150 return FORMAT_V4_IMAGE_TEXTURE;
151 } else if (type == "AtlasTexture") {
152 switch (i_info->ver_major) {
153 case 1:
154 case 2:

Callers

nothing calls this directly

Calls 2

get_bufferMethod · 0.45
get_resource_infoMethod · 0.45

Tested by

no test coverage detected