Search in sources :

Example 6 with ParticleEffectInstance

use of com.talosvfx.talos.runtime.ParticleEffectInstance 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)

Example 7 with ParticleEffectInstance

use of com.talosvfx.talos.runtime.ParticleEffectInstance in project talos by rockbite.

the class PreviewWidget method act.

@Override
public void act(float delta) {
    super.act(delta);
    // stupid hack, plz do it normal way
    if (PreviewWidget.this.hasScrollFocus() && Gdx.input.isKeyJustPressed(Input.Keys.ENTER)) {
        resetCamera();
    }
    long timeBefore = TimeUtils.nanoTime();
    final ParticleEffectInstance particleEffect = TalosMain.Instance().TalosProject().getParticleEffect();
    particleEffect.update(Gdx.graphics.getDeltaTime());
    cpuTime.put(TimeUtils.timeSinceNanos(timeBefore));
    stringBuilder.clear();
    stringBuilder.append(countStr).append(particleEffect.getParticleCount());
    countLbl.setText(stringBuilder.toString());
    stringBuilder.clear();
    stringBuilder.append(trisCountStr).append(trisCount);
    trisCountLbl.setText(stringBuilder.toString());
    stringBuilder.clear();
    stringBuilder.append(nodeCallsStr).append(particleEffect.getNodeCalls());
    nodeCallsLbl.setText(stringBuilder.toString());
    float rt = renderTime.value / 1000000f;
    float cp = cpuTime.value / 1000000f;
    rt = (float) Math.round(rt * 10000f) / 10000f;
    cp = (float) Math.round(cp * 10000f) / 10000f;
    stringBuilder.clear();
    stringBuilder.append(gpuTimeStr).append(rt).append(msStr);
    gpuTimeLbl.setText(stringBuilder.toString());
    stringBuilder.clear();
    stringBuilder.append(cpuTimeStr).append(cp).append(msStr);
    cpuTimeLbl.setText(stringBuilder.toString());
}
Also used : ParticleEffectInstance(com.talosvfx.talos.runtime.ParticleEffectInstance)

Example 8 with ParticleEffectInstance

use of com.talosvfx.talos.runtime.ParticleEffectInstance in project talos by rockbite.

the class TalosProject method cleanData.

private void cleanData() {
    TalosMain.Instance().UIStage().PreviewWidget().resetToDefaults();
    TalosMain.Instance().NodeStage().moduleBoardWidget.clearAll();
    activeWrappers.clear();
    particleEffectDescriptor = new ParticleEffectDescriptor();
    particleEffectDescriptor.setAssetProvider(projectAssetProvider);
    particleEffect = new ParticleEffectInstance(particleEffectDescriptor);
    particleEffect.setScope(TalosMain.Instance().globalScope);
    particleEffect.loopable = true;
}
Also used : ParticleEffectInstance(com.talosvfx.talos.runtime.ParticleEffectInstance) ParticleEffectDescriptor(com.talosvfx.talos.runtime.ParticleEffectDescriptor)

Example 9 with ParticleEffectInstance

use of com.talosvfx.talos.runtime.ParticleEffectInstance in project talos by rockbite.

the class MetaData method write.

@Override
public void write(Json json) {
    json.writeArrayStart("scopeDefaults");
    for (int i = 0; i < 10; i++) {
        NumericalValue val = TalosMain.Instance().globalScope.getDynamicValue(i);
        float[] arr = new float[4];
        for (int j = 0; j < 4; j++) {
            arr[j] = val.get(j);
        }
        json.writeValue(arr);
    }
    json.writeArrayEnd();
    // now sync preview widget stuff
    float camX = TalosMain.Instance().UIStage().PreviewWidget().getCameraPosX();
    float camY = TalosMain.Instance().UIStage().PreviewWidget().getCameraPosY();
    json.writeValue("previewCamPos", new Vector2(camX, camY));
    json.writeValue("previewCamZoom", TalosMain.Instance().UIStage().PreviewWidget().getCameraZoom());
    json.writeValue("bgImagePath", TalosMain.Instance().UIStage().PreviewWidget().getBackgroundImagePath());
    json.writeValue("isGridVisible", TalosMain.Instance().UIStage().PreviewWidget().isGridVisible());
    json.writeValue("bgImageIsInBack", TalosMain.Instance().UIStage().PreviewWidget().isBackgroundImageInBack());
    json.writeValue("bgImageSize", TalosMain.Instance().UIStage().PreviewWidget().getBgImageSize());
    json.writeValue("gridSize", TalosMain.Instance().UIStage().PreviewWidget().getGridSize());
    // particle position
    ParticleEffectInstance particleEffect = TalosMain.Instance().TalosProject().getParticleEffect();
    if (particleEffect != null) {
        json.writeValue("particlePositionX", particleEffect.getPosition().x);
        json.writeValue("particlePositionY", particleEffect.getPosition().y);
    }
    final ObjectMap<FileHandle, FileTracker.FileEntry> currentTabFiles = TalosMain.Instance().FileTracker().getCurrentTabFiles();
    if (currentTabFiles != null) {
        json.writeArrayStart("resourcePaths");
        for (ObjectMap.Entry<FileHandle, FileTracker.FileEntry> currentTabFile : currentTabFiles) {
            json.writeValue(currentTabFile.key.path());
        }
        json.writeArrayEnd();
    }
}
Also used : ParticleEffectInstance(com.talosvfx.talos.runtime.ParticleEffectInstance) Vector2(com.badlogic.gdx.math.Vector2) ObjectMap(com.badlogic.gdx.utils.ObjectMap) NumericalValue(com.talosvfx.talos.runtime.values.NumericalValue) FileHandle(com.badlogic.gdx.files.FileHandle)

Example 10 with ParticleEffectInstance

use of com.talosvfx.talos.runtime.ParticleEffectInstance in project talos by rockbite.

the class MetaData method read.

@Override
public void read(Json json, JsonValue jsonData) {
    JsonValue arr = jsonData.get("scopeDefaults");
    int iter = 0;
    for (JsonValue item : arr) {
        NumericalValue val = new NumericalValue();
        val.set(item.get(0).asFloat(), item.get(1).asFloat(), item.get(2).asFloat(), item.get(3).asFloat());
        TalosMain.Instance().globalScope.setDynamicValue(iter++, val);
    }
    // preview widget stuff
    if (jsonData.has("previewCamPos")) {
        JsonValue camPos = jsonData.get("previewCamPos");
        TalosMain.Instance().UIStage().PreviewWidget().setCameraPos(camPos.getFloat("x", 0), camPos.getFloat("y", 0));
    } else {
        TalosMain.Instance().UIStage().PreviewWidget().setCameraPos(0, 0);
    }
    TalosMain.Instance().UIStage().PreviewWidget().setBackgroundImage(jsonData.getString("bgImagePath", null));
    TalosMain.Instance().UIStage().PreviewWidget().setGridVisible(jsonData.getBoolean("isGridVisible", true));
    TalosMain.Instance().UIStage().PreviewWidget().setImageIsBackground(jsonData.getBoolean("bgImageIsInBack", true));
    TalosMain.Instance().UIStage().PreviewWidget().setBgImageSize(jsonData.getFloat("bgImageSize", 10));
    TalosMain.Instance().UIStage().PreviewWidget().setGridSize(jsonData.getFloat("gridSize", 1));
    TalosMain.Instance().UIStage().PreviewWidget().setCameraZoom(jsonData.getFloat("previewCamZoom", 1.4285715f));
    // particle position
    ParticleEffectInstance particleEffect = TalosMain.Instance().TalosProject().getParticleEffect();
    if (particleEffect != null) {
        float pPosX = jsonData.getFloat("particlePositionX", 0);
        float pPosY = jsonData.getFloat("particlePositionY", 0);
        particleEffect.setPosition(pPosX, pPosY);
    }
    JsonValue resourcePaths = jsonData.get("resourcePaths");
    if (resourcePaths != null) {
        iter = 0;
        for (JsonValue item : resourcePaths) {
            final String filePath = item.asString();
            resourcePathStrings.add(filePath);
        }
    }
}
Also used : ParticleEffectInstance(com.talosvfx.talos.runtime.ParticleEffectInstance) NumericalValue(com.talosvfx.talos.runtime.values.NumericalValue) JsonValue(com.badlogic.gdx.utils.JsonValue)

Aggregations

ParticleEffectInstance (com.talosvfx.talos.runtime.ParticleEffectInstance)15 Vector2 (com.badlogic.gdx.math.Vector2)3 Color (com.badlogic.gdx.graphics.Color)2 Slot (com.esotericsoftware.spine.Slot)2 NumericalValue (com.talosvfx.talos.runtime.values.NumericalValue)2 FileHandle (com.badlogic.gdx.files.FileHandle)1 Texture (com.badlogic.gdx.graphics.Texture)1 FloatArray (com.badlogic.gdx.utils.FloatArray)1 JsonValue (com.badlogic.gdx.utils.JsonValue)1 ObjectMap (com.badlogic.gdx.utils.ObjectMap)1 ShortArray (com.badlogic.gdx.utils.ShortArray)1 BlendMode (com.esotericsoftware.spine.BlendMode)1 Bone (com.esotericsoftware.spine.Bone)1 Skeleton (com.esotericsoftware.spine.Skeleton)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