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

Function _fix_array_compatibility

compat/fake_mesh.cpp:128–418  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

126#endif // DISABLE_DEPRECATED
127namespace {
128void _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];

Callers 1

_setMethod · 0.85

Calls 2

resizeMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected