Blender V4.3
CCGSubSurf_inline.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#pragma once
10
11#include <math.h>
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
18{
19 BLI_assert(level > 0);
20 BLI_assert(level <= CCGSUBSURF_LEVEL_MAX + 1);
21 return (1 << (level - 1)) + 1;
22}
23
25{
26 BLI_assert(level > 0);
27 BLI_assert(level <= CCGSUBSURF_LEVEL_MAX + 1);
28 return 1 + (1 << level);
29}
30
31BLI_INLINE int ccg_spacing(int high_level, int low_level)
32{
33 BLI_assert(high_level > 0 && low_level > 0);
34 BLI_assert(high_level >= low_level);
35 BLI_assert((high_level - low_level) <= CCGSUBSURF_LEVEL_MAX);
36 return 1 << (high_level - low_level);
37}
38
40{
41 BLI_assert(level > 0);
42 BLI_assert(level <= CCGSUBSURF_LEVEL_MAX + 1);
43 return level + (1 << level) - 1;
44}
45
46/* **** */
47
49{
50 return (byte *)(&(v)[1]);
51}
52
54{
55 return (byte *)(&(e)[1]);
56}
57
59{
60 return (CCGVert **)(&f[1]);
61}
62
64{
65 return (CCGEdge **)(&(FACE_getVerts(f)[f->numVerts]));
66}
67
69{
70 return (byte *)(&(FACE_getEdges(f)[(f)->numVerts]));
71}
72
73/* **** */
74
75BLI_INLINE void *ccg_vert_getCo(CCGVert *v, int lvl, int dataSize)
76{
77 return &VERT_getLevelData(v)[lvl * dataSize];
78}
79
80BLI_INLINE float *ccg_vert_getNo(CCGVert *v, int lvl, int dataSize, int normalDataOffset)
81{
82 return (float *)&VERT_getLevelData(v)[lvl * dataSize + normalDataOffset];
83}
84
85BLI_INLINE void *ccg_edge_getCo(CCGEdge *e, int lvl, int x, int dataSize)
86{
87 int levelBase = ccg_edgebase(lvl);
88 return &EDGE_getLevelData(e)[dataSize * (levelBase + x)];
89}
90
91BLI_INLINE float *ccg_edge_getNo(CCGEdge *e, int lvl, int x, int dataSize, int normalDataOffset)
92{
93 int levelBase = ccg_edgebase(lvl);
94 return (float *)&EDGE_getLevelData(e)[dataSize * (levelBase + x) + normalDataOffset];
95}
96
97BLI_INLINE void *ccg_face_getIECo(CCGFace *f, int lvl, int S, int x, int levels, int dataSize)
98{
99 int maxGridSize = ccg_gridsize(levels);
100 int spacing = ccg_spacing(levels, lvl);
101 byte *gridBase = FACE_getCenterData(f) +
102 dataSize * (1 + S * (maxGridSize + maxGridSize * maxGridSize));
103 return &gridBase[dataSize * x * spacing];
104}
105
107 CCGFace *f, int lvl, int S, int x, int levels, int dataSize, int normalDataOffset)
108{
109 int maxGridSize = ccg_gridsize(levels);
110 int spacing = ccg_spacing(levels, lvl);
111 byte *gridBase = FACE_getCenterData(f) +
112 dataSize * (1 + S * (maxGridSize + maxGridSize * maxGridSize));
113 return &gridBase[dataSize * x * spacing + normalDataOffset];
114}
115
117 CCGFace *f, int lvl, int S, int x, int y, int levels, int dataSize)
118{
119 int maxGridSize = ccg_gridsize(levels);
120 int spacing = ccg_spacing(levels, lvl);
121 byte *gridBase = FACE_getCenterData(f) +
122 dataSize * (1 + S * (maxGridSize + maxGridSize * maxGridSize));
123 return &gridBase[dataSize * (maxGridSize + (y * maxGridSize + x) * spacing)];
124}
125
127 CCGFace *f, int lvl, int S, int x, int y, int levels, int dataSize, int normalDataOffset)
128{
129 int maxGridSize = ccg_gridsize(levels);
130 int spacing = ccg_spacing(levels, lvl);
131 byte *gridBase = FACE_getCenterData(f) +
132 dataSize * (1 + S * (maxGridSize + maxGridSize * maxGridSize));
133 return (float *)&gridBase[dataSize * (maxGridSize + (y * maxGridSize + x) * spacing) +
134 normalDataOffset];
135}
136
138{
139 for (int i = 0; i < f->numVerts; i++) {
140 if (FACE_getVerts(f)[i] == v) {
141 return i;
142 }
143 }
144 return -1;
145}
146
148{
149 for (int i = 0; i < f->numVerts; i++) {
150 if (FACE_getEdges(f)[i] == e) {
151 return i;
152 }
153 }
154 return -1;
155}
156
158 CCGFace *f, CCGEdge *e, int f_ed_idx, int lvl, int eX, int eY, int levels, int dataSize)
159{
160 int maxGridSize = ccg_gridsize(levels);
161 int spacing = ccg_spacing(levels, lvl);
162 int x, y, cx, cy;
163
164 BLI_assert(f_ed_idx == ccg_face_getEdgeIndex(f, e));
165
166 eX = eX * spacing;
167 eY = eY * spacing;
168 if (e->v0 != FACE_getVerts(f)[f_ed_idx]) {
169 eX = (maxGridSize * 2 - 1) - 1 - eX;
170 }
171 y = maxGridSize - 1 - eX;
172 x = maxGridSize - 1 - eY;
173 if (x < 0) {
174 f_ed_idx = (f_ed_idx + f->numVerts - 1) % f->numVerts;
175 cx = y;
176 cy = -x;
177 }
178 else if (y < 0) {
179 f_ed_idx = (f_ed_idx + 1) % f->numVerts;
180 cx = -y;
181 cy = x;
182 }
183 else {
184 cx = x;
185 cy = y;
186 }
187 return ccg_face_getIFCo(f, levels, f_ed_idx, cx, cy, levels, dataSize);
188}
189
190BLI_INLINE void Normalize(float no[3])
191{
192 const float length = sqrtf(no[0] * no[0] + no[1] * no[1] + no[2] * no[2]);
193
194 if (length > EPSILON) {
195 const float length_inv = 1.0f / length;
196
197 no[0] *= length_inv;
198 no[1] *= length_inv;
199 no[2] *= length_inv;
200 }
201 else {
202 NormZero(no);
203 }
204}
205
206/* Data layers mathematics. */
207
208BLI_INLINE bool VertDataEqual(const float a[], const float b[], const CCGSubSurf *ss)
209{
210 for (int i = 0; i < ss->meshIFC.numLayers; i++) {
211 if (a[i] != b[i]) {
212 return false;
213 }
214 }
215 return true;
216}
217
218BLI_INLINE void VertDataZero(float v[], const CCGSubSurf *ss)
219{
220 memset(v, 0, sizeof(float) * ss->meshIFC.numLayers);
221}
222
223BLI_INLINE void VertDataCopy(float dst[], const float src[], const CCGSubSurf *ss)
224{
225 for (int i = 0; i < ss->meshIFC.numLayers; i++) {
226 dst[i] = src[i];
227 }
228}
229
230BLI_INLINE void VertDataAdd(float a[], const float b[], const CCGSubSurf *ss)
231{
232 for (int i = 0; i < ss->meshIFC.numLayers; i++) {
233 a[i] += b[i];
234 }
235}
236
237BLI_INLINE void VertDataSub(float a[], const float b[], const CCGSubSurf *ss)
238{
239 for (int i = 0; i < ss->meshIFC.numLayers; i++) {
240 a[i] -= b[i];
241 }
242}
243
244BLI_INLINE void VertDataMulN(float v[], float f, const CCGSubSurf *ss)
245{
246 for (int i = 0; i < ss->meshIFC.numLayers; i++) {
247 v[i] *= f;
248 }
249}
250
252 const float a[],
253 const float b[],
254 const float c[],
255 const float d[],
256 const CCGSubSurf *ss)
257{
258 for (int i = 0; i < ss->meshIFC.numLayers; i++) {
259 v[i] = (a[i] + b[i] + c[i] + d[i]) * 0.25f;
260 }
261}
262
263#ifdef __cplusplus
264}
265#endif
#define BLI_assert(a)
Definition BLI_assert.h:50
#define BLI_INLINE
BLI_INLINE int ccg_edgesize(int level)
BLI_INLINE void Normalize(float no[3])
BLI_INLINE CCGVert ** FACE_getVerts(CCGFace *f)
BLI_INLINE float * ccg_edge_getNo(CCGEdge *e, int lvl, int x, int dataSize, int normalDataOffset)
BLI_INLINE int ccg_gridsize(int level)
BLI_INLINE void * ccg_face_getIECo(CCGFace *f, int lvl, int S, int x, int levels, int dataSize)
BLI_INLINE byte * EDGE_getLevelData(CCGEdge *e)
BLI_INLINE void VertDataZero(float v[], const CCGSubSurf *ss)
BLI_INLINE float * ccg_vert_getNo(CCGVert *v, int lvl, int dataSize, int normalDataOffset)
BLI_INLINE CCGEdge ** FACE_getEdges(CCGFace *f)
BLI_INLINE bool VertDataEqual(const float a[], const float b[], const CCGSubSurf *ss)
BLI_INLINE int ccg_edgebase(int level)
BLI_INLINE int ccg_face_getEdgeIndex(CCGFace *f, CCGEdge *e)
BLI_INLINE void * ccg_face_getIFCo(CCGFace *f, int lvl, int S, int x, int y, int levels, int dataSize)
BLI_INLINE int ccg_spacing(int high_level, int low_level)
BLI_INLINE void VertDataSub(float a[], const float b[], const CCGSubSurf *ss)
BLI_INLINE void VertDataCopy(float dst[], const float src[], const CCGSubSurf *ss)
BLI_INLINE void * ccg_vert_getCo(CCGVert *v, int lvl, int dataSize)
BLI_INLINE void * ccg_face_getIENo(CCGFace *f, int lvl, int S, int x, int levels, int dataSize, int normalDataOffset)
BLI_INLINE int ccg_face_getVertIndex(CCGFace *f, CCGVert *v)
BLI_INLINE float * ccg_face_getIFNo(CCGFace *f, int lvl, int S, int x, int y, int levels, int dataSize, int normalDataOffset)
BLI_INLINE void VertDataMulN(float v[], float f, const CCGSubSurf *ss)
BLI_INLINE void VertDataAvg4(float v[], const float a[], const float b[], const float c[], const float d[], const CCGSubSurf *ss)
BLI_INLINE void * ccg_edge_getCo(CCGEdge *e, int lvl, int x, int dataSize)
BLI_INLINE void VertDataAdd(float a[], const float b[], const CCGSubSurf *ss)
BLI_INLINE void * ccg_face_getIFCoEdge(CCGFace *f, CCGEdge *e, int f_ed_idx, int lvl, int eX, int eY, int levels, int dataSize)
BLI_INLINE byte * FACE_getCenterData(CCGFace *f)
BLI_INLINE byte * VERT_getLevelData(CCGVert *v)
#define EPSILON
#define NormZero(av)
#define CCGSUBSURF_LEVEL_MAX
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
Definition btVector3.h:257
local_group_size(16, 16) .push_constant(Type b
#define sqrtf(x)
int numLayers
Definition CCGSubSurf.h:27
CCGMeshIFC meshIFC