Hmmm.. I'm setting skeleton x and y to the centre of the screen. I tried Bone_setYDown and it does exactly the same as setting FlipY - it makes it disappear.
I suspect it has a lot to do with my complete non-understanding of this 3d thingy... 🙂
void spSkeleton_draw ( spSkeleton* self )
{
CIwTexture* texture = NULL ;
vertexArray.clear();
vertexUVArray.clear();
vertexColorArray.clear();
quads.clear();
for (int i = 0, n = self->slotCount; i < n; i++) {
spSlot* slot = static_cast<spSlot*>(self->drawOrder[i]);
if (!slot->attachment || slot->attachment->type != ATTACHMENT_REGION)
continue;
spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
texture = spRegionAttachment_getTextureAtlas(attachment);
Quad* quad = IW_GX_ALLOC( Quad, 1 );
spRegionAttachment_updateQuad(attachment, slot, quad, false );
quads.push_back(quad);
}
if ( texture == NULL )
return;
int num_quads = quads.size();
int num_vertices = num_quads * 4 ;
CIwFVec2 *uvs = IW_GX_ALLOC(CIwFVec2, num_vertices) ;
CIwFVec2 *verts = IW_GX_ALLOC(CIwFVec2, num_vertices);
CIwColour *colors = IW_GX_ALLOC(CIwColour, num_vertices);
for (int i = 0, d=0; i < num_quads; ++i)
{
Quad* q = quads[i];
uvs[d]=q->tl.texCoords;
verts[d]=q->tl.vertices;
colors[d]=q->tl.colors;
d++;
uvs[d]=q->tr.texCoords;
verts[d]=q->tr.vertices;
colors[d]=q->tr.colors;
d++;
uvs[d]=q->br.texCoords;
verts[d]=q->br.vertices;
colors[d]=q->br.colors;
d++;
uvs[d]=q->bl.texCoords;
verts[d]=q->bl.vertices;
colors[d]=q->bl.colors;
d++;
}
CIwMaterial* mat = IW_GX_ALLOC_MATERIAL();
mat->SetTexture(texture);
mat->SetDepthWriteMode(CIwMaterial::DEPTH_WRITE_DISABLED);
mat->SetAlphaMode(CIwMaterial::ALPHA_BLEND);
IwGxSetMaterial(mat);
IwGxSetUVStream(uvs);
IwGxSetVertStreamScreenSpace(verts, num_vertices);
IwGxSetColStream(colors, num_vertices);
IwGxSetNormStream(NULL);
IwGxDrawPrims(IW_GX_QUAD_LIST, NULL, num_vertices);
}
void spRegionAttachment_updateQuad (spRegionAttachment* self, spSlot* slot, Quad* quad, bool premultipliedAlpha )
{
float vertices[8];
spRegionAttachment_computeWorldVertices(self, slot->skeleton->x, slot->skeleton->y, slot->bone, vertices);
GLubyte r = slot->skeleton->r * slot->r * 255;
GLubyte g = slot->skeleton->g * slot->g * 255;
GLubyte b = slot->skeleton->b * slot->b * 255;
float normalizedAlpha = slot->skeleton->a * slot->a;
if (premultipliedAlpha) {
r *= normalizedAlpha;
g *= normalizedAlpha;
b *= normalizedAlpha;
}
GLubyte a = normalizedAlpha * 255;
quad->bl.colors.r = r;
quad->bl.colors.g = g;
quad->bl.colors.b = b;
quad->bl.colors.a = a;
quad->tl.colors.r = r;
quad->tl.colors.g = g;
quad->tl.colors.b = b;
quad->tl.colors.a = a;
quad->tr.colors.r = r;
quad->tr.colors.g = g;
quad->tr.colors.b = b;
quad->tr.colors.a = a;
quad->br.colors.r = r;
quad->br.colors.g = g;
quad->br.colors.b = b;
quad->br.colors.a = a;
quad->bl.vertices.x = vertices[VERTEX_X1];
quad->bl.vertices.y = vertices[VERTEX_Y1];
quad->tl.vertices.x = vertices[VERTEX_X2];
quad->tl.vertices.y = vertices[VERTEX_Y2];
quad->tr.vertices.x = vertices[VERTEX_X3];
quad->tr.vertices.y = vertices[VERTEX_Y3];
quad->br.vertices.x = vertices[VERTEX_X4];
quad->br.vertices.y = vertices[VERTEX_Y4];
quad->bl.texCoords.x = self->uvs[VERTEX_X1];
quad->bl.texCoords.y = self->uvs[VERTEX_Y1];
quad->tl.texCoords.x = self->uvs[VERTEX_X2];
quad->tl.texCoords.y = self->uvs[VERTEX_Y2];
quad->tr.texCoords.x = self->uvs[VERTEX_X3];
quad->tr.texCoords.y = self->uvs[VERTEX_Y3];
quad->br.texCoords.x = self->uvs[VERTEX_X4];
quad->br.texCoords.y = self->uvs[VERTEX_Y4];
}