80 lines
2.4 KiB
C++
80 lines
2.4 KiB
C++
/* THIS FILE IS INCLUDED BY draw.c TO AVOID CODE DUPLICATION. IT'S AN UGLY HACK */
|
|
|
|
#define FUNC_NAME(mode) static void generateArraysFastPath##_##mode(SubmissionTarget* target, const GLsizei first, const GLuint count)
|
|
#define MAKE_FUNC(mode) FUNC_NAME(mode)
|
|
|
|
MAKE_FUNC(POLYMODE)
|
|
{
|
|
const Vertex* const start = _glSubmissionTargetStart(target);
|
|
const VertexExtra* const ve_start = aligned_vector_at(target->extras, 0);
|
|
|
|
const GLuint vstride = ATTRIB_POINTERS.vertex.stride;
|
|
GLuint uvstride = ATTRIB_POINTERS.uv.stride;
|
|
GLuint ststride = ATTRIB_POINTERS.st.stride;
|
|
GLuint dstride = ATTRIB_POINTERS.colour.stride;
|
|
GLuint nstride = ATTRIB_POINTERS.normal.stride;
|
|
|
|
const GLubyte* pos = (ENABLED_VERTEX_ATTRIBUTES & VERTEX_ENABLED_FLAG) ? ATTRIB_POINTERS.vertex.ptr + (first * vstride) : NULL;
|
|
const GLubyte* uv = (ENABLED_VERTEX_ATTRIBUTES & UV_ENABLED_FLAG) ? ATTRIB_POINTERS.uv.ptr + (first * uvstride) : NULL;
|
|
const GLubyte* col = (ENABLED_VERTEX_ATTRIBUTES & DIFFUSE_ENABLED_FLAG) ? ATTRIB_POINTERS.colour.ptr + (first * dstride) : NULL;
|
|
const GLubyte* st = (ENABLED_VERTEX_ATTRIBUTES & ST_ENABLED_FLAG) ? ATTRIB_POINTERS.st.ptr + (first * ststride) : NULL;
|
|
const GLubyte* n = (ENABLED_VERTEX_ATTRIBUTES & NORMAL_ENABLED_FLAG) ? ATTRIB_POINTERS.normal.ptr + (first * nstride) : NULL;
|
|
|
|
const float w = 1.0f;
|
|
|
|
if(!pos) {
|
|
/* If we don't have vertices, do nothing */
|
|
return;
|
|
}
|
|
|
|
if(!col) {
|
|
col = (GLubyte*) &U4ONE;
|
|
dstride = 0;
|
|
}
|
|
|
|
if(!uv) {
|
|
uv = (GLubyte*) &F2ZERO;
|
|
uvstride = 0;
|
|
}
|
|
|
|
if(!st) {
|
|
st = (GLubyte*) &F2ZERO;
|
|
ststride = 0;
|
|
}
|
|
|
|
if(!n) {
|
|
n = (GLubyte*) &F3Z;
|
|
nstride = 0;
|
|
}
|
|
|
|
VertexExtra* ve = (VertexExtra*) ve_start;
|
|
Vertex* it = (Vertex*) start;
|
|
|
|
for(int_fast32_t i = 0; i < count; ++i) {
|
|
TransformVertex((const float*) pos, &w, it->xyz, &it->w);
|
|
pos += vstride;
|
|
PREFETCH(pos);
|
|
|
|
*((Float2*) it->uv) = *((Float2*) uv);
|
|
uv += uvstride;
|
|
PREFETCH(uv);
|
|
|
|
*((uint32_t*) it->bgra) = *((uint32_t*) col);
|
|
col += dstride;
|
|
PREFETCH(col);
|
|
|
|
*((Float2*) ve->st) = *((Float2*) st);
|
|
st += ststride;
|
|
PREFETCH(st);
|
|
|
|
*((Float3*) ve->nxyz) = *((Float3*) n);
|
|
n += nstride;
|
|
PREFETCH(n);
|
|
|
|
PROCESS_VERTEX_FLAGS(it, i);
|
|
|
|
++it;
|
|
++ve;
|
|
}
|
|
}
|