Skip to content

Commit

Permalink
v1.4.0 - Video Sprites Update
Browse files Browse the repository at this point in the history
- Added video functions
- Now you can create animated sprites.
- Now you can access to shader's uniform variables using `shader.variable`
  • Loading branch information
Jamextreme140 committed Jan 3, 2025
1 parent 05bc72a commit 2f3284c
Show file tree
Hide file tree
Showing 17 changed files with 286 additions and 29 deletions.
2 changes: 1 addition & 1 deletion art/generateDoc.bat
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
@ECHO OFF
cd ..
echo Building Game...
lime build windows --haxeflag="--macro include('scripting')" --haxeflag="-xml docs/doc.xml" -D DOCUMENTATION --no-output
lime build windows --haxeflag="-xml docs/doc.xml" -D doc-gen -D DOCUMENTATION --no-output
echo art

echo Generated the api xml file at docs/doc.xml
Expand Down
16 changes: 10 additions & 6 deletions mods/lua test/songs/luaTest.lua
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ function postCreate()

createText('luaText', 'Bird Engine', posX + 50, 90, 0, 27, 'camHUD')
addSprite('luaText', 'camHUD')
initShader('chromaticAberration')
addShader('camGame', 'chromaticAberration')
initShader('chrom', 'chromaticAberration')
addShader('camGame', 'chrom')

print("created");

Expand Down Expand Up @@ -67,12 +67,16 @@ function beatHit(curBeat)
if(math.fmod(curBeat, 2) == 0 and not hasTween) then
--print(curBeat)
shake('camHUD', 0.01, 0.1)
setShaderField('chromaticAberration', 'redOff', {ab1, 0})
setShaderField('chromaticAberration', 'blueOff', {-ab1, 0})
--setShaderField('chrom', 'redOff', {ab1, 0})
--setShaderField('chrom', 'blueOff', {-ab1, 0})
chrom.redOff = {ab1, 0}
chrom.blueOff = {-ab1, 0}
hasTween = true
elseif(math.fmod(curBeat, 4) == 0 and hasTween) then
setShaderField('chromaticAberration', 'redOff', {ab, 0})
setShaderField('chromaticAberration', 'blueOff', {-ab, 0})
--setShaderField('chrom', 'redOff', {ab, 0})
--setShaderField('chrom', 'blueOff', {-ab, 0})
chrom.redOff = {ab, 0}
chrom.blueOff = {-ab, 0}
hasTween = false
end

Expand Down
9 changes: 7 additions & 2 deletions source/funkin/backend/FlxAnimate.hx
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,19 @@ import flixel.math.FlxAngle;
import flixel.math.FlxRect;
import flixel.graphics.frames.FlxFrame;
import flixel.math.FlxPoint;
import openfl.display.BlendMode;

class FlxAnimate extends flxanimate.FlxAnimate {
static var rMatrix = new FlxMatrix();

override function drawLimb(limb:FlxFrame, _rMatrix:FlxMatrix, ?colorTransform:ColorTransform)
override function drawLimb(limb:FlxFrame, _rMatrix:FlxMatrix, ?colorTransform:ColorTransform, ?blendMode:BlendMode)
{
if (alpha == 0 || colorTransform != null && (colorTransform.alphaMultiplier == 0 || colorTransform.alphaOffset == -255) || limb == null || limb.type == EMPTY)
return;

if (blendMode == null)
blendMode = BlendMode.NORMAL;

for (camera in cameras)
{
rMatrix.identity();
Expand Down Expand Up @@ -69,7 +74,7 @@ class FlxAnimate extends flxanimate.FlxAnimate {
}

rMatrix.translate(_point.x, _point.y);
camera.drawPixels(limb, null, rMatrix, colorTransform, blend, antialiasing, shaderEnabled ? shader : null);
camera.drawPixels(limb, null, rMatrix, colorTransform, blendMode, antialiasing, shaderEnabled ? shader : null);
#if FLX_DEBUG
FlxBasic.visibleCount++;
#end
Expand Down
1 change: 1 addition & 0 deletions source/funkin/backend/MusicBeatState.hx
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ class MusicBeatState extends FlxState implements IBeatReceiver
"SHADER" => new Map<String, funkin.backend.shaders.FunkinShader>(),
"TIMERS" => new Map<String, flixel.util.FlxTimer>(),
"SOUNDS" => new Map<String, flixel.sound.FlxSound>(),
"VIDEOS" => new Map<String, hxvlc.flixel.FlxVideoSprite>(),
"SCRIPTS" => new Map<String, funkin.backend.scripting.HScript>()
];
#end
Expand Down
17 changes: 17 additions & 0 deletions source/funkin/backend/MusicBeatSubstate.hx
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,23 @@ class MusicBeatSubstate extends FlxSubState implements IBeatReceiver

public var scriptName:String = null;

@:unreflective public var luaScriptsAllowed:Bool = true;
#if ENABLE_LUA
/**
* Map containing all the objects created from Lua
*/
@:unreflective public var luaObjects(default, never):Map<String, Map<String, Dynamic>> = [
"SPRITE" => new Map<String, flixel.FlxSprite>(),
"TEXT" => new Map<String, flixel.FlxSprite>(),
"TWEEN" => new Map<String, flixel.tweens.FlxTween>(),
"SHADER" => new Map<String, funkin.backend.shaders.FunkinShader>(),
"TIMERS" => new Map<String, flixel.util.FlxTimer>(),
"SOUNDS" => new Map<String, flixel.sound.FlxSound>(),
"VIDEOS" => new Map<String, hxvlc.flixel.FlxVideoSprite>(),
"SCRIPTS" => new Map<String, funkin.backend.scripting.HScript>()
];
#end

/**
* Game Controls. (All players / Solo)
*/
Expand Down
5 changes: 5 additions & 0 deletions source/funkin/backend/assets/ModsFolder.hx
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,11 @@ class ModsFolder {
public static function getModsList():Array<String> {
var mods:Array<String> = [];
#if MOD_SUPPORT
final modsList:Array<String> = FileSystem.readDirectory(modsPath);

if (modsList == null || modsList.length <= 0)
return mods;

for(modFolder in FileSystem.readDirectory(modsPath)) {
if (FileSystem.isDirectory('${modsPath}${modFolder}')) {
mods.push(modFolder);
Expand Down
24 changes: 18 additions & 6 deletions source/funkin/backend/scripting/LuaScript.hx
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package funkin.backend.scripting;
import funkin.backend.scripting.events.CancellableEvent;

import funkin.backend.scripting.events.CancellableEvent;
import funkin.backend.scripting.lua.*;

import haxe.DynamicAccess;

import openfl.utils.Assets;

import hscript.IHScriptCustomBehaviour;

#if ENABLE_LUA
import llua.State;
import llua.Macro.*;
Expand Down Expand Up @@ -56,7 +58,7 @@ class LuaScript extends Script{

state = LuaL.newstate();
Lua.set_callbacks_function(cpp.Callable.fromStaticFunction(callback_handler));
LuaL.openlibs(state);
state.openlibs();
Lua.register_hxtrace_func(cpp.Callable.fromStaticFunction(print_function));
state.register_hxtrace_lib();

Expand Down Expand Up @@ -328,8 +330,13 @@ class LuaScript extends Script{
}

public function onPointerIndex(obj:Dynamic, key:String) {
if (obj != null)
return Reflect.getProperty(obj, key);
if (obj != null) {
if(obj is IHScriptCustomBehaviour)
return cast(obj, IHScriptCustomBehaviour).hget(key);
else
return Reflect.getProperty(obj, key);
}

return null;
}

Expand All @@ -345,8 +352,13 @@ class LuaScript extends Script{
public function onPointerNewIndex(obj:Dynamic, key:String, val:Dynamic) {
if (key == "__gc") return null;

if (obj != null)
Reflect.setProperty(obj, key, val);
if (obj != null) {
if(obj is IHScriptCustomBehaviour)
cast(obj, IHScriptCustomBehaviour).hset(key, val);
else
Reflect.setProperty(obj, key, val);
}

return null;
}

Expand Down
1 change: 1 addition & 0 deletions source/funkin/backend/scripting/lua/HScriptFunctions.hx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package funkin.backend.scripting.lua;

class HScriptFunctions {
//TODO: turn the hscript thing into a singleton
public static function getHScriptFunctions(?instance:MusicBeatState, ?script:Script):Map<String, Dynamic> {
#if ENABLE_LUA
return [
Expand Down
5 changes: 1 addition & 4 deletions source/funkin/backend/scripting/lua/LuaPlayState.hx
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package funkin.backend.scripting.lua;
#if ENABLE_LUA
import funkin.backend.assets.ModsFolder;
import funkin.backend.system.Conductor;
import funkin.backend.scripting.lua.LuaTools;
import funkin.backend.chart.ChartData.ChartEvent;
import funkin.game.PlayState;
import funkin.options.Options;
import flixel.util.typeLimit.OneOfThree;
import flixel.FlxG;

final class LuaPlayState {
Expand Down Expand Up @@ -80,7 +77,7 @@ final class LuaPlayState {
return [
"startCutscene" => function(prefix:String, ?cutsceneScriptPath:String) {
PlayState.instance.startCutscene(prefix, cutsceneScriptPath, () -> {
PlayState.instance.scripts.luaCall("onStartCutscene", []);
PlayState.instance.scripts.luaCall("onStartCutscene", [prefix]);
});
},
"callFunction" => function(func:String, ?args:Array<Dynamic>) {
Expand Down
17 changes: 16 additions & 1 deletion source/funkin/backend/scripting/lua/LuaTools.hx
Original file line number Diff line number Diff line change
Expand Up @@ -108,13 +108,28 @@ class LuaTools {
else if(instance.luaObjects["TEXT"].exists(name)) {
object = instance.luaObjects["TEXT"].get(name);
}
else if(instance.luaObjects["VIDEOS"].exists(name)) {
object = instance.luaObjects["VIDEOS"].get(name);
}
else if(object == null) {
object = Reflect.getProperty(instance, name);
}

return object;
}

public static function removeLuaObject(instance:MusicBeatState, name:String) {
if(instance.luaObjects["SPRITE"].exists(name)) {
instance.luaObjects["SPRITE"].remove(name);
}
else if(instance.luaObjects["TEXT"].exists(name)) {
instance.luaObjects["TEXT"].remove(name);
}
else if(instance.luaObjects["VIDEOS"].exists(name)) {
instance.luaObjects["VIDEOS"].remove(name);
}
}

public static function getEase(?ease:String = '')
{
return switch(ease.toLowerCase().trim()) {
Expand Down Expand Up @@ -169,7 +184,7 @@ class LuaTools {
}

public static function getColor(color:Dynamic):FlxColor {
return CoolUtil.getDefault(CoolUtil.getColorFromDynamic(color), FlxColor.BLACK);
return CoolUtil.getColorFromDynamic(color).getDefault(FlxColor.BLACK);
}
#end
}
5 changes: 2 additions & 3 deletions source/funkin/backend/scripting/lua/ShaderFunctions.hx
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
package funkin.backend.scripting.lua;
#if ENABLE_LUA
import funkin.backend.shaders.CustomShader;
import funkin.backend.scripting.lua.shaders.LuaShader;

final class ShaderFunctions {
public static function getShaderFunctions(instance:MusicBeatState, ?script:Script):Map<String, Dynamic> {
return [
"initShader" => function(name:String, ?glslVersion:Int = 120) {
"initShader" => function(name:String, shader:String, ?glslVersion:Int = 120) {
if(!Options.gameplayShaders) return;

if(instance.luaObjects["SHADER"].exists(name)) {
Logs.trace('Shader ${name} already initialized', WARNING);
return;
}

var cShader = new LuaShader(name, Std.string(glslVersion));
var cShader = new LuaShader(shader, Std.string(glslVersion));

instance.luaObjects["SHADER"].set(name, cShader);
cast(script, LuaScript).set(name, cShader);
Expand Down
Loading

0 comments on commit 2f3284c

Please sign in to comment.