| 95 | } |
| 96 | |
| 97 | TextureLoaderCompat::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: |
nothing calls this directly
no test coverage detected