Blender V4.3
jitter_2d.c
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10#include "MEM_guardedalloc.h"
11#include <math.h>
12#include <string.h>
13
14#include "BLI_jitter_2d.h"
15#include "BLI_rand.h"
16
17#include "BLI_strict_flags.h" /* Keep last. */
18
19void BLI_jitterate1(float (*jit1)[2], float (*jit2)[2], int num, float radius1)
20{
21 int i, j, k;
22 float vecx, vecy, dvecx, dvecy, x, y, len;
23
24 for (i = num - 1; i >= 0; i--) {
25 dvecx = dvecy = 0.0;
26 x = jit1[i][0];
27 y = jit1[i][1];
28 for (j = num - 1; j >= 0; j--) {
29 if (i != j) {
30 vecx = jit1[j][0] - x - 1.0f;
31 vecy = jit1[j][1] - y - 1.0f;
32 for (k = 3; k > 0; k--) {
33 if (fabsf(vecx) < radius1 && fabsf(vecy) < radius1) {
34 len = sqrtf(vecx * vecx + vecy * vecy);
35 if (len > 0 && len < radius1) {
36 len = len / radius1;
37 dvecx += vecx / len;
38 dvecy += vecy / len;
39 }
40 }
41 vecx += 1.0f;
42
43 if (fabsf(vecx) < radius1 && fabsf(vecy) < radius1) {
44 len = sqrtf(vecx * vecx + vecy * vecy);
45 if (len > 0 && len < radius1) {
46 len = len / radius1;
47 dvecx += vecx / len;
48 dvecy += vecy / len;
49 }
50 }
51 vecx += 1.0f;
52
53 if (fabsf(vecx) < radius1 && fabsf(vecy) < radius1) {
54 len = sqrtf(vecx * vecx + vecy * vecy);
55 if (len > 0 && len < radius1) {
56 len = len / radius1;
57 dvecx += vecx / len;
58 dvecy += vecy / len;
59 }
60 }
61 vecx -= 2.0f;
62 vecy += 1.0f;
63 }
64 }
65 }
66
67 x -= dvecx / 18.0f;
68 y -= dvecy / 18.0f;
69 x -= floorf(x);
70 y -= floorf(y);
71 jit2[i][0] = x;
72 jit2[i][1] = y;
73 }
74 memcpy(jit1, jit2, 2 * (uint)num * sizeof(float));
75}
76
77void BLI_jitterate2(float (*jit1)[2], float (*jit2)[2], int num, float radius2)
78{
79 int i, j;
80 float vecx, vecy, dvecx, dvecy, x, y;
81
82 for (i = num - 1; i >= 0; i--) {
83 dvecx = dvecy = 0.0;
84 x = jit1[i][0];
85 y = jit1[i][1];
86 for (j = num - 1; j >= 0; j--) {
87 if (i != j) {
88 vecx = jit1[j][0] - x - 1.0f;
89 vecy = jit1[j][1] - y - 1.0f;
90
91 if (fabsf(vecx) < radius2) {
92 dvecx += vecx * radius2;
93 }
94 vecx += 1.0f;
95 if (fabsf(vecx) < radius2) {
96 dvecx += vecx * radius2;
97 }
98 vecx += 1.0f;
99 if (fabsf(vecx) < radius2) {
100 dvecx += vecx * radius2;
101 }
102
103 if (fabsf(vecy) < radius2) {
104 dvecy += vecy * radius2;
105 }
106 vecy += 1.0f;
107 if (fabsf(vecy) < radius2) {
108 dvecy += vecy * radius2;
109 }
110 vecy += 1.0f;
111 if (fabsf(vecy) < radius2) {
112 dvecy += vecy * radius2;
113 }
114 }
115 }
116
117 x -= dvecx / 2.0f;
118 y -= dvecy / 2.0f;
119 x -= floorf(x);
120 y -= floorf(y);
121 jit2[i][0] = x;
122 jit2[i][1] = y;
123 }
124 memcpy(jit1, jit2, (uint)num * sizeof(float[2]));
125}
126
127void BLI_jitter_init(float (*jitarr)[2], int num)
128{
129 float(*jit2)[2];
130 float number_fl, number_fl_sqrt;
131 float x, rad1, rad2, rad3;
132 RNG *rng;
133 int i;
134
135 if (num == 0) {
136 return;
137 }
138
139 number_fl = (float)num;
140 number_fl_sqrt = sqrtf(number_fl);
141
142 jit2 = MEM_mallocN(12 + (uint)num * sizeof(float[2]), "initjit");
143 rad1 = 1.0f / number_fl_sqrt;
144 rad2 = 1.0f / number_fl;
145 rad3 = number_fl_sqrt / number_fl;
146
147 rng = BLI_rng_new(31415926 + (uint)num);
148
149 x = 0;
150 for (i = 0; i < num; i++) {
151 jitarr[i][0] = x + rad1 * (float)(0.5 - BLI_rng_get_double(rng));
152 jitarr[i][1] = (float)i / number_fl + rad1 * (float)(0.5 - BLI_rng_get_double(rng));
153 x += rad3;
154 x -= floorf(x);
155 }
156
157 BLI_rng_free(rng);
158
159 for (i = 0; i < 24; i++) {
160 BLI_jitterate1(jitarr, jit2, num, rad1);
161 BLI_jitterate1(jitarr, jit2, num, rad1);
162 BLI_jitterate2(jitarr, jit2, num, rad2);
163 }
164
165 MEM_freeN(jit2);
166
167 /* Finally, move jitter to be centered around (0, 0). */
168 for (i = 0; i < num; i++) {
169 jitarr[i][0] -= 0.5f;
170 jitarr[i][1] -= 0.5f;
171 }
172}
Random number functions.
struct RNG * BLI_rng_new(unsigned int seed)
Definition rand.cc:39
void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1)
Definition rand.cc:58
double BLI_rng_get_double(struct RNG *rng) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition rand.cc:88
unsigned int uint
Read Guarded memory(de)allocation.
#define floorf(x)
#define fabsf(x)
#define sqrtf(x)
int len
draw_view in_light_buf[] float
void BLI_jitterate1(float(*jit1)[2], float(*jit2)[2], int num, float radius1)
Definition jitter_2d.c:19
void BLI_jitter_init(float(*jitarr)[2], int num)
Definition jitter_2d.c:127
void BLI_jitterate2(float(*jit1)[2], float(*jit2)[2], int num, float radius2)
Definition jitter_2d.c:77
void *(* MEM_mallocN)(size_t len, const char *str)
Definition mallocn.cc:44
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
Definition rand.cc:33