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