mirror of
https://github.com/FunkinCrew/Funkin.git
synced 2024-11-27 01:55:52 -05:00
testing poyopoyo
This commit is contained in:
parent
883ef13e65
commit
6d0a8cc535
3 changed files with 259 additions and 0 deletions
99
source/funkin/graphics/framebuffer/FrameBuffer.hx
Normal file
99
source/funkin/graphics/framebuffer/FrameBuffer.hx
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
package funkin.graphics.framebuffer;
|
||||||
|
|
||||||
|
import openfl.geom.Rectangle;
|
||||||
|
import openfl.geom.Matrix;
|
||||||
|
import openfl.display.BitmapData;
|
||||||
|
import flixel.util.FlxColor;
|
||||||
|
import flixel.FlxCamera;
|
||||||
|
import openfl.Lib;
|
||||||
|
import openfl.display3D.textures.TextureBase;
|
||||||
|
|
||||||
|
class FrameBuffer
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The bitmap data of the frame buffer.
|
||||||
|
*/
|
||||||
|
public var bitmap(default, null):BitmapData = null;
|
||||||
|
|
||||||
|
var texture:TextureBase;
|
||||||
|
final camera:FlxCamera;
|
||||||
|
final spriteCopies:Array<SpriteCopy> = [];
|
||||||
|
|
||||||
|
public function new()
|
||||||
|
{
|
||||||
|
camera = new FlxCamera();
|
||||||
|
camera.bgColor = FlxColor.TRANSPARENT;
|
||||||
|
camera.flashSprite.cacheAsBitmap = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a frame buffer with the given size.
|
||||||
|
* @param width the width
|
||||||
|
* @param height the height
|
||||||
|
*/
|
||||||
|
public function create(width:Int, height:Int):Void
|
||||||
|
{
|
||||||
|
dispose();
|
||||||
|
final c3d = Lib.current.stage.context3D;
|
||||||
|
texture = c3d.createTexture(width, height, BGRA, true);
|
||||||
|
bitmap = BitmapData.fromTexture(texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes the internal camera follows the target camera.
|
||||||
|
* @param target the target camera
|
||||||
|
*/
|
||||||
|
public function follow(target:FlxCamera):Void
|
||||||
|
{
|
||||||
|
camera.scroll.copyFrom(target.scroll);
|
||||||
|
camera.setScale(target.scaleX, target.scaleY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Locks the frame buffer and clears the buffer.
|
||||||
|
*/
|
||||||
|
@:access(flixel.FlxCamera)
|
||||||
|
public function lock():Void
|
||||||
|
{
|
||||||
|
camera.clearDrawStack();
|
||||||
|
camera.canvas.graphics.clear();
|
||||||
|
camera.fill(camera.bgColor.to24Bit(), camera.useBgAlphaBlending, camera.bgColor.alphaFloat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders all sprite copies.
|
||||||
|
*/
|
||||||
|
public function render():Void
|
||||||
|
{
|
||||||
|
for (spriteCopy in spriteCopies)
|
||||||
|
{
|
||||||
|
spriteCopy.render(camera);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unlocks the frame buffer and makes the bitmap ready to use.
|
||||||
|
*/
|
||||||
|
@:access(flixel.FlxCamera)
|
||||||
|
public function unlock():Void
|
||||||
|
{
|
||||||
|
bitmap.fillRect(new Rectangle(0, 0, bitmap.width, bitmap.height), 0);
|
||||||
|
bitmap.draw(camera.flashSprite, new Matrix(1, 0, 0, 1, camera.flashSprite.x, camera.flashSprite.y));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dispose():Void
|
||||||
|
{
|
||||||
|
if (texture != null)
|
||||||
|
{
|
||||||
|
texture.dispose();
|
||||||
|
texture = null;
|
||||||
|
bitmap.dispose();
|
||||||
|
bitmap = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addSpriteCopy(spriteCopy:SpriteCopy):Void
|
||||||
|
{
|
||||||
|
spriteCopies.push(spriteCopy);
|
||||||
|
}
|
||||||
|
}
|
109
source/funkin/graphics/framebuffer/FrameBufferManager.hx
Normal file
109
source/funkin/graphics/framebuffer/FrameBufferManager.hx
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
package funkin.graphics.framebuffer;
|
||||||
|
|
||||||
|
import openfl.display.BitmapData;
|
||||||
|
import flixel.FlxSprite;
|
||||||
|
import flixel.FlxCamera;
|
||||||
|
|
||||||
|
class FrameBufferManager
|
||||||
|
{
|
||||||
|
final camera:FlxCamera;
|
||||||
|
final frameBufferMap:Map<String, FrameBuffer> = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a frame buffer manager that targets `camera`.
|
||||||
|
* @param camera the target camera.
|
||||||
|
*/
|
||||||
|
public function new(camera:FlxCamera)
|
||||||
|
{
|
||||||
|
this.camera = camera;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new frame buffer with a name.
|
||||||
|
* @param name the name
|
||||||
|
*/
|
||||||
|
public function createFrameBuffer(name:String):Void
|
||||||
|
{
|
||||||
|
if (frameBufferMap.exists(name))
|
||||||
|
{
|
||||||
|
FlxG.log.warn('frame buffer "$name" already exists');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
final fb = new FrameBuffer();
|
||||||
|
fb.create(camera.width, camera.height);
|
||||||
|
frameBufferMap[name] = fb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a copy of the sprite to the frame buffer.
|
||||||
|
* @param name the name of the frame buffer
|
||||||
|
* @param sprite the sprite
|
||||||
|
* @param color if this is not `-1`, the sprite will have the color while keeping its shape
|
||||||
|
*/
|
||||||
|
public function addSpriteTo(name:String, sprite:FlxSprite, color:Int = -1):Void
|
||||||
|
{
|
||||||
|
if (!frameBufferMap.exists(name))
|
||||||
|
{
|
||||||
|
createFrameBuffer(name);
|
||||||
|
}
|
||||||
|
frameBufferMap[name].addSpriteCopy(new SpriteCopy(sprite, color));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call this before everything is drawn.
|
||||||
|
*/
|
||||||
|
public function lock():Void
|
||||||
|
{
|
||||||
|
for (_ => fb in frameBufferMap)
|
||||||
|
{
|
||||||
|
fb.lock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders all the copies of the sprites. Make sure this is called between
|
||||||
|
* `lock` and `unlock`.
|
||||||
|
*/
|
||||||
|
public function render():Void
|
||||||
|
{
|
||||||
|
for (_ => fb in frameBufferMap)
|
||||||
|
{
|
||||||
|
fb.render();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* After calling this you can use bitmap data of all frame buffers.
|
||||||
|
*/
|
||||||
|
public function unlock():Void
|
||||||
|
{
|
||||||
|
for (_ => fb in frameBufferMap)
|
||||||
|
{
|
||||||
|
fb.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the bitmap data of the frame buffer
|
||||||
|
* @param name the name of the frame buffer
|
||||||
|
* @return the ready-to-use bitmap data
|
||||||
|
*/
|
||||||
|
public function getFrameBuffer(name:String):BitmapData
|
||||||
|
{
|
||||||
|
return frameBufferMap[name].bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disposes all frame buffers.
|
||||||
|
*/
|
||||||
|
public function dispose():Void
|
||||||
|
{
|
||||||
|
for (_ => fb in frameBufferMap)
|
||||||
|
{
|
||||||
|
fb.dispose();
|
||||||
|
}
|
||||||
|
frameBufferMap.clear();
|
||||||
|
}
|
||||||
|
}
|
51
source/funkin/graphics/framebuffer/SpriteCopy.hx
Normal file
51
source/funkin/graphics/framebuffer/SpriteCopy.hx
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
package funkin.graphics.framebuffer;
|
||||||
|
|
||||||
|
import flixel.FlxCamera;
|
||||||
|
import flixel.FlxSprite;
|
||||||
|
|
||||||
|
class SpriteCopy
|
||||||
|
{
|
||||||
|
final sprite:FlxSprite;
|
||||||
|
var color:Int;
|
||||||
|
|
||||||
|
public function new(sprite:FlxSprite, color:Int = -1)
|
||||||
|
{
|
||||||
|
this.sprite = sprite;
|
||||||
|
this.color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders the copy to the camera.
|
||||||
|
* @param camera the camera
|
||||||
|
*/
|
||||||
|
@:access(flixel.FlxSprite)
|
||||||
|
public function render(camera:FlxCamera):Void
|
||||||
|
{
|
||||||
|
final rMult = sprite.colorTransform.redMultiplier;
|
||||||
|
final gMult = sprite.colorTransform.greenMultiplier;
|
||||||
|
final bMult = sprite.colorTransform.blueMultiplier;
|
||||||
|
final aMult = sprite.colorTransform.alphaMultiplier;
|
||||||
|
final rOff = Std.int(sprite.colorTransform.redOffset);
|
||||||
|
final gOff = Std.int(sprite.colorTransform.greenOffset);
|
||||||
|
final bOff = Std.int(sprite.colorTransform.blueOffset);
|
||||||
|
final aOff = Std.int(sprite.colorTransform.alphaOffset);
|
||||||
|
final tmpCameras = sprite._cameras;
|
||||||
|
|
||||||
|
sprite._cameras = [camera];
|
||||||
|
|
||||||
|
if (color != -1)
|
||||||
|
{
|
||||||
|
final red = color >> 16 & 0xFF;
|
||||||
|
final green = color >> 8 & 0xFF;
|
||||||
|
final blue = color & 0xFF;
|
||||||
|
sprite.setColorTransform(0, 0, 0, 1, red, green, blue, 0);
|
||||||
|
}
|
||||||
|
sprite.draw();
|
||||||
|
|
||||||
|
sprite._cameras = tmpCameras;
|
||||||
|
if (color != -1)
|
||||||
|
{
|
||||||
|
sprite.setColorTransform(rMult, gMult, bMult, aMult, rOff, gOff, bOff, aOff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue