/** Copy all the color attributes from 'src' vertex to 'dst' vertex */
-static INLINE void copy_colors( struct draw_stage *stage,
- struct vertex_header *dst,
+static INLINE void copy_colors( struct draw_stage *stage,
+ struct vertex_header *dst,
const struct vertex_header *src )
{
const struct flat_stage *flat = flat_stage(stage);
uint i;
+ for (i = 0; i < flat->num_color_attribs; i++) {
+ const uint attr = flat->color_attribs[i];
+ COPY_4FV(dst->data[attr], src->data[attr]);
+ }
+}
- /* Look for constant/flat attribs and duplicate from src to dst vertex */
- /* skip attrib[0] which is vert pos */
+
+/** Copy all the color attributes from src vertex to dst0 & dst1 vertices */
+static INLINE void copy_colors2( struct draw_stage *stage,
+ struct vertex_header *dst0,
+ struct vertex_header *dst1,
+ const struct vertex_header *src )
+{
+ const struct flat_stage *flat = flat_stage(stage);
+ uint i;
for (i = 0; i < flat->num_color_attribs; i++) {
const uint attr = flat->color_attribs[i];
- memcpy(dst->data[attr], src->data[attr], sizeof(src->data[0]));
+ COPY_4FV(dst0->data[attr], src->data[attr]);
+ COPY_4FV(dst1->data[attr], src->data[attr]);
}
}
tmp.v[1] = dup_vert(stage, header->v[1], 1);
tmp.v[2] = header->v[2];
- copy_colors(stage, tmp.v[0], tmp.v[2]);
- copy_colors(stage, tmp.v[1], tmp.v[2]);
+ copy_colors2(stage, tmp.v[0], tmp.v[1], tmp.v[2]);
stage->next->tri( stage->next, &tmp );
}
}
}
+ if (!twoside->attrib_back0)
+ twoside->attrib_front0 = 0;
+
+ if (!twoside->attrib_back1)
+ twoside->attrib_front1 = 0;
+
/*
* We'll multiply the primitive's determinant by this sign to determine
* if the triangle is back-facing (negative).
}
-static INLINE void copy_attrib( unsigned attr_dst,
- unsigned attr_src,
- struct vertex_header *v )
-{
- COPY_4FV(v->data[attr_dst], v->data[attr_src]);
-}
-
-
/**
* Copy back color(s) to front color(s).
*/
-static struct vertex_header *copy_bfc( struct twoside_stage *twoside,
- const struct vertex_header *v,
- unsigned idx )
+static INLINE struct vertex_header *
+copy_bfc( struct twoside_stage *twoside,
+ const struct vertex_header *v,
+ unsigned idx )
{
struct vertex_header *tmp = dup_vert( &twoside->stage, v, idx );
- if (twoside->attrib_front0 && twoside->attrib_back0) {
- copy_attrib(twoside->attrib_front0, twoside->attrib_back0, tmp);
+ if (twoside->attrib_back0) {
+ COPY_4FV(tmp->data[twoside->attrib_front0],
+ tmp->data[twoside->attrib_back0]);
}
- if (twoside->attrib_front1 && twoside->attrib_back1) {
- copy_attrib(twoside->attrib_front1, twoside->attrib_back1, tmp);
+ if (twoside->attrib_back1) {
+ COPY_4FV(tmp->data[twoside->attrib_front1],
+ tmp->data[twoside->attrib_back1]);
}
return tmp;