Search in sources :

Example 1 with TwoColorPolygonBatch

use of com.esotericsoftware.spine.utils.TwoColorPolygonBatch in project talos by rockbite.

the class BVBSkeletonRenderer method draw.

/**
 * Renders the specified skeleton. If the batch is a PolygonSpriteBatch, {@link #draw(SpriteBatchParticleRenderer, PolygonSpriteBatch, SkeletonContainer, Skeleton)} is
 * called. If the batch is a TwoColorPolygonBatch, {@link #draw(SpriteBatchParticleRenderer, TwoColorPolygonBatch, SkeletonContainer, Skeleton)} is called. Otherwise the
 * skeleton is rendered without two color tinting and any mesh attachments will throw an exception.
 * <p>
 * This method may change the batch's {@link Batch#setBlendFunctionSeparate(int, int, int, int) blending function}. The
 * previous blend function is not restored, since that could result in unnecessary flushes, depending on what is rendered
 * next.
 */
public void draw(SpriteBatchParticleRenderer particleRenderer, Batch batch, SkeletonContainer skeletonContainer, Skeleton skeleton) {
    if (batch instanceof TwoColorPolygonBatch) {
        draw(particleRenderer, (TwoColorPolygonBatch) batch, skeletonContainer, skeleton);
        return;
    }
    if (batch instanceof PolygonSpriteBatch) {
        draw(particleRenderer, (PolygonSpriteBatch) batch, skeletonContainer, skeleton);
        return;
    }
    if (batch == null)
        throw new IllegalArgumentException("batch cannot be null.");
    if (skeletonContainer == null)
        throw new IllegalArgumentException("skeleton cannot be null.");
    com.esotericsoftware.spine.SkeletonRenderer.VertexEffect vertexEffect = this.vertexEffect;
    if (vertexEffect != null)
        vertexEffect.begin(skeleton);
    boolean pmaColors = this.pmaColors, pmaBlendModes = this.pmaBlendModes;
    BlendMode blendMode = null;
    float[] vertices = this.vertices.items;
    Color skeletonColor = skeleton.color;
    float r = skeletonColor.r, g = skeletonColor.g, b = skeletonColor.b, a = skeletonColor.a;
    Object[] drawOrder = skeleton.drawOrder.items;
    for (int i = 0, n = skeleton.drawOrder.size; i < n; i++) {
        Slot slot = (Slot) drawOrder[i];
        if (!slot.bone.active) {
            clipper.clipEnd(slot);
            continue;
        }
        Attachment attachment = slot.attachment;
        if (attachment instanceof RegionAttachment) {
            RegionAttachment region = (RegionAttachment) attachment;
            region.computeWorldVertices(slot.getBone(), vertices, 0, 5);
            Color color = region.getColor(), slotColor = slot.getColor();
            float alpha = a * slotColor.a * color.a * 255;
            float multiplier = pmaColors ? alpha : 255;
            BlendMode slotBlendMode = slot.data.getBlendMode();
            if (slotBlendMode != blendMode) {
                if (slotBlendMode == BlendMode.additive && pmaColors) {
                    slotBlendMode = BlendMode.normal;
                    alpha = 0;
                }
                blendMode = slotBlendMode;
                blendMode.apply(batch, pmaBlendModes);
            }
            float c = NumberUtils.intToFloatColor(// 
            (int) alpha << 24 | // 
            (int) (b * slotColor.b * color.b * multiplier) << 16 | // 
            (int) (g * slotColor.g * color.g * multiplier) << 8 | (int) (r * slotColor.r * color.r * multiplier));
            float[] uvs = region.getUVs();
            for (int u = 0, v = 2; u < 8; u += 2, v += 5) {
                vertices[v] = c;
                vertices[v + 1] = uvs[u];
                vertices[v + 2] = uvs[u + 1];
            }
            if (vertexEffect != null)
                applyVertexEffect(vertices, 20, 5, c, 0);
            batch.draw(region.getRegion().getTexture(), vertices, 0, 20);
        } else if (attachment instanceof ClippingAttachment) {
            clipper.clipStart(slot, (ClippingAttachment) attachment);
            continue;
        } else if (attachment instanceof MeshAttachment) {
            throw new RuntimeException(batch.getClass().getSimpleName() + " cannot render meshes, PolygonSpriteBatch or TwoColorPolygonBatch is required.");
        } else if (attachment instanceof SkeletonAttachment) {
            Skeleton attachmentSkeleton = ((SkeletonAttachment) attachment).getSkeleton();
            if (attachmentSkeleton != null) {
                // This is messed up
                draw(particleRenderer, batch, skeletonContainer, attachmentSkeleton);
            }
        }
        clipper.clipEnd(slot);
    }
    clipper.clipEnd();
    if (vertexEffect != null)
        vertexEffect.end();
}
Also used : BlendMode(com.esotericsoftware.spine.BlendMode) Color(com.badlogic.gdx.graphics.Color) Attachment(com.esotericsoftware.spine.attachments.Attachment) RegionAttachment(com.esotericsoftware.spine.attachments.RegionAttachment) MeshAttachment(com.esotericsoftware.spine.attachments.MeshAttachment) ClippingAttachment(com.esotericsoftware.spine.attachments.ClippingAttachment) SkeletonAttachment(com.esotericsoftware.spine.attachments.SkeletonAttachment) PolygonSpriteBatch(com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch) SkeletonAttachment(com.esotericsoftware.spine.attachments.SkeletonAttachment) RegionAttachment(com.esotericsoftware.spine.attachments.RegionAttachment) MeshAttachment(com.esotericsoftware.spine.attachments.MeshAttachment) ClippingAttachment(com.esotericsoftware.spine.attachments.ClippingAttachment) Slot(com.esotericsoftware.spine.Slot) Skeleton(com.esotericsoftware.spine.Skeleton) TwoColorPolygonBatch(com.esotericsoftware.spine.utils.TwoColorPolygonBatch)

Aggregations

Color (com.badlogic.gdx.graphics.Color)1 PolygonSpriteBatch (com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch)1 BlendMode (com.esotericsoftware.spine.BlendMode)1 Skeleton (com.esotericsoftware.spine.Skeleton)1 Slot (com.esotericsoftware.spine.Slot)1 Attachment (com.esotericsoftware.spine.attachments.Attachment)1 ClippingAttachment (com.esotericsoftware.spine.attachments.ClippingAttachment)1 MeshAttachment (com.esotericsoftware.spine.attachments.MeshAttachment)1 RegionAttachment (com.esotericsoftware.spine.attachments.RegionAttachment)1 SkeletonAttachment (com.esotericsoftware.spine.attachments.SkeletonAttachment)1 TwoColorPolygonBatch (com.esotericsoftware.spine.utils.TwoColorPolygonBatch)1