| 126 | #endif // DISABLE_DEPRECATED |
| 127 | namespace { |
| 128 | void _fix_array_compatibility(const Vector<uint8_t> &p_src, uint64_t p_old_format, uint64_t p_new_format, uint32_t p_elements, Vector<uint8_t> &vertex_data, Vector<uint8_t> &attribute_data, Vector<uint8_t> &skin_data) { |
| 129 | uint32_t dst_vertex_stride; |
| 130 | uint32_t dst_normal_tangent_stride; |
| 131 | uint32_t dst_attribute_stride; |
| 132 | uint32_t dst_skin_stride; |
| 133 | uint32_t dst_offsets[Mesh::ARRAY_MAX]; |
| 134 | RenderingServer::get_singleton()->mesh_surface_make_offsets_from_format(p_new_format & (~RSE::ARRAY_FORMAT_INDEX), p_elements, 0, dst_offsets, dst_vertex_stride, dst_normal_tangent_stride, dst_attribute_stride, dst_skin_stride); |
| 135 | |
| 136 | vertex_data.resize((dst_vertex_stride + dst_normal_tangent_stride) * p_elements); |
| 137 | attribute_data.resize(dst_attribute_stride * p_elements); |
| 138 | skin_data.resize(dst_skin_stride * p_elements); |
| 139 | |
| 140 | uint8_t *dst_vertex_ptr = vertex_data.ptrw(); |
| 141 | uint8_t *dst_attribute_ptr = attribute_data.ptrw(); |
| 142 | uint8_t *dst_skin_ptr = skin_data.ptrw(); |
| 143 | |
| 144 | const uint8_t *src_vertex_ptr = p_src.ptr(); |
| 145 | uint32_t src_vertex_stride = p_src.size() / p_elements; |
| 146 | |
| 147 | uint32_t src_offset = 0; |
| 148 | for (uint32_t j = 0; j < OLD_ARRAY_INDEX; j++) { |
| 149 | if (!(p_old_format & (1ULL << j))) { |
| 150 | continue; |
| 151 | } |
| 152 | switch (j) { |
| 153 | case OLD_ARRAY_VERTEX: { |
| 154 | if (p_old_format & OLD_ARRAY_FLAG_USE_2D_VERTICES) { |
| 155 | if (p_old_format & OLD_ARRAY_COMPRESS_VERTEX) { |
| 156 | for (uint32_t i = 0; i < p_elements; i++) { |
| 157 | const uint16_t *src = (const uint16_t *)&src_vertex_ptr[i * src_vertex_stride]; |
| 158 | float *dst = (float *)&dst_vertex_ptr[i * dst_vertex_stride]; |
| 159 | dst[0] = Math::half_to_float(src[0]); |
| 160 | dst[1] = Math::half_to_float(src[1]); |
| 161 | } |
| 162 | src_offset += sizeof(uint16_t) * 2; |
| 163 | } else { |
| 164 | for (uint32_t i = 0; i < p_elements; i++) { |
| 165 | const float *src = (const float *)&src_vertex_ptr[i * src_vertex_stride]; |
| 166 | float *dst = (float *)&dst_vertex_ptr[i * dst_vertex_stride]; |
| 167 | dst[0] = src[0]; |
| 168 | dst[1] = src[1]; |
| 169 | } |
| 170 | src_offset += sizeof(float) * 2; |
| 171 | } |
| 172 | } else { |
| 173 | if (p_old_format & OLD_ARRAY_COMPRESS_VERTEX) { |
| 174 | for (uint32_t i = 0; i < p_elements; i++) { |
| 175 | const uint16_t *src = (const uint16_t *)&src_vertex_ptr[i * src_vertex_stride]; |
| 176 | float *dst = (float *)&dst_vertex_ptr[i * dst_vertex_stride]; |
| 177 | dst[0] = Math::half_to_float(src[0]); |
| 178 | dst[1] = Math::half_to_float(src[1]); |
| 179 | dst[2] = Math::half_to_float(src[2]); |
| 180 | } |
| 181 | src_offset += sizeof(uint16_t) * 4; //+pad |
| 182 | } else { |
| 183 | for (uint32_t i = 0; i < p_elements; i++) { |
| 184 | const float *src = (const float *)&src_vertex_ptr[i * src_vertex_stride]; |
| 185 | float *dst = (float *)&dst_vertex_ptr[i * dst_vertex_stride]; |