27# pragma GCC diagnostic ignored "-Wdouble-promotion"
34 memset(zspan, 0,
sizeof(
ZSpan));
39 zspan->
span1 =
static_cast<float *
>(
MEM_mallocN(recty *
sizeof(
float),
"zspan"));
40 zspan->
span2 =
static_cast<float *
>(
MEM_mallocN(recty *
sizeof(
float),
"zspan"));
61 const float *minv, *maxv;
78 if (my2 < 0 || my0 >= zspan->
recty) {
83 if (my2 >= zspan->
recty) {
84 my2 = zspan->
recty - 1;
96 xx1 = maxv[1] - minv[1];
97 if (xx1 > FLT_EPSILON) {
98 dx0 = (minv[0] - maxv[0]) / xx1;
99 xs0 = dx0 * (minv[1] - my2) + minv[0];
103 xs0 =
min_ff(minv[0], maxv[0]);
107 if (zspan->
maxp1 ==
nullptr) {
111 if (maxv == zspan->
minp1 || minv == zspan->
maxp1) {
119 if (span == zspan->
span1) {
121 if (zspan->
minp1 ==
nullptr || zspan->
minp1[1] > minv[1]) {
124 if (zspan->
maxp1 ==
nullptr || zspan->
maxp1[1] < maxv[1]) {
127 if (my0 < zspan->miny1) {
130 if (my2 > zspan->
maxy1) {
136 if (zspan->
minp2 ==
nullptr || zspan->
minp2[1] > minv[1]) {
139 if (zspan->
maxp2 ==
nullptr || zspan->
maxp2[1] < maxv[1]) {
142 if (my0 < zspan->miny2) {
145 if (my2 > zspan->
maxy2) {
150 for (
y = my2;
y >= my0;
y--, xs0 += dx0) {
165 void (*func)(
void *,
int,
int,
float,
float))
167 float x0, y0, x1, y1, x2, y2, z0, z1, z2;
168 float u,
v, uxd, uyd, vxd, vyd, uy0, vy0, xx1;
169 const float *span1, *span2;
170 int i, j,
x,
y, sn1, sn2, rectx = zspan->
rectx, my0, my2;
181 if (zspan->
minp2 ==
nullptr || zspan->
maxp2 ==
nullptr) {
202 x0 = y1 * z2 - z1 * y2;
203 y0 = z1 * x2 - x1 * z2;
204 z0 = x1 * y2 - y1 * x2;
210 xx1 = (x0 * v1[0] + y0 * v1[1]) / z0 + 1.0f;
218 x0 = y1 * z2 - z1 * y2;
219 y0 = z1 * x2 - x1 * z2;
221 xx1 = (x0 * v1[0] + y0 * v1[1]) / z0;
227 span1 = zspan->
span1 + my2;
228 span2 = zspan->
span2 + my2;
230 for (i = 0,
y = my2;
y >= my0; i++,
y--, span1--, span2--) {
243 u = ((
double(sn1) * uxd) + uy0) - (i * uyd);
244 v = ((
double(sn1) * vxd) + vy0) - (i * vyd);
246 for (j = 0,
x = sn1;
x <= sn2; j++,
x++) {
247 func(handle,
x,
y, u + (j * uxd),
v + (j * vxd));
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
typedef double(DMatrix)[4][4]
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
void *(* MEM_mallocN)(size_t len, const char *str)
ccl_device_inline float2 floor(const float2 a)
ccl_device_inline float3 ceil(const float3 a)
void zspan_scanconvert(ZSpan *zspan, void *handle, float *v1, float *v2, float *v3, void(*func)(void *, int, int, float, float))
static void zbuf_init_span(ZSpan *zspan)
void zbuf_alloc_span(ZSpan *zspan, int rectx, int recty)
void zbuf_free_span(ZSpan *zspan)
static void zbuf_add_to_span(ZSpan *zspan, const float v1[2], const float v2[2])