treasure/js/plugins/EffekseerForRPGMakerMZ_Ex.js
2025-10-01 19:10:49 -05:00

188 lines
6.7 KiB
JavaScript

//==============================================================================
// EffekseerForRPGMakerMZ_Ex.js
// -----------------------------------------------------------------------------
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// -----------------------------------------------------------------------------
// [GitHub] : https://github.com/effekseer/EffekseerForRPGMakerMZ_Ex
//==============================================================================
/*:
* @target MZ
* @url https://github.com/effekseer/EffekseerForRPGMakerMZ_Ex
* @plugindesc Effekseer Extended plugin v1.60 - 1.01
* @author Effekseer
*
* @help
* It is a plugin to extend the functionality of Effekseer.
* Optimize a performance.
*
* Change it if you want to use a large amount of effects that can't be displayed.
*
* @param InstanceMaxCount
* @desc The maximum number of instances that can be displayed at one time.
* @type number
* @default 10000
*
* @param SquareMaxCount
* @desc The maximum number of sprites that can be displayed at one time.
* @type number
* @default 10000
*
* @param DistortionEnabled
* @desc Enables/disables effect distortion.
* @type boolean
* @default false
*
*/
/*:ja
* @target MZ
* @url https://github.com/effekseer/EffekseerForRPGMakerMZ_Ex
* @plugindesc Effekseer 拡張プラグイン v1.60 - 1.01
* @author Effekseer
*
* @help
* Effekseer の機能を拡張するプラグインです。
* パフォーマンスを最適化します。
*
* 表示しきれない多量のエフェクトを使う場合は変更してください。
*
* @param InstanceMaxCount
* @desc 一度に表示できるインスタンスの最大数。
* @type number
* @default 10000
*
* @param SquareMaxCount
* @desc 一度に表示できるスプライトの最大数。
* @type number
* @default 10000
*
* @param DistortionEnabled
* @desc エフェクトの歪みを有効にするかどうか。
* @type boolean
* @default false
*
*/
(() => {
'use strict'
var pluginName = 'EffekseerForRPGMakerMZ_Ex';
var paramInstanceMaxCount = Number(PluginManager.parameters(pluginName)['InstanceMaxCount']);
var paramSquareMaxCount = Number(PluginManager.parameters(pluginName)['SquareMaxCount']);
var isDistortionEnabled = PluginManager.parameters(pluginName)['DistortionEnabled'] != "false";
Graphics._createEffekseerContext = function () {
if (this._app && window.effekseer) {
try {
const actualInstanceMaxCount = (paramInstanceMaxCount) ? paramInstanceMaxCount : 10000;
const actualSquareMaxCount = (paramSquareMaxCount) ? paramSquareMaxCount : 10000;
this._effekseer = effekseer.createContext();
if (this._effekseer) {
this._effekseer.init(this._app.renderer.gl, { instanceMaxCount: actualInstanceMaxCount, squareMaxCount: actualSquareMaxCount });
}
// restore OpenGL states with pixi.js functions
this._effekseer.setRestorationOfStatesFlag(false);
} catch (e) {
this._app = null;
}
}
};
Sprite_Animation.prototype.onAfterRender = function (renderer) {
renderer.texture.reset();
renderer.geometry.reset();
renderer.state.reset();
renderer.shader.reset();
renderer.framebuffer.reset();
};
if (isDistortionEnabled) {
Sprite_Animation.prototype.setProjectionMatrix = function (renderer) {
const x = (this._mirror ? -1 : 1) * renderer.view.height / renderer.view.width;
const y = -1;
// prettier-ignore
Graphics.effekseer.setProjectionMatrix([
x, 0, 0, 0,
0, y, 0, 0,
0, 0, -0.01, 0,
0, 0, 0, 10,
]);
};
Sprite_Animation.prototype.setCameraMatrix = function (/*renderer*/) {
// prettier-ignore
Graphics.effekseer.setCameraMatrix([
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, -10, 1
]);
};
Sprite_Animation.prototype.setViewport = function (renderer) {
const halfW = renderer.view.width / 2;
const pos = this.targetPosition(renderer);
const x = (this._mirror) ? (-(pos.x - halfW)) + halfW : pos.x;
this._handle.setLocation(
((x - renderer.view.width / 2.0) / (renderer.view.height / 2.0)) * 10.0,
-(pos.y / renderer.view.height * 2.0 - 1.0) * 10.0,
0);
renderer.gl.viewport(0, 0, renderer.view.width, renderer.view.height);
};
Sprite_Animation.prototype.updateEffectGeometry = function() {
};
Sprite_Animation.prototype.updateEffectGeometryOnRender = function() {
const scale = this._animation.scale / 100;
const r = Math.PI / 180;
const rx = this._animation.rotation.x * r;
const ry = this._animation.rotation.y * r;
const rz = this._animation.rotation.z * r;
if (this._handle) {
this._handle.setLocation(0, 0, 0);
this._handle.setRotation(rx, ry, rz);
this._handle.setScale(scale, scale, scale);
this._handle.setSpeed(this._animation.speed / 100);
}
};
Graphics._onTick = function(deltaTime) {
this._fpsCounter.startTick();
if (this._tickHandler) {
this._tickHandler(deltaTime);
}
if (this._canRender()) {
this.isBackgroundCaptured = false;
this._app.render();
}
this._fpsCounter.endTick();
};
Sprite_Animation.prototype._render = function (renderer) {
this.updateEffectGeometryOnRender();
if (this._targets.length > 0 && this._handle && this._handle.exists) {
this.onBeforeRender(renderer);
this.saveViewport(renderer);
this.setProjectionMatrix(renderer);
this.setCameraMatrix(renderer);
this.setViewport(renderer);
if(!this.isBackgroundCaptured)
{
Graphics.effekseer.captureBackground(0, 0, renderer.view.width, renderer.view.height);
this.isBackgroundCaptured = true;
}
Graphics.effekseer.beginDraw();
Graphics.effekseer.drawHandle(this._handle);
Graphics.effekseer.endDraw();
this.resetViewport(renderer);
this.onAfterRender(renderer);
}
};
}
})();