Giter Club home page Giter Club logo

gdx-effekseer's Introduction

LibGDX + Effekseer

Dedicated library for using Effekseer particle tools in libGDX

Alt text

outras libs

LibGDX Water (in development) https://github.com/SrJohnathan/libgdx-water

https://effekseer.github.io/en/

https://libgdx.badlogicgames.com/

Supported platforms

Android, Windows and Linux

sourceCompatibility = 1.8

Core

Maven Central

api 'io.github.srjohnathan:gdx-effekseer:2.1'

Desktop

Maven Central

api 'io.github.srjohnathan:gdx-effekseer-desktop:2.1'

Android

Maven Central

natives 'io.github.srjohnathan:gdx-effekseer-android:2.1'

build.gradle :android

task copyEffekseerNatives {
    doFirst {
        configurations.natives.copy().files.each { jar ->
                                                        // 2.1-SNAPSHOT - version snapshot
            if (jar.name.endsWith("gdx-effekseer-android-2.2.1.jar")){

                zipTree(jar).files.each {file  ->
                    if( file.path.contains("arm64-v8a") ){
                        copy {
                            from file.path
                            into "${projectDir}/libs/arm64-v8a"
                            include "*.so"
                        }
                    }

                    if( file.path.contains("armeabi-v7a") ){
                        copy {
                            from file.path
                            into "${projectDir}/libs/armeabi-v7a"
                            include "*.so"
                        }
                    }
                    if( file.path.contains("x86") ){
                        copy {
                            from file.path
                            into "${projectDir}/libs/x86"
                            include "*.so"
                        }
                    }
                }
            }

        }
    }
}

run copyEffekseerNatives

Starting

3D Effects perspectiveCamera

// Effekseer start
EffekseerGdx.init()
        
AssetManager assetManager = new AssetManager(fileHandleResolver);

ModelBatch modelBatch = new ModelBatch();
RenderContext renderContext = modelBatch.getRenderContext();

// set Loader
assetManager.setLoader(EffekseerParticleSubAssetLoader.Result.class, null, new EffekseerParticleSubAssetLoader(fileHandleResolver));
assetManager.setLoader(EffekseerParticleAssetLoader.Result.class, null, new EffekseerParticleAssetLoader(fileHandleResolver));
    
PerspectiveCamera  perspectiveCamera = new PerspectiveCamera(67, 1280f, 720);

// Create a new manager for the particles
if (Gdx.app.type == Application.ApplicationType.Android) {
    manager = EffekseerManager(perspectiveCamera, EffekseerCore.TypeOpenGL.OPEN_GLES2, 600);
    --OR--
    manager = EffekseerManager(perspectiveCamera, EffekseerCore.TypeOpenGL.OPEN_GLES2, 600, renderContext);
}
else {
    manager = EffekseerManager(perspectiveCamera, EffekseerCore.TypeOpenGL.OPEN_GL2, 1000);
    --OR--
    manager = EffekseerManager(perspectiveCamera, EffekseerCore.TypeOpenGL.OPEN_GL2, 1000, renderContext);
}
// create a new particle
effekseer = new EffekseerParticle(manager);
effekseer.setMagnification(20f);
try {
    effekseer.syncLoad(assetManager, "data/tu.efk");
} catch (Exception e) {
    e.printStackTrace();
}

effekseer.play();

Loading Effects

effekseer = new EffekseerParticle(manager);

// Ideally use an AssetManager that implements DirectAssetAdder for faster loading such as the provided class: AssetManagerWithDirectAssetAdder
AssetManager assetManager = new AssetManagerWithDirectAssetAdder(fileHandleResolver);
-- OR --
AssetManager assetManager = new AssetManager(fileHandleResolver);

// Register the following asset loaders for the asset manager instance once before any loading is executed
assetManager.setLoader(EffekseerParticleSubAssetLoader.Result.class, null, new EffekseerParticleSubAssetLoader(fileHandleResolver));
assetManager.setLoader(EffekseerParticleAssetLoader.Result.class, null, new EffekseerParticleAssetLoader(fileHandleResolver));

// Pass in an instance of EffekseerIsMipMapEnabledDecider to override if an effect texture should use mimaps. By default all textures use mipmaps. 
new EffekseerParticleSubAssetLoader(fileHandleResolver, new EffekseerIsMipMapEnabledDecider() {
    @Override
    public void isMipMapEnabledForTextureFile() {
        ...
    }
});


// For immediate loading
effekseer.syncLoad(assetManager, "data/tu.efk", false);
// For asynchronous loading
effekseer.asyncLoad(assetManager, "data/tu.efk", false, new LoadedListener() {
    @Override
    public void onEffectLoaded() {
        ...
    }
});

Render function

@Override
public void render() {

    ...

    manager.draw(Gdx.graphics.getDeltaTime());
    --OR--
    manager.update(Gdx.graphics.getDeltaTime());
    
    // Can call this draw as many times as needed. For example one draw for post-processing and then the normal draw.
    manager.drawAfterUpdate();
} 

Dispose function

@Override
public void dispose() {
    // Dispose a single effect
    effekseerParticle.dispose();
    
    // Dispose entire manager
    manager.dispose();
} 

2D Effects orthographicCamera

  OrthographicCamera  orthographicCamera = new OrthographicCamera(1280f,720f);
  EffekseerManager  manager = new EffekseerManager(orthographicCamera);

Animation functions

effekseer = new EffekseerParticle(manager);


try {
    effekseer.syncLoad("data/ring.efk",true);
} catch (Exception e) {
    e.printStackTrace();
}

effekseer.play();

// Following is a subset of the methods in EffekseerParticle

effekseer.play();
effekseer.pause();
effekseer.resume();
effekseer.stop();
effekseer.setOnAnimationComplete();

effekseer.setTranslation();
effekseer.translate();
effekseer.setRotation();
effekseer.roatate();
effekseer.setScale();
effekseer.scale();
effekseer.getTransform(); // For direct access for transformation

effekseer.getNodeCount();
effekseer.getRootNode();


        
// The following are the supported node classes for accessing/modification.

EffekseerNode // The base node class for all node classes below
EffekseerNodeRoot // The root node of an effect
EffekseerNodeSprite
EffekseerNodeRibbon
EffekseerNodeTrack
EffekseerNodeRing
EffekseerNodeModel

paypal

Contributors:

License

gdx-effekseer's People

Contributors

niraj-rayalla avatar srjohnathan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

gdx-effekseer's Issues

Unable to Render Animations Made with Effekseer v1.62e

While I've been able to load and play animation files, I have been having trouble actually having the effects show up on my screen.

I had been testing out the library with a fresh libgdx project (version 1.10.0, desktop build, no other extensions/libraries added besides this project's libraries). I have tried tweaking around various parameters (i.e. using both an OrthographicCamera and a PerspectiveCamera, changing the TypeOpenGL core type, and applying transformations to the ParticleEffekseer). However, my program always only shows a black screen.

The effect files I have been using to test this were efk files built from the sample effects included with Effekseer 1.62.

I had tried logging the IsPlaing function on my Manager and I saw that the effect was indeed supposed to be playing, however.

If it helps, this is the code I am using for my helper class:

`

package com.mygdx.game;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.FrameBuffer;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import io.github.srjohnathan.gdx.effekseer.core.EffekseerGdx;
import io.github.srjohnathan.gdx.effekseer.core.EffekseerManager;
import io.github.srjohnathan.gdx.effekseer.core.ParticleEffekseer;

import java.util.HashMap;

import static io.github.srjohnathan.gdx.effekseer.core.EffekseerCore.TypeOpenGL.OPEN_GL2;
import static io.github.srjohnathan.gdx.effekseer.core.EffekseerCore.TypeOpenGL.OPEN_GL3;

public class EffekseerHelper {
public static OrthographicCamera Camera;
protected static EffekseerManager Manager;
protected static final HashMap<String, ParticleEffekseer> ParticleEffects = new HashMap<>();
protected static ParticleEffekseer Current;
protected static FrameBuffer Buffer;
protected static Vector2 DrawPos;

public static void Initialize() {
    EffekseerGdx.init();
    Camera = new OrthographicCamera(1280, 720);
    Manager = new EffekseerManager(Camera, OPEN_GL2);
    Buffer = new FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.getWidth() / 4, Gdx.graphics.getHeight() / 4, false, false);
}

public static boolean Play(String key, Vector2 position) {
    return Play(key, position, null, null, null);
}

public static boolean Play(String key, Vector2 position, Vector3 rotationAxis, Float rotationAngle, Float scale) {
    ParticleEffekseer e = Start(key);
    if (e != null) {
        e.setMagnification(20f);
        DrawPos = position;
        Current = e;
        return true;
    }
    return false;
}

public static void Render(SpriteBatch sb) {
    Manager.draw(Gdx.graphics.getDeltaTime());
}

public static void Reset() {
    Manager.dispose();
    Initialize();
}

protected static ParticleEffekseer Start(String key) {
    try {
        if (Manager == null) {
            Initialize();
        }
        ParticleEffekseer e = ParticleEffects.get(key);
        if (e == null) {
            e = new ParticleEffekseer(Manager);
            e.load(key,true);
            ParticleEffects.put(key, e);
        }
        e.play();
        return e;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public static class EFK {
    public static final String SWORD1 = "effects/Sword01.efk";
    public static final String TEST = "effects/Test.efk";
    public static final String TEST2 = "effects/test.efkpkg";
}

}

`

And this is my main application file:
`
public class MyGdxGame extends ApplicationAdapter {
SpriteBatch batch;
Texture img;

@Override
public void create () {
	batch = new SpriteBatch();
	img = new Texture("badlogic.jpg");
	EffekseerHelper.Play(EffekseerHelper.EFK.TEST, new Vector2(0,0));
}

@Override
public void render () {
	EffekseerHelper.Render(batch);
}

@Override
public void dispose () {
	batch.dispose();
	img.dispose();
}

}
`

Error while loading particle effect

I'm trying to load a .efk file like this:


    //effekseer stuff
    lateinit var assetManager:AssetManager
    lateinit var myFileHandleResolver: FileHandleResolver
    lateinit var manager:EffekseerManager
    lateinit var myParticle:EffekseerParticle

    init {
        EffekseerGdx.init()
        initEffekseer()
        initializeBullet()
        createAxes()
        createFloor(50f, 1f, 50f)
    }


    private fun initEffekseer() {

        myFileHandleResolver=MyFileHandleResolver()
        assetManager= AssetManager(myFileHandleResolver)
        assetManager.setLoader(EffekseerParticleSubAssetLoader.Result::class.java,
            null,EffekseerParticleSubAssetLoader(myFileHandleResolver))

        assetManager.setLoader(
            EffekseerParticleAssetLoader.Result::class.java, null, EffekseerParticleAssetLoader(myFileHandleResolver)
        )
        manager= EffekseerManager(camera, EffekseerCore.TypeOpenGL.OPEN_GL2,1000,modelBatch.renderContext)

        myParticle= EffekseerParticle(manager)
        myParticle.setMagnification(20f)

        myParticle.syncLoad(assetManager, "random colors.efk")

        myParticle.play()
    }

    override fun render(delta: Float) {
        super.render(delta)

        manager.draw(delta)

        manager.drawAfterUpdate()

        dynamicsWorld?.stepSimulation(delta)
        debugDrawer?.begin(camera)
        dynamicsWorld?.debugDrawWorld()
        
        debugDrawer?.end()
    }

    class MyFileHandleResolver:FileHandleResolver{
        override fun resolve(fileName: String?): FileHandle {
            return Gdx.files.internal(fileName)
        }

    }

    override fun dispose() {
        super.dispose()
        myParticle.dispose()
        manager.dispose()
    }
}

The super.render method is:

fun render(delta:Float){
cameraController.update()
        ScreenUtils.clear(Color.BLACK, true)
        shadowLight!!.begin(Vector3.Zero, camera.direction)
        shadowBatch.begin(shadowLight!!.camera)
        shadowBatch.render(renderInstances)
        shadowBatch.end()
        shadowLight!!.end()
        modelBatch.begin(camera)
        modelBatch.render(renderInstances, environment)
        modelBatch.end()

        //setting up the debug renderer

        stage.act()
        stage.draw()
}

I'm using version 2.2.3 of effekseer for libgdx, I tried to load the .efk file asyncronously via myParticle.asyncload but the onEffectLoaded method wouldn't execute (I set it to println "particle loaded" when finished loading, but it just doesn't do it), in the log it says:

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  io.github.srjohnathan.gdx.effekseer.core.GDXJNI.EffekseerEffectCore_GetTextureCount(JLio/github/srjohnathan/gdx/effekseer/core/EffekseerEffectCore;I)I+0
j  io.github.srjohnathan.gdx.effekseer.core.EffekseerEffectCore.GetTextureCount(Lio/github/srjohnathan/gdx/effekseer/core/EffekseerTextureType;)I+9
j  io.github.srjohnathan.gdx.effekseer.loader.EffekseerParticleAssetLoader.loadAsync(Lcom/badlogic/gdx/assets/AssetManager;Ljava/lang/String;Lcom/badlogic/gdx/files/FileHandle;Lio/github/srjohnathan/gdx/effekseer/loader/EffekseerParticleAssetLoader$Parameters;)V+123
j  io.github.srjohnathan.gdx.effekseer.loader.EffekseerParticleAssetLoader.loadAsync(Lcom/badlogic/gdx/assets/AssetManager;Ljava/lang/String;Lcom/badlogic/gdx/files/FileHandle;Lcom/badlogic/gdx/assets/AssetLoaderParameters;)V+9
j  com.badlogic.gdx.assets.AssetLoadingTask.call()Ljava/lang/Void;+167
j  com.badlogic.gdx.assets.AssetLoadingTask.call()Ljava/lang/Object;+1
j  com.badlogic.gdx.utils.async.AsyncExecutor$2.call()Ljava/lang/Object;+4
j  java.util.concurrent.FutureTask.run()V+39 [email protected]
j  java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V+92 [email protected]
j  java.util.concurrent.ThreadPoolExecutor$Worker.run()V+5 [email protected]
j  java.lang.Thread.run()V+11 [email protected]
v  ~StubRoutines::call_stub

siginfo: EXCEPTION_ACCESS_VIOLATION (0xc0000005), reading address 0x0000000000000000


Register to memory mapping:

RIP=0x00007ffafddfd6f7 src.dll
RAX=0x00007ffafdda68e0 src.dll
RBX={method} {0x00000133b29ba900} 'EffekseerEffectCore_GetTextureCount' '(JLio/github/srjohnathan/gdx/effekseer/core/EffekseerEffectCore;I)I' in 'io/github/srjohnathan/gdx/effekseer/core/GDXJNI'
RCX=0x0 is NULL
RDX=0x0 is NULL
RSP=0x0000001b65cfecf8 is pointing into the stack for thread: 0x00000133b1fbcbd0
RBP=0x0000001b65cfed90 is pointing into the stack for thread: 0x00000133b1fbcbd0
RSI=0x0000000712c9c450 is an oop: [Ljava.lang.Object; 
{0x0000000712c9c450} - klass: 'java/lang/Object'[]
 - length: 64
RDI=0x00000133947f9612 is at code_begin+1394 in an Interpreter codelet
return entry points  [0x00000133947f90a0, 0x00000133947f9ba0]  2816 bytes
R8 =0x00000133b1c8cd60 points into unknown readable memory: 0x0000000000000000 | 00 00 00 00 00 00 00 00
R9 =0x0000001b65cfedb8 is pointing into the stack for thread: 0x00000133b1fbcbd0
R10=0x00000133947fd5f2 is at code_begin+946 in an Interpreter codelet
method entry point (kind = native)  [0x00000133947fd240, 0x00000133947fdbc0]  2432 bytes
R11=0x0000000712ffba38 is an oop: java.lang.Class 
{0x0000000712ffba38} - klass: 'java/lang/Class'
 - ---- fields (total size 14 words):
 - private volatile transient 'classRedefinedCount' 'I' @12  0
 - private volatile transient 'cachedConstructor' 'Ljava/lang/reflect/Constructor;' @40  NULL (0)
 - private transient 'name' 'Ljava/lang/String;' @44  "io.github.srjohnathan.gdx.effekseer.core.GDXJNI"{0x0000000712ffbab8} (e25ff757)
 - private transient 'module' 'Ljava/lang/Module;' @48  a 'java/lang/Module'{0x0000000711c21868} (e238430d)
 - private final 'classLoader' 'Ljava/lang/ClassLoader;' @52  a 'jdk/internal/loader/ClassLoaders$AppClassLoader'{0x0000000711c20158} (e238402b)
 - private transient 'classData' 'Ljava/lang/Object;' @56  NULL (0)
 - private transient 'packageName' 'Ljava/lang/String;' @60  "io.github.srjohnathan.gdx.effekseer.core"{0x0000000712e7dca8} (e25cfb95)
 - private final 'componentType' 'Ljava/lang/Class;' @64  NULL (0)
 - private volatile transient 'reflectionData' 'Ljava/lang/ref/SoftReference;' @68  NULL (0)
 - private volatile transient 'genericInfo' 'Lsun/reflect/generics/repository/ClassRepository;' @72  NULL (0)
 - private volatile transient 'enumConstants' '[Ljava/lang/Object;' @76  NULL (0)
 - private volatile transient 'enumConstantDirectory' 'Ljava/util/Map;' @80  NULL (0)
 - private volatile transient 'annotationData' 'Ljava/lang/Class$AnnotationData;' @84  NULL (0)
 - private volatile transient 'annotationType' 'Lsun/reflect/annotation/AnnotationType;' @88  NULL (0)
 - transient 'classValueMap' 'Ljava/lang/ClassValue$ClassValueMap;' @92  NULL (0)
 - signature: Lio/github/srjohnathan/gdx/effekseer/core/GDXJNI;
 - fake entry for mirror: 'io/github/srjohnathan/gdx/effekseer/core/GDXJNI'
 - fake entry for array: NULL
 - fake entry for oop_size: 14
 - fake entry for static_oop_field_count: 0
R12=0x0 is NULL
R13={method} {0x00000133b29ba900} 'EffekseerEffectCore_GetTextureCount' '(JLio/github/srjohnathan/gdx/effekseer/core/EffekseerEffectCore;I)I' in 'io/github/srjohnathan/gdx/effekseer/core/GDXJNI'
R14=0x0000001b65cfedc8 is pointing into the stack for thread: 0x00000133b1fbcbd0
R15=0x00000133b1fbcbd0 is a thread

Also If you could link a project that uses effekseer-gdx as an exaple it would be really useful, thanks.

Issues in version 2.2

  1. I cannot pull the commit that the Effekseer has been updated to (https://github.com/effekseer/Effekseer/tree/2e9601f372f631dceee731a17a0676777d6eeb29).

  2. I have this exception at run time. For some reason SetTime() in EffekseerManagerCore is not available.

Exception in thread "GL Thread" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.UnsatisfiedLinkError: io.github.srjohnathan.gdx.effekseer.core.GDXJNI.EffekseerManagerCore_SetTime(JLio/github/srjohnathan/gdx/effekseer/core/EffekseerManagerCore;F)V
	at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.<init>(Lwjgl3Application.java:122)
	at ...
Caused by: java.lang.UnsatisfiedLinkError: io.github.srjohnathan.gdx.effekseer.core.GDXJNI.EffekseerManagerCore_SetTime(JLio/github/srjohnathan/gdx/effekseer/core/EffekseerManagerCore;F)V
	at io.github.srjohnathan.gdx.effekseer.core.GDXJNI.EffekseerManagerCore_SetTime(Native Method)
	at io.github.srjohnathan.gdx.effekseer.core.EffekseerManagerCore.SetTime(EffekseerManagerCore.java:236)
	at io.github.srjohnathan.gdx.effekseer.wrapped.EffekseerManager.draw(EffekseerManager.java:351)
	...
	at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window.update(Lwjgl3Window.java:403)
	at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.loop(Lwjgl3Application.java:143)
	at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.<init>(Lwjgl3Application.java:116)
	... 1 more

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.