obj = data;
if (obj->delete_me) return EINA_FALSE;
+ if (obj->pre_render_done)
+ {
+ RD(" OBJ [%p] pending change %i -> 0, pre %i\n", obj, obj->changed, obj->pre_render_done);
obj->pre_render_done = 0;
-// if (!obj->layer)
- obj->changed = 0;
+//// FIXME: this wipes out changes
+ obj->changed = 0;
+ }
return obj->changed ? EINA_TRUE : EINA_FALSE;
}
return;
}
+ // set render_pre - for child objs that may not have gotten it.
+ obj->pre_render_done = 1;
+
if (_evas_render_has_map(obj))
{
const Evas_Map_Point *p, *p_end;
obj = eina_array_data_get(&e->active_objects, i);
obj->pre_render_done = 0;
+ RD(" OBJ [%p] post... %i %i\n", obj, obj->changed, do_draw);
if ((obj->changed) && (do_draw))
{
+ RD(" OBJ [%p] post... func1\n", obj);
obj->func->render_post(obj);
obj->restack = 0;
obj->changed = 0;
else if ((obj->cur.map != obj->prev.map) ||
(obj->cur.usemap != obj->prev.usemap))
{
+ RD(" OBJ [%p] post... func2\n", obj);
obj->func->render_post(obj);
obj->restack = 0;
obj->changed = 0;
struct _Span
{
int x1, x2;
- FPc o1, o2;
+ FPc o1, o2, z1, z2;
FPc u[2], v[2];
DATA32 col[2];
};
p -= x1;
u = u2 - u1;
u = (u * p) / (x2 + 1);
+ // FIXME: do z persp
return u1 + u;
}
x2 -= x1;
p -= x1;
p = (p << 8) / (x2 + 1);
+ // FIXME: do z persp
return INTERP_256(p, col2, col1);
}
s->col[0] = _interp_col(s->x1, s->x2, c1, s->col[0], s->col[1]);
s->x1 = c1;
s->o1 = c1 << FP;
+ // FIXME: do s->z1
}
if (s->x2 > c2)
{
s->col[1] = _interp_col(s->x1, s->x2, c2, s->col[0], s->col[1]);
s->x2 = c2;
s->o2 = c2 << FP;
+ // FIXME: do s->z2
}
}
}
return;
}
-
for (y = ystart; y <= yend; y++)
{
int nocol = 1;
t = (((y << FP) + (FP1 - 1)) - p[e1].y) >> FP;
x = p[e2].x - p[e1].x;
x = p[e1].x + ((x * t) / h);
+
+/*
+ // FIXME: 3d accuracy here
+ // XXX t needs adjusting. above its a linear interp point
+ // only.
+ //
+ // // FIXME: do in fixed pt. reduce divides
+ evas_common_cpu_end_opt();
+ //
+ int foc = 512, z0 = 0, px = 320, py = 240; // FIXME: need from map points
+ //
+ float focf, hf;
+ float z1, z2, y1, y2, dz, dy, zt, dydz, yt;
+
+ focf = foc;
+ hf = h;
+
+ // adjust for fixed point and focal length and z0 for map
+ z1 = (p[e1].z >> FP) - z0 + foc;
+ z2 = (p[e2].z >> FP) - z0 + foc;
+ // deltas
+ dz = z1 - z2;
+ if (dz != 0)
+ {
+ int pt;
+
+ // adjust for perspective point (being 0 0)
+ y1 = (p[e1].y >> FP) - py;
+ y2 = (p[e2].y >> FP) - py;
+
+ // correct for x &y not being in world coords - screen coords
+ y1 = (y1 * z1) / focf;
+ y2 = (y2 * z2) / focf;
+
+ // deltas
+ dy = y1 - y2;
+
+ yt = y - py;
+ dydz = dy / dz;
+
+ zt = (y2 - (dydz * z2)) / ((yt / focf) - dydz);
+
+ pt = t;
+ t = ((z1 - zt) * hf) / dz;
+ }
+ */
u = p[e2].u - p[e1].u;
u = p[e1].u + ((u * t) / h);
v = p[e2].v - p[e1].v;
v = p[e1].v + ((v * t) / h);
-
+
+ // FIXME: 3d accuracy for color too
t256 = (t << 8) / h; // maybe * 255?
col[i] = INTERP_256(t256, p[e2].col, p[e1].col);
+ // FIXME: store z persp
uv[i][1] = v;
uv[i][0] = u;
edge[i][2] = x >> FP;