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();
}
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());
}
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;
}
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();
}
}
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);
}
}
}
Aggregations