Blender V4.3
lineart_util.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2019 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <cstdio>
10#include <cstdlib>
11/* #include <time.h> */
12
13#include <cmath>
14
15#include "MEM_guardedalloc.h"
16
17#include "BLI_math_matrix.h"
18
19#include "MOD_lineart.hh"
20
21#include "lineart_intern.hh"
22
23/* Line art memory and list helper */
24
26{
27 LinkData *lip;
28 if (h == nullptr) {
29 return nullptr;
30 }
31 lip = static_cast<LinkData *>(lineart_mem_acquire(smp, sizeof(LinkData)));
32 lip->data = data;
33 BLI_addtail(h, lip);
34 return lip;
35}
38 void *data,
39 int size)
40{
41 LinkData *lip;
42 if (h == nullptr) {
43 return nullptr;
44 }
45 lip = static_cast<LinkData *>(lineart_mem_acquire(smp, size));
46 lip->data = data;
47 BLI_addtail(h, lip);
48 return lip;
49}
51{
52 LinkData *lip;
53 if (h == nullptr) {
54 return nullptr;
55 }
56 lip = static_cast<LinkData *>(lineart_mem_acquire_thread(smp, sizeof(LinkData)));
57 lip->data = data;
58 BLI_addtail(h, lip);
59 return lip;
60}
63 void *data,
64 int size)
65{
66 LinkData *lip;
67 if (h == nullptr) {
68 return nullptr;
69 }
70 lip = static_cast<LinkData *>(lineart_mem_acquire_thread(smp, size));
71 lip->data = data;
72 BLI_addtail(h, lip);
73 return lip;
74}
75
77{
78 LinkData *lip;
79 void *rev = nullptr;
80 if (h == nullptr) {
81 return nullptr;
82 }
83 lip = static_cast<LinkData *>(BLI_pophead(h));
84 rev = lip ? lip->data : nullptr;
85 return rev;
86}
88{
89 BLI_remlink(h, (void *)lip);
90}
91
93{
94 size_t set_size = size;
95 if (set_size < LRT_MEMORY_POOL_1MB) {
96 set_size = LRT_MEMORY_POOL_1MB; /* Prevent too many small allocations. */
97 }
98 size_t total_size = set_size + sizeof(LineartStaticMemPoolNode);
100 MEM_callocN(total_size, "mempool"));
101 smpn->size = total_size;
102 smpn->used_byte = sizeof(LineartStaticMemPoolNode);
103 BLI_addhead(&smp->pools, smpn);
104 return smpn;
105}
107{
109 void *ret;
110
111 if (!smpn || (smpn->used_byte + size) > smpn->size) {
112 smpn = lineart_mem_new_static_pool(smp, size);
113 }
114
115 ret = ((uchar *)smpn) + smpn->used_byte;
116
117 smpn->used_byte += size;
118
119 return ret;
120}
122{
123 void *ret;
124
125 BLI_spin_lock(&smp->lock_mem);
126
128
129 if (!smpn || (smpn->used_byte + size) > smpn->size) {
130 smpn = lineart_mem_new_static_pool(smp, size);
131 }
132
133 ret = ((uchar *)smpn) + smpn->used_byte;
134
135 smpn->used_byte += size;
136
138
139 return ret;
140}
142{
143 while (LineartStaticMemPoolNode *smpn = static_cast<LineartStaticMemPoolNode *>(
144 BLI_pophead(&smp->pools)))
145 {
146 MEM_freeN(smpn);
147 }
148}
149
151{
152 LinkNode *ln = static_cast<LinkNode *>(lineart_mem_acquire_thread(smp, sizeof(LinkNode)));
153 ln->next = (*first);
154 ln->link = link;
155 (*first) = ln;
156}
157
158/* =======================================================================[str] */
159
161 double (*mProjection)[4], double fFov_rad, double fAspect, double zMin, double zMax)
162{
163 double yMax;
164 double yMin;
165 double xMin;
166 double xMax;
167
168 if (fAspect < 1) {
169 yMax = zMin * tan(fFov_rad * 0.5f);
170 yMin = -yMax;
171 xMin = yMin * fAspect;
172 xMax = -xMin;
173 }
174 else {
175 xMax = zMin * tan(fFov_rad * 0.5f);
176 xMin = -xMax;
177 yMin = xMin / fAspect;
178 yMax = -yMin;
179 }
180
181 unit_m4_db(mProjection);
182
183 mProjection[0][0] = (2.0f * zMin) / (xMax - xMin);
184 mProjection[1][1] = (2.0f * zMin) / (yMax - yMin);
185 mProjection[2][0] = (xMax + xMin) / (xMax - xMin);
186 mProjection[2][1] = (yMax + yMin) / (yMax - yMin);
187 mProjection[2][2] = -((zMax + zMin) / (zMax - zMin));
188 mProjection[2][3] = -1.0f;
189 mProjection[3][2] = -((2.0f * (zMax * zMin)) / (zMax - zMin));
190 mProjection[3][3] = 0.0f;
191}
192void lineart_matrix_ortho_44d(double (*mProjection)[4],
193 double xMin,
194 double xMax,
195 double yMin,
196 double yMax,
197 double zMin,
198 double zMax)
199{
200 unit_m4_db(mProjection);
201
202 mProjection[0][0] = 2.0f / (xMax - xMin);
203 mProjection[1][1] = 2.0f / (yMax - yMin);
204 mProjection[2][2] = -2.0f / (zMax - zMin);
205 mProjection[3][0] = -((xMax + xMin) / (xMax - xMin));
206 mProjection[3][1] = -((yMax + yMin) / (yMax - yMin));
207 mProjection[3][2] = -((zMax + zMin) / (zMax - zMin));
208 mProjection[3][3] = 1.0f;
209}
210
212{
213 size_t total = 0;
214 size_t sum_this = 0;
215 size_t count_this = 0;
216
218 count_this++;
219 sum_this += LRT_MEMORY_POOL_1MB;
220 }
221 printf("LANPR Memory allocated %zu Standalone nodes, total %zu Bytes.\n", count_this, sum_this);
222 total += sum_this;
223 sum_this = 0;
224 count_this = 0;
225
227 count_this++;
228 sum_this += reln->element_count * sizeof(LineartEdge);
229 }
230 printf(" allocated %zu edge blocks, total %zu Bytes.\n", count_this, sum_this);
231 total += sum_this;
232 sum_this = 0;
233 count_this = 0;
234
236 count_this++;
237 sum_this += reln->element_count * ld->sizeof_triangle;
238 }
239 printf(" allocated %zu triangle blocks, total %zu Bytes.\n", count_this, sum_this);
240 total += sum_this;
241 sum_this = 0;
242 count_this = 0;
243
244 (void)total; /* Ignored. */
245}
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:90
#define LISTBASE_FOREACH(type, var, list)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:130
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:251
void unit_m4_db(double m[4][4])
unsigned char uchar
void BLI_spin_unlock(SpinLock *spin)
Definition threads.cc:430
void BLI_spin_lock(SpinLock *spin)
Definition threads.cc:405
Read Guarded memory(de)allocation.
struct LineartEdge LineartEdge
struct LineartStaticMemPoolNode LineartStaticMemPoolNode
#define LRT_MEMORY_POOL_1MB
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
#define printf
LineartStaticMemPoolNode * lineart_mem_new_static_pool(LineartStaticMemPool *smp, size_t size)
void * lineart_list_append_pointer_pool_thread(ListBase *h, LineartStaticMemPool *smp, void *data)
void lineart_prepend_pool(LinkNode **first, LineartStaticMemPool *smp, void *link)
void lineart_count_and_print_render_buffer_memory(LineartData *ld)
void lineart_matrix_perspective_44d(double(*mProjection)[4], double fFov_rad, double fAspect, double zMin, double zMax)
void * lineart_mem_acquire(LineartStaticMemPool *smp, size_t size)
void * lineart_list_append_pointer_pool(ListBase *h, LineartStaticMemPool *smp, void *data)
void * lineart_list_pop_pointer_no_free(ListBase *h)
void lineart_list_remove_pointer_item_no_free(ListBase *h, LinkData *lip)
void * lineart_list_append_pointer_pool_sized(ListBase *h, LineartStaticMemPool *smp, void *data, int size)
void * lineart_mem_acquire_thread(LineartStaticMemPool *smp, size_t size)
void lineart_mem_destroy(LineartStaticMemPool *smp)
void * lineart_list_append_pointer_pool_sized_thread(ListBase *h, LineartStaticMemPool *smp, void *data, int size)
void lineart_matrix_ortho_44d(double(*mProjection)[4], double xMin, double xMax, double yMin, double yMax, double zMin, double zMax)
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
return ret
ListBase line_buffer_pointers
ListBase triangle_buffer_pointers
LineartStaticMemPool render_data_pool
struct LineartData::_geom geom
void * data
void * link
struct LinkNode * next
void * first