Changeset View
Changeset View
Standalone View
Standalone View
source/blender/alembic/intern/abc_customdata.cc
| Show All 20 Lines | |||||
| * ***** END GPL LICENSE BLOCK ***** | * ***** END GPL LICENSE BLOCK ***** | ||||
| * | * | ||||
| */ | */ | ||||
| #include "abc_customdata.h" | #include "abc_customdata.h" | ||||
| #include <Alembic/AbcGeom/All.h> | #include <Alembic/AbcGeom/All.h> | ||||
| #include <algorithm> | #include <algorithm> | ||||
| #include <unordered_map> | |||||
| extern "C" { | extern "C" { | ||||
| #include "DNA_customdata_types.h" | #include "DNA_customdata_types.h" | ||||
| #include "DNA_meshdata_types.h" | #include "DNA_meshdata_types.h" | ||||
| #include "BLI_math_base.h" | #include "BLI_math_base.h" | ||||
| #include "BKE_customdata.h" | #include "BKE_customdata.h" | ||||
| } | } | ||||
| Show All 9 Lines | |||||
| using Alembic::Abc::C4fArraySample; | using Alembic::Abc::C4fArraySample; | ||||
| using Alembic::Abc::UInt32ArraySample; | using Alembic::Abc::UInt32ArraySample; | ||||
| using Alembic::Abc::V2fArraySample; | using Alembic::Abc::V2fArraySample; | ||||
| using Alembic::AbcGeom::OV2fGeomParam; | using Alembic::AbcGeom::OV2fGeomParam; | ||||
| using Alembic::AbcGeom::OC4fGeomParam; | using Alembic::AbcGeom::OC4fGeomParam; | ||||
| static inline uint64_t uv_to_hash_key(Imath::V2f v) | |||||
| { | |||||
| /* Convert -0.0f to 0.0f, so bitwise comparison works. */ | |||||
| if (v.x == 0.0f) { | |||||
| v.x = 0.0f; | |||||
| } | |||||
| if (v.y == 0.0f) { | |||||
| v.y = 0.0f; | |||||
| } | |||||
| /* Pack floats in 64bit. */ | |||||
| union { | |||||
| float xy[2]; | |||||
| uint64_t key; | |||||
| } tmp; | |||||
| tmp.xy[0] = v.x; | |||||
| tmp.xy[1] = v.y; | |||||
| return tmp.key; | |||||
| } | |||||
| static void get_uvs(const CDStreamConfig &config, | static void get_uvs(const CDStreamConfig &config, | ||||
| std::vector<Imath::V2f> &uvs, | std::vector<Imath::V2f> &uvs, | ||||
| std::vector<uint32_t> &uvidx, | std::vector<uint32_t> &uvidx, | ||||
| void *cd_data) | void *cd_data) | ||||
| { | { | ||||
| MLoopUV *mloopuv_array = static_cast<MLoopUV *>(cd_data); | MLoopUV *mloopuv_array = static_cast<MLoopUV *>(cd_data); | ||||
| if (!mloopuv_array) { | if (!mloopuv_array) { | ||||
| Show All 17 Lines | for (int i = 0; i < num_poly; ++i) { | ||||
| uvidx[cnt] = cnt; | uvidx[cnt] = cnt; | ||||
| uvs[cnt][0] = loopuvpoly->uv[0]; | uvs[cnt][0] = loopuvpoly->uv[0]; | ||||
| uvs[cnt][1] = loopuvpoly->uv[1]; | uvs[cnt][1] = loopuvpoly->uv[1]; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| std::unordered_map<uint64_t, int> idx_map; | |||||
| int idx_count = 0; | |||||
| for (int i = 0; i < num_poly; ++i) { | for (int i = 0; i < num_poly; ++i) { | ||||
| MPoly ¤t_poly = polygons[i]; | MPoly ¤t_poly = polygons[i]; | ||||
| MLoopUV *loopuvpoly = mloopuv_array + current_poly.loopstart + current_poly.totloop; | MLoopUV *loopuvpoly = mloopuv_array + current_poly.loopstart + current_poly.totloop; | ||||
| for (int j = 0; j < current_poly.totloop; ++j) { | for (int j = 0; j < current_poly.totloop; ++j) { | ||||
| loopuvpoly--; | loopuvpoly--; | ||||
| Imath::V2f uv(loopuvpoly->uv[0], loopuvpoly->uv[1]); | Imath::V2f uv(loopuvpoly->uv[0], loopuvpoly->uv[1]); | ||||
| uint64_t k = uv_to_hash_key(uv); | |||||
| std::vector<Imath::V2f>::iterator it = std::find(uvs.begin(), uvs.end(), uv); | std::unordered_map<uint64_t, int>::iterator it = idx_map.find(k); | ||||
| if (it == idx_map.end()) { | |||||
| if (it == uvs.end()) { | idx_map[k] = idx_count; | ||||
| uvidx.push_back(uvs.size()); | |||||
| uvs.push_back(uv); | uvs.push_back(uv); | ||||
| uvidx.push_back(idx_count++); | |||||
| } | } | ||||
| else { | else { | ||||
| uvidx.push_back(std::distance(uvs.begin(), it)); | uvidx.push_back(it->second); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| const char *get_uv_sample(UVSample &sample, const CDStreamConfig &config, CustomData *data) | const char *get_uv_sample(UVSample &sample, const CDStreamConfig &config, CustomData *data) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 339 Lines • Show Last 20 Lines | |||||