mirror of https://github.com/axmolengine/axmol.git
475 lines
12 KiB
C++
475 lines
12 KiB
C++
|
||
#pragma once
|
||
|
||
#include "cocos2d.h"
|
||
#include <Effekseer.h>
|
||
#include <EffekseerRendererCommon/EffekseerRenderer.Renderer.h>
|
||
|
||
//#ifdef AX_USE_METAL
|
||
//#include <EffekseerRendererMetal.h>
|
||
//#else
|
||
//#include <EffekseerRendererGL.h>
|
||
//#endif
|
||
|
||
namespace efk
|
||
{
|
||
class EffectManager;
|
||
class InternalManager;
|
||
|
||
/**
|
||
@brief
|
||
\~English Effect resource class
|
||
\~Japanese エフェクトのリソースクラス
|
||
@note
|
||
\~English
|
||
It is released automatically with autorelease after version1.41
|
||
|
||
\~Japanese
|
||
1.41以降、autoreleaseにより自動的に解放されます。
|
||
*/
|
||
class Effect : public cocos2d::Ref
|
||
{
|
||
private:
|
||
::Effekseer::EffectRef effect = nullptr;
|
||
InternalManager* internalManager_ = nullptr;
|
||
|
||
public:
|
||
static Effect* create(const std::string& filename, float maginification = 1.0f);
|
||
|
||
Effect(InternalManager* internalManager = nullptr);
|
||
|
||
virtual ~Effect();
|
||
|
||
/**
|
||
@brief
|
||
\~English Get the pointer of Effekseer::Effect
|
||
\~Japanese Effekseer::Effectのポインタを取得する。
|
||
@return
|
||
\~English The pointer of Effekseer::Effect
|
||
\~Japanese Effekseer::Effectのポインタ
|
||
*/
|
||
::Effekseer::EffectRef getInternalPtr() { return effect; }
|
||
};
|
||
|
||
/**
|
||
@brief
|
||
\~English Effect emitter class
|
||
\~Japanese エフェクトのエミッタークラス
|
||
@note
|
||
\~English
|
||
It is released automatically with autorelease after version1.41
|
||
|
||
|
||
\~Japanese
|
||
1.41以降、autoreleaseにより自動的に解放されます。
|
||
*/
|
||
class EffectEmitter : public cocos2d::Node
|
||
{
|
||
friend class EffectManager;
|
||
|
||
private:
|
||
bool playOnEnter = false;
|
||
bool removeOnStop = true;
|
||
bool isLooping = false;
|
||
|
||
//! whether this effect is played once at least
|
||
bool isPlayedAtLeastOnce = false;
|
||
|
||
cocos2d::Vec3 targetPosition_;
|
||
float speed_ = 1.0f;
|
||
cocos2d::Color4B color_ = cocos2d::Color4B(255, 255, 255, 255);
|
||
std::array<float, 4> dynamicInputs_;
|
||
|
||
EffectManager* manager = nullptr;
|
||
Effect* effect_ = nullptr;
|
||
::Effekseer::Handle handle = -1;
|
||
|
||
// cocos2d::CallbackCommand renderCommand;
|
||
|
||
void beforeRender(EffekseerRenderer::RendererRef, Effekseer::RefPtr<EffekseerRenderer::CommandList>);
|
||
void afterRender(EffekseerRenderer::RendererRef, Effekseer::RefPtr<EffekseerRenderer::CommandList>);
|
||
|
||
public:
|
||
/**
|
||
@brief
|
||
\~English Create the instance of emitter class.
|
||
\~Japanese エミッタークラスのインスタンスを生成する。
|
||
|
||
@return
|
||
\~English Instance
|
||
\~Japanese インスタンス
|
||
*/
|
||
static EffectEmitter* create(EffectManager* manager);
|
||
|
||
/**
|
||
@brief
|
||
\~English Create the instance of emitter class.
|
||
\~Japanese エミッタークラスのインスタンスを生成する。
|
||
|
||
@param filename
|
||
\~English An effect files's path
|
||
\~Japanese エフェクトファイルのパス
|
||
|
||
@param magnification
|
||
\~English A maginification rate. Effects are loaded by enlarge with specified value
|
||
\~Japanese 拡大率、指定された値でエフェクトが拡大されて読み込まれる
|
||
|
||
@return
|
||
\~English Instance
|
||
\~Japanese インスタンス
|
||
*/
|
||
static EffectEmitter* create(EffectManager* manager, const std::string& filename, float maginification = 1.0f);
|
||
|
||
/**
|
||
@brief
|
||
\~English Constructor
|
||
\~Japanese コンストラクタ
|
||
*/
|
||
EffectEmitter(EffectManager* manager);
|
||
|
||
/**
|
||
@brief
|
||
\~English Destructor
|
||
\~Japanese デストラクタ
|
||
*/
|
||
virtual ~EffectEmitter();
|
||
|
||
/**
|
||
@brief
|
||
\~English Get an effect's resource
|
||
\~Japanese エフェクトのリソースを取得する。
|
||
@return
|
||
\~English An effect's resource
|
||
\~Japanese エフェクトのリソース
|
||
*/
|
||
Effect* getEffect();
|
||
|
||
/**
|
||
@brief
|
||
\~English Set an effect's resource
|
||
\~Japanese エフェクトのリソースを設定する。
|
||
@param effect
|
||
\~English An effect's resource
|
||
\~Japanese エフェクトのリソース
|
||
*/
|
||
void setEffect(Effect* effect);
|
||
|
||
/**
|
||
@brief
|
||
\~English Get an internal handle of Effekseer
|
||
\~Japanese Effekseerの内部のハンドルを取得する。
|
||
@param effect
|
||
\~English An internal handle of Effekseer
|
||
\~Japanese Effekseerの内部のハンドル
|
||
*/
|
||
::Effekseer::Handle getInternalHandle() const;
|
||
|
||
/**
|
||
@brief
|
||
\~English Play the effect.
|
||
\~Japanese エフェクトを再生する。
|
||
*/
|
||
void play();
|
||
|
||
/**
|
||
@brief
|
||
\~English Play the effect.
|
||
\~Japanese エフェクトを再生する。
|
||
@param startFrame
|
||
\~English A time to play from middle
|
||
\~Japanese 途中から再生するための時間
|
||
*/
|
||
void play(int32_t startTime);
|
||
|
||
/**
|
||
@brief
|
||
\~English Get whether to start playing the effect when adding a node.
|
||
\~Japanese 追加時に再生を開始するかどうか、設定する。
|
||
@return value
|
||
\~English Flag
|
||
\~Japanese フラグ
|
||
*/
|
||
bool getPlayOnEnter();
|
||
|
||
/**
|
||
@brief
|
||
\~English Set whether to start playing the effect when adding a node.
|
||
\~Japanese 追加時に再生を開始するかどうか、設定する。
|
||
@return value
|
||
\~English Flag
|
||
\~Japanese フラグ
|
||
*/
|
||
void setPlayOnEnter(bool value);
|
||
|
||
/**
|
||
@brief
|
||
\~English Get whether to loop play the effect.
|
||
\~Japanese ループ再生するかどうか、取得する。
|
||
@return value
|
||
\~English Flag
|
||
\~Japanese フラグ
|
||
*/
|
||
bool getIsLooping();
|
||
|
||
/**
|
||
@brief
|
||
\~English Set whether to loop play the effect.
|
||
\~Japanese ループ再生するかどうか、設定する。
|
||
@return value
|
||
\~English Flag
|
||
\~Japanese フラグ
|
||
*/
|
||
void setIsLooping(bool value);
|
||
|
||
/**
|
||
@brief
|
||
\~English Get whether to discard the node at the end of playback.
|
||
\~Japanese 再生終了時にノードを破棄するかどうか、設定する。
|
||
*/
|
||
bool getRemoveOnStop();
|
||
|
||
/**
|
||
@brief
|
||
\~English Set whether to discard the node at the end of playback.
|
||
\~Japanese 再生終了時にノードを破棄するかどうか、設定する。
|
||
*/
|
||
void setRemoveOnStop(bool value);
|
||
|
||
/**
|
||
@brief
|
||
\~English Set the color which affects whole particles.
|
||
\~Japanese 全てのパーティクルに影響する色を設定する。
|
||
*/
|
||
void setColor(cocos2d::Color4B color);
|
||
|
||
/**
|
||
@brief
|
||
\~English Get the playback speed
|
||
\~Japanese 再生速度を取得する。
|
||
*/
|
||
float getSpeed();
|
||
|
||
/**
|
||
@brief
|
||
\~English Set the playback speed
|
||
\~Japanese 再生速度を設定する。
|
||
*/
|
||
void setSpeed(float speed);
|
||
|
||
/**
|
||
@brief
|
||
\~English Set the position of target to gather
|
||
\~Japanese エフェクトが集まる位置を設定する。
|
||
*/
|
||
void setTargetPosition(cocos2d::Vec3 position);
|
||
|
||
/**
|
||
@brief
|
||
\~English get a dynamic parameter, which changes effect parameters dynamically while playing
|
||
\~Japanese 再生中にエフェクトのパラメーターを変更する動的パラメーターを取得する。
|
||
*/
|
||
float getDynamicInput(int32_t index);
|
||
|
||
/**
|
||
@brief
|
||
\~English specfiy a dynamic parameter, which changes effect parameters dynamically while playing
|
||
\~Japanese 再生中にエフェクトのパラメーターを変更する動的パラメーターを設定する。
|
||
*/
|
||
void setDynamicInput(int32_t index, float value);
|
||
|
||
/**
|
||
@brief
|
||
\~English Get whether or not playing the effect.
|
||
\~Japanese 再生中かどうか、取得する。
|
||
*/
|
||
bool isPlaying();
|
||
|
||
/**
|
||
@brief
|
||
\~English Stop the effect.
|
||
\~Japanese エフェクトを停止する。
|
||
*/
|
||
void stop();
|
||
|
||
/**
|
||
@brief
|
||
\~English Stop only the effect's root.
|
||
\~Japanese エフェクトのルートのみを停止する。
|
||
*/
|
||
void stopRoot();
|
||
|
||
void onEnter() override;
|
||
|
||
void onExit() override;
|
||
|
||
void update(float delta) override;
|
||
|
||
void draw(cocos2d::Renderer* renderer, const cocos2d::Mat4& parentTransform, uint32_t parentFlags) override;
|
||
};
|
||
|
||
class EffectManager : public cocos2d::Ref
|
||
{
|
||
friend class EffectEmitter;
|
||
|
||
private:
|
||
::Effekseer::ManagerRef manager2d = nullptr;
|
||
::EffekseerRenderer::RendererRef renderer2d = nullptr;
|
||
::EffekseerRenderer::DistortingCallback* distortingCallback = NULL;
|
||
::Effekseer::RefPtr<::EffekseerRenderer::SingleFrameMemoryPool> memoryPool_ = nullptr;
|
||
::Effekseer::RefPtr<::EffekseerRenderer::CommandList> commandList_ = nullptr;
|
||
|
||
bool isDistortionEnabled = false;
|
||
|
||
bool isDistorted = false;
|
||
float time_ = 0.0f;
|
||
InternalManager* internalManager_ = nullptr;
|
||
|
||
cocos2d::CustomCommand distortionCommand;
|
||
cocos2d::CustomCommand beginCommand;
|
||
cocos2d::CustomCommand endCommand;
|
||
|
||
::Effekseer::Handle play(Effect* effect, float x, float y, float z);
|
||
|
||
::Effekseer::Handle play(Effect* effect, float x, float y, float z, int startTime);
|
||
|
||
void setMatrix(::Effekseer::Handle handle, const cocos2d::Mat4& mat);
|
||
|
||
void setPotation(::Effekseer::Handle handle, float x, float y, float z);
|
||
|
||
void setRotation(::Effekseer::Handle handle, float x, float y, float z);
|
||
|
||
void setScale(::Effekseer::Handle handle, float x, float y, float z);
|
||
|
||
bool Initialize(cocos2d::Size visibleSize);
|
||
|
||
void CreateRenderer(int32_t spriteSize);
|
||
void onDestructor();
|
||
|
||
public:
|
||
/**
|
||
@brief
|
||
\~English Create the instance of manager class.
|
||
\~Japanese マネージャークラスのインスタンスを生成する。
|
||
|
||
@return
|
||
\~English Instance
|
||
\~Japanese インスタンス
|
||
*/
|
||
static EffectManager* create(cocos2d::Size visibleSize);
|
||
|
||
/**
|
||
@brief
|
||
\~English Constructor
|
||
\~Japanese コンストラクタ
|
||
*/
|
||
EffectManager();
|
||
|
||
/**
|
||
@brief
|
||
\~English Destructor
|
||
\~Japanese デストラクタ
|
||
*/
|
||
virtual ~EffectManager();
|
||
|
||
/**
|
||
@brief
|
||
\~English Set whether distortion is enabled.
|
||
\~Japanese 歪みが有功かどうかを設定する。
|
||
*/
|
||
void setIsDistortionEnabled(bool value);
|
||
|
||
/**
|
||
@brief
|
||
\~English Inherit visit and add a process before drawing the layer.
|
||
\~Japanese visitを継承してレイヤーの描画を行う前に実行する。
|
||
*/
|
||
void begin(cocos2d::Renderer* renderer, float globalZOrder);
|
||
|
||
/**
|
||
@brief
|
||
\~English Inherit visit and add a process after drawing the layer.
|
||
\~Japanese visitを継承してレイヤーの描画を行った後に実行する。
|
||
*/
|
||
void end(cocos2d::Renderer* renderer, float globalZOrder);
|
||
|
||
/**
|
||
@brief
|
||
\~English This is called within begin. For special behavioural handling of different graphic device
|
||
*/
|
||
void newFrame();
|
||
|
||
/**
|
||
@brief
|
||
\~English Update the manager every frame.
|
||
\~Japanese 毎フレーム実行する。
|
||
@param delta
|
||
\~English In seconds.
|
||
\~Japanese 秒
|
||
|
||
*/
|
||
void update(float delta = 1.0f / 60.0f);
|
||
|
||
/**
|
||
@brief
|
||
\~English Get the pointer of Effekseer::Manager
|
||
\~Japanese Effekseer::Managerのポインタを取得する。
|
||
@return
|
||
\~English The pointer of Effekseer::Manager
|
||
\~Japanese Effekseer::Managerのポインタ
|
||
*/
|
||
::Effekseer::ManagerRef getInternalManager() { return manager2d; }
|
||
|
||
/**
|
||
@brief
|
||
\~English Get the pointer of Effekseer::Renderer
|
||
\~Japanese Effekseer::Rendererのポインタを取得する。
|
||
@return
|
||
\~English The pointer of Effekseer::Renderer
|
||
\~Japanese Effekseer::Rendererのポインタ
|
||
*/
|
||
::EffekseerRenderer::RendererRef getInternalRenderer() { return renderer2d; }
|
||
|
||
void setCameraMatrix(const cocos2d::Mat4& mat);
|
||
void setProjectionMatrix(const cocos2d::Mat4& mat);
|
||
|
||
Effekseer::RefPtr<::EffekseerRenderer::CommandList> getInternalCommandList() { return commandList_; }
|
||
};
|
||
|
||
class NetworkServer : public cocos2d::Ref
|
||
{
|
||
private:
|
||
InternalManager* internalManager_ = nullptr;
|
||
|
||
public:
|
||
NetworkServer();
|
||
|
||
virtual ~NetworkServer();
|
||
|
||
/**
|
||
@brief
|
||
\~English Create the instance of network server class.
|
||
\~Japanese ネットワークサーバークラスのインスタンスを生成する。
|
||
|
||
|
||
@return
|
||
\~English Instance
|
||
\~Japanese インスタンス
|
||
*/
|
||
static NetworkServer* create();
|
||
|
||
/**
|
||
@brief
|
||
\~English make network server enabled to edit effects from remote.
|
||
\~Japanese リモートからエフェクトを編集するためにサーバーを有効にする。
|
||
*/
|
||
bool makeNetworkServerEnabled(uint16_t port);
|
||
|
||
/**
|
||
@brief
|
||
\~English Update the manager every frame.
|
||
\~Japanese 毎フレーム実行する。
|
||
*/
|
||
void update();
|
||
};
|
||
} // namespace efk
|