|
1 | 1 | #ifndef SIM_PBF_UTILS_H |
2 | 2 | #define SIM_PBF_UTILS_H |
3 | 3 |
|
4 | | -#include "data.h" |
5 | 4 | #include <GU/GU_Detail.h> |
6 | 5 |
|
7 | | -namespace HinaPE_PBF |
8 | | -{ |
9 | | -template<typename T, typename Prim> |
10 | | -struct ArrayHandle |
| 6 | +#include <numeric> |
| 7 | + |
| 8 | +using real = float; |
| 9 | +using sz = int32; |
| 10 | + |
| 11 | +template<typename SRC> |
| 12 | +struct UT_Vector3TArrayHandle |
11 | 13 | { |
12 | | - ArrayHandle(T *_internal) : internal(_internal) {} |
13 | | - ~ArrayHandle() = default; |
| 14 | + explicit UT_Vector3TArrayHandle(SRC *_internal, std::function<sz(sz)> &&ito = [](sz i) { return i; }) |
| 15 | + : internal(_internal), index_to_offset(std::move(ito)) {} |
| 16 | + virtual ~UT_Vector3TArrayHandle() = default; |
14 | 17 |
|
15 | | - virtual Prim get(int off) const = 0; |
16 | | - virtual void set(int off, Prim p) = 0; |
| 18 | + virtual UT_Vector3T<real> geti(int idx) const { return geto(index_to_offset(idx)); } |
| 19 | + virtual void seti(int idx, UT_Vector3T<real> p) { seto(index_to_offset(idx), p); } |
17 | 20 |
|
18 | | - T *internal; |
| 21 | + virtual UT_Vector3T<real> geto(int off) const = 0; |
| 22 | + virtual void seto(int off, UT_Vector3T<real> p) = 0; |
| 23 | + |
| 24 | + std::function<sz(sz)> index_to_offset; |
| 25 | + |
| 26 | +protected: |
| 27 | + SRC *internal; |
19 | 28 | }; |
20 | 29 |
|
21 | | -template<typename T, typename Prim> |
22 | | -struct ConstArrayHandle |
| 30 | +template<typename SRC> |
| 31 | +struct MultipleUT_Vector3TArrayHandle |
23 | 32 | { |
24 | | - ConstArrayHandle(ArrayHandle<T, Prim> *_internal) : internal(_internal) {} |
25 | | - ~ConstArrayHandle() = default; |
| 33 | + explicit MultipleUT_Vector3TArrayHandle(std::vector<std::pair<UT_Vector3TArrayHandle<SRC> *, sz>> *InArrays) |
| 34 | + : Arrays(InArrays) {} |
| 35 | + ~MultipleUT_Vector3TArrayHandle() = default; |
26 | 36 |
|
27 | | - Prim get(int off) const { return internal->get(off); } |
| 37 | + virtual UT_Vector3T<real> geti(int idx) const |
| 38 | + { |
| 39 | + int sum = 0; |
| 40 | + int last_sum = 0; |
| 41 | + int iter = -1; |
| 42 | + while (sum <= idx) |
| 43 | + { |
| 44 | + iter++; |
| 45 | + last_sum = sum; |
| 46 | + sum += (*Arrays)[iter].second; |
| 47 | + } |
| 48 | + if (iter >= Arrays->size() || iter < 0) |
| 49 | + return UT_Vector3T<real>(); |
| 50 | + int real_idx = idx - last_sum; |
| 51 | + return (*Arrays)[iter].first->geti(real_idx); |
| 52 | + } |
| 53 | + virtual void seti(int idx, UT_Vector3T<real> p) |
| 54 | + { |
| 55 | + int sum = 0; |
| 56 | + int last_sum = 0; |
| 57 | + int iter = -1; |
| 58 | + while (sum <= idx) |
| 59 | + { |
| 60 | + iter++; |
| 61 | + last_sum = sum; |
| 62 | + sum += (*Arrays)[iter].second; |
| 63 | + } |
| 64 | + if (iter >= Arrays->size() || iter < 0) |
| 65 | + return; |
| 66 | + int real_idx = idx - last_sum; |
| 67 | + (*Arrays)[iter].first->seti(real_idx, p); |
| 68 | + } |
| 69 | + virtual sz value_size() |
| 70 | + { |
| 71 | + return std::accumulate(Arrays->begin(), Arrays->end(), 0, [](sz acc, const std::pair<UT_Vector3TArrayHandle<SRC> *, sz> &p) |
| 72 | + { |
| 73 | + return acc + p.second; |
| 74 | + }); |
| 75 | + } |
| 76 | + sz size() |
| 77 | + { |
| 78 | + return Arrays->size(); |
| 79 | + } |
28 | 80 |
|
29 | | - ArrayHandle<T, Prim> *internal; |
| 81 | +protected: |
| 82 | + std::vector<std::pair<UT_Vector3TArrayHandle<SRC> *, sz>> *Arrays; |
30 | 83 | }; |
31 | 84 |
|
32 | | -struct NativeVector3Handle : public ArrayHandle<std::vector<real>, UT_Vector3T<real>> |
| 85 | +struct NativeArrayHandle : public UT_Vector3TArrayHandle<std::vector<real>> |
33 | 86 | { |
34 | | - NativeVector3Handle(std::vector<real> *_internal) : ArrayHandle(_internal) {} |
35 | | - ~NativeVector3Handle() = default; |
| 87 | + NativeArrayHandle(std::vector<real> *_internal) : UT_Vector3TArrayHandle(_internal) {} |
| 88 | + ~NativeArrayHandle() override = default; |
36 | 89 |
|
37 | | - UT_Vector3T<real> get(int off) const override { return UT_Vector3T<real>(internal->data() + off * 3); } |
38 | | - void set(int off, UT_Vector3T<real> p) override { memcpy(internal->data() + off * 3, p.data(), sizeof(real) * 3); } |
| 90 | + UT_Vector3T<real> geto(int off) const override { return UT_Vector3T<real>(internal->data() + off * 3); } |
| 91 | + void seto(int off, UT_Vector3T<real> p) override { memcpy(internal->data() + off * 3, p.data(), sizeof(real) * 3); } |
39 | 92 | }; |
40 | 93 |
|
41 | | -struct GDPVector3Handle : public ArrayHandle<GU_Detail, UT_Vector3T<real>> |
| 94 | +struct GA_ArrayHandle : public UT_Vector3TArrayHandle<GA_RWHandleT<UT_Vector3T<real>>> |
42 | 95 | { |
43 | | - GDPVector3Handle(GU_Detail *gdp) : ArrayHandle(gdp) {} |
44 | | - ~GDPVector3Handle() = default; |
| 96 | + GA_ArrayHandle(GA_RWHandleT<UT_Vector3T<real>> *handle) : UT_Vector3TArrayHandle(handle) {} |
| 97 | + ~GA_ArrayHandle() override = default; |
45 | 98 |
|
46 | | - UT_Vector3T<real> get(int off) const override { return internal->getPos3(off); } |
47 | | - void set(int off, UT_Vector3T<real> p) override { internal->setPos3(off, p); } |
| 99 | + UT_Vector3T<real> geto(int off) const override { return internal->get(off); } |
| 100 | + void seto(int off, UT_Vector3T<real> p) override { internal->set(off, p); } |
48 | 101 | }; |
49 | | -} |
50 | | - |
51 | | -void SyncParticlePositionFromGDP(HinaPE_PBF::PBF_DATA &data, const GU_Detail &gdp); |
52 | | -void SyncGDPFromParticlePosition(GU_Detail &gdp, const HinaPE_PBF::PBF_DATA &data); |
53 | 102 |
|
54 | 103 | #endif //SIM_PBF_UTILS_H |
0 commit comments