Skip to content

Source: Animation Editor Effekseer with SFML example

Allyson S Bacon edited this page Mar 2, 2022 · 5 revisions

Effekseer implementation example with SFML

See the official website of Effekseer: https://effekseer.github.io/en/

#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
#include <Effekseer.h>
#include <EffekseerRendererGL.h>

// Create a renderer of effects
// エフェクトのレンダラーの作成
static ::EffekseerRendererGL::RendererRef effekseer_renderer;

// Create a manager of effects
// エフェクトのマネージャーの作成
static ::Effekseer::ManagerRef effekseer_manager;

// EFK handler
static Effekseer::Handle effekseer_handle;

// Control animation loop
static int32_t effekseer_time = 0;

// EFK ef
static Effekseer::EffectRef effekseer_effect;

void main_loop()
{
	sfml_start();
	effekseer_start(800, 600);

	while (true)
	{
	    sf_clear()
	    sf_display()
	}
}

void sfml_start()
{
	sf::VideoMode desktop = sf::VideoMode::getDesktopMode();

	window = new sf::RenderWindow(sf::VideoMode(800, 600, desktop.bitsPerPixel), sf::String("OpenGL"),  sf::Style::Default, sf::ContextSettings(24, 8, 4, 0, 0));

	window->setFramerateLimit(0);
}

void effekseer_start(int window_width, int window_height)
{
	// Create a renderer of effects
	// エフェクトのレンダラーの作成
	effekseer_renderer = ::EffekseerRendererGL::Renderer::Create(8000, EffekseerRendererGL::OpenGLDeviceType::OpenGL3);

	// Create a manager of effects
	// エフェクトのマネージャーの作成
	effekseer_manager = ::Effekseer::Manager::Create(8000);

	// Sprcify rendering modules
	// 描画モジュールの設定
	effekseer_manager->SetSpriteRenderer(effekseer_renderer->CreateSpriteRenderer());
	effekseer_manager->SetRibbonRenderer(effekseer_renderer->CreateRibbonRenderer());
	effekseer_manager->SetRingRenderer(effekseer_renderer->CreateRingRenderer());
	effekseer_manager->SetTrackRenderer(effekseer_renderer->CreateTrackRenderer());
	effekseer_manager->SetModelRenderer(effekseer_renderer->CreateModelRenderer());

	// Specify a texture, model, curve and material loader
	// It can be extended by yourself. It is loaded from a file on now.
	// テクスチャ、モデル、カーブ、マテリアルローダーの設定する。
	// ユーザーが独自で拡張できる。現在はファイルから読み込んでいる。
	effekseer_manager->SetTextureLoader(effekseer_renderer->CreateTextureLoader());
	effekseer_manager->SetModelLoader(effekseer_renderer->CreateModelLoader());
	effekseer_manager->SetMaterialLoader(effekseer_renderer->CreateMaterialLoader());
	effekseer_manager->SetCurveLoader(Effekseer::MakeRefPtr<Effekseer::CurveLoader>());

	// Specify a position of view
	// 視点位置を確定
	auto g_position = ::Effekseer::Vector3D(10.0f, 5.0f, 20.0f);

	// Specify a projection matrix
	// 投影行列を設定
	effekseer_renderer->SetProjectionMatrix(
		::Effekseer::Matrix44().PerspectiveFovRH_OpenGL(90.0f / 180.0f * 3.14f, (float)window_width / (float)window_height, 1.0f, 500.0f));

	// Specify a camera matrix
	// カメラ行列を設定
	effekseer_renderer->SetCameraMatrix(
		::Effekseer::Matrix44().LookAtRH(g_position, ::Effekseer::Vector3D(0.0f, 0.0f, 0.0f), ::Effekseer::Vector3D(0.0f, 1.0f, 0.0f)));

	// Load an effect
	// エフェクトの読込
	effekseer_effect = Effekseer::Effect::Create(effekseer_manager, (const EFK_CHAR*)L"effects\\Laser01.efk");
}

void sf_display()
{
	// Begin to rendering effects
	// エフェクトの描画開始処理を行う。
	effekseer_renderer->BeginRendering();

	// Render effects
        // エフェクトの描画を行う。
	effekseer_manager->Draw();

	// Finish to rendering effects
        // エフェクトの描画終了処理を行う。
	effekseer_renderer->EndRendering();

	// Swap
	window->display();
}

void sf_clear()
{
	if (effekseer_time % 120 == 0)
	{
		// Play an effect
		// エフェクトの再生
		effekseer_handle = effekseer_manager->Play(effekseer_effect, 0, 0, 0);
	}

	if (effekseer_time % 120 == 119)
	{
		// Stop effects
		// エフェクトの停止
		effekseer_manager->StopEffect(effekseer_handle);
	}

	// Move the effect
        // エフェクトの移動
	effekseer_manager->AddLocation(effekseer_handle, ::Effekseer::Vector3D(0.2f, 0.0f, 0.0f));

	// Update the manager
        // マネージャーの更新
	effekseer_manager->Update();

	// Control effect loop
	effekseer_time++;

	// glClear
	window->clear();
}
Clone this wiki locally