Search in sources :

Example 1 with BoundEffect

use of com.talosvfx.talos.editor.addons.bvb.BoundEffect in project talos by rockbite.

the class BVBSkeletonRenderer method draw.

/**
 * Renders the specified skeleton, including meshes, but without two color tinting.
 * <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, PolygonSpriteBatch batch, SkeletonContainer skeletonContainer, Skeleton skeleton) {
    if (batch == null)
        throw new IllegalArgumentException("batch cannot be null.");
    if (skeleton == null)
        throw new IllegalArgumentException("skeleton cannot be null.");
    Vector2 tempPosition = this.temp, tempUV = this.temp2;
    Color tempLight1 = this.temp3, tempDark1 = this.temp4;
    Color tempLight2 = this.temp5, tempDark2 = this.temp6;
    com.esotericsoftware.spine.SkeletonRenderer.VertexEffect vertexEffect = this.vertexEffect;
    if (vertexEffect != null)
        vertexEffect.begin(skeleton);
    boolean pmaColors = this.pmaColors, pmaBlendModes = this.pmaBlendModes;
    BlendMode blendMode = null;
    int verticesLength = 0;
    float[] vertices = null, uvs = null;
    short[] triangles = null;
    Color color = null, 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;
        }
        BoundEffect boundEffect = skeletonContainer.findEffect(skeleton, slot);
        if (boundEffect != null && boundEffect.isNested() && boundEffect.isBehind()) {
            for (ParticleEffectInstance particleEffectInstance : boundEffect.getParticleEffects()) {
                particleRenderer.render(particleEffectInstance);
            }
        }
        Texture texture = null;
        int vertexSize = clipper.isClipping() ? 2 : 5;
        Attachment attachment = slot.attachment;
        if (attachment instanceof RegionAttachment) {
            RegionAttachment region = (RegionAttachment) attachment;
            verticesLength = vertexSize << 2;
            vertices = this.vertices.items;
            region.computeWorldVertices(slot.getBone(), vertices, 0, vertexSize);
            triangles = quadTriangles;
            texture = region.getRegion().getTexture();
            uvs = region.getUVs();
            color = region.getColor();
        } else if (attachment instanceof MeshAttachment) {
            MeshAttachment mesh = (MeshAttachment) attachment;
            int count = mesh.getWorldVerticesLength();
            verticesLength = (count >> 1) * vertexSize;
            vertices = this.vertices.setSize(verticesLength);
            mesh.computeWorldVertices(slot, 0, count, vertices, 0, vertexSize);
            triangles = mesh.getTriangles();
            texture = mesh.getRegion().getTexture();
            uvs = mesh.getUVs();
            color = mesh.getColor();
        } else if (attachment instanceof ClippingAttachment) {
            ClippingAttachment clip = (ClippingAttachment) attachment;
            clipper.clipStart(slot, clip);
            continue;
        } else if (attachment instanceof SkeletonAttachment) {
            Skeleton attachmentSkeleton = ((SkeletonAttachment) attachment).getSkeleton();
            if (attachmentSkeleton != null)
                draw(particleRenderer, batch, skeletonContainer, attachmentSkeleton);
        }
        if (texture != null) {
            Color 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));
            if (clipper.isClipping()) {
                clipper.clipTriangles(vertices, verticesLength, triangles, triangles.length, uvs, c, 0, false);
                FloatArray clippedVertices = clipper.getClippedVertices();
                ShortArray clippedTriangles = clipper.getClippedTriangles();
                if (vertexEffect != null)
                    applyVertexEffect(clippedVertices.items, clippedVertices.size, 5, c, 0);
                batch.draw(texture, clippedVertices.items, 0, clippedVertices.size, clippedTriangles.items, 0, clippedTriangles.size);
            } else {
                if (vertexEffect != null) {
                    tempLight1.set(NumberUtils.floatToIntColor(c));
                    tempDark1.set(0);
                    for (int v = 0, u = 0; v < verticesLength; v += 5, u += 2) {
                        tempPosition.x = vertices[v];
                        tempPosition.y = vertices[v + 1];
                        tempLight2.set(tempLight1);
                        tempDark2.set(tempDark1);
                        tempUV.x = uvs[u];
                        tempUV.y = uvs[u + 1];
                        vertexEffect.transform(tempPosition, tempUV, tempLight2, tempDark2);
                        vertices[v] = tempPosition.x;
                        vertices[v + 1] = tempPosition.y;
                        vertices[v + 2] = tempLight2.toFloatBits();
                        vertices[v + 3] = tempUV.x;
                        vertices[v + 4] = tempUV.y;
                    }
                } else {
                    for (int v = 2, u = 0; v < verticesLength; v += 5, u += 2) {
                        vertices[v] = c;
                        vertices[v + 1] = uvs[u];
                        vertices[v + 2] = uvs[u + 1];
                    }
                }
                batch.draw(texture, vertices, 0, verticesLength, triangles, 0, triangles.length);
            }
        }
        clipper.clipEnd(slot);
        if (boundEffect != null && boundEffect.isNested() && !boundEffect.isBehind()) {
            for (ParticleEffectInstance particleEffectInstance : boundEffect.getParticleEffects()) {
                particleRenderer.render(particleEffectInstance);
            }
        }
    }
    clipper.clipEnd();
    if (vertexEffect != null)
        vertexEffect.end();
}
Also used : 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) Texture(com.badlogic.gdx.graphics.Texture) RegionAttachment(com.esotericsoftware.spine.attachments.RegionAttachment) Skeleton(com.esotericsoftware.spine.Skeleton) ShortArray(com.badlogic.gdx.utils.ShortArray) BoundEffect(com.talosvfx.talos.editor.addons.bvb.BoundEffect) Color(com.badlogic.gdx.graphics.Color) BlendMode(com.esotericsoftware.spine.BlendMode) SkeletonAttachment(com.esotericsoftware.spine.attachments.SkeletonAttachment) ParticleEffectInstance(com.talosvfx.talos.runtime.ParticleEffectInstance) FloatArray(com.badlogic.gdx.utils.FloatArray) Vector2(com.badlogic.gdx.math.Vector2) MeshAttachment(com.esotericsoftware.spine.attachments.MeshAttachment) ClippingAttachment(com.esotericsoftware.spine.attachments.ClippingAttachment) Slot(com.esotericsoftware.spine.Slot)

Aggregations

Color (com.badlogic.gdx.graphics.Color)1 Texture (com.badlogic.gdx.graphics.Texture)1 Vector2 (com.badlogic.gdx.math.Vector2)1 FloatArray (com.badlogic.gdx.utils.FloatArray)1 ShortArray (com.badlogic.gdx.utils.ShortArray)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 BoundEffect (com.talosvfx.talos.editor.addons.bvb.BoundEffect)1 ParticleEffectInstance (com.talosvfx.talos.runtime.ParticleEffectInstance)1