Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 15 additions & 8 deletions src/openfl/display/BitmapData.hx
Original file line number Diff line number Diff line change
Expand Up @@ -3223,17 +3223,20 @@ class BitmapData implements IBitmapDrawable
if (allowFramebuffer
&& __texture != null
&& __texture.__glFramebuffer != null
&& Lib.current.stage.__renderer.__type == OPENGL)
&& __texture.__context != null
&& __texture.__context.gl != null)
{
var renderer:OpenGLRenderer = cast Lib.current.stage.__renderer;
var context = renderer.__context3D;
var context = __texture.__context;

var color:ARGB = (color : ARGB);
var useScissor = !this.rect.equals(rect);

var cacheRTT = context.__state.renderToTexture;
var cacheRTTDepthStencil = context.__state.renderToTextureDepthStencil;
var cacheRTTAntiAlias = context.__state.renderToTextureAntiAlias;
var cacheRTTSurfaceSelector = context.__state.renderToTextureSurfaceSelector;
var cacheSE = context.__state.scissorEnabled;
var cacheSR = context.__state.scissorRectangle;

context.setRenderToTexture(__texture);

Expand All @@ -3258,11 +3261,6 @@ class BitmapData implements IBitmapDrawable

context.__clear(useScissor, color.r / 0xFF, color.g / 0xFF, color.b / 0xFF, transparent ? color.a / 0xFF : 1, 0, 0, Context3DClearMask.COLOR);

if (useScissor)
{
context.setScissorRectangle(null);
}

if (cacheRTT != null)
{
context.setRenderToTexture(cacheRTT, cacheRTTDepthStencil, cacheRTTAntiAlias, cacheRTTSurfaceSelector);
Expand All @@ -3271,6 +3269,15 @@ class BitmapData implements IBitmapDrawable
{
context.setRenderToBackBuffer();
}

if (cacheSE)
{
context.setScissorRectangle(cacheSR);
}
else
{
context.setScissorRectangle(null);
}
}
else if (readable)
{
Expand Down
109 changes: 43 additions & 66 deletions src/openfl/display/DisplayObjectShader.hx
Original file line number Diff line number Diff line change
Expand Up @@ -5,87 +5,64 @@ import openfl.utils.ByteArray;
class DisplayObjectShader extends Shader
{
@:glVertexHeader("attribute float openfl_Alpha;
attribute vec4 openfl_ColorMultiplier;
attribute vec4 openfl_ColorOffset;
attribute vec4 openfl_Position;
attribute vec2 openfl_TextureCoord;
attribute vec4 openfl_ColorMultiplier;
attribute vec4 openfl_ColorOffset;
attribute vec4 openfl_Position;
attribute vec2 openfl_TextureCoord;

varying float openfl_Alphav;
varying vec4 openfl_ColorMultiplierv;
varying vec4 openfl_ColorOffsetv;
varying vec2 openfl_TextureCoordv;
varying float openfl_Alphav;
varying vec4 openfl_ColorMultiplierv;
varying vec4 openfl_ColorOffsetv;
varying vec2 openfl_TextureCoordv;

uniform mat4 openfl_Matrix;
uniform bool openfl_HasColorTransform;
uniform vec2 openfl_TextureSize;")
@:glVertexBody("openfl_Alphav = openfl_Alpha;
openfl_TextureCoordv = openfl_TextureCoord;
uniform mat4 openfl_Matrix;
uniform bool openfl_HasColorTransform;
uniform vec2 openfl_TextureSize;")

if (openfl_HasColorTransform) {
@:glVertexBody("openfl_Alphav = openfl_Alpha;
openfl_TextureCoordv = openfl_TextureCoord;

openfl_ColorMultiplierv = openfl_ColorMultiplier;
openfl_ColorOffsetv = openfl_ColorOffset / 255.0;
if (openfl_HasColorTransform) {
openfl_ColorMultiplierv = openfl_ColorMultiplier;
openfl_ColorOffsetv = openfl_ColorOffset / 255.0;
}

}
gl_Position = openfl_Matrix * openfl_Position;")

gl_Position = openfl_Matrix * openfl_Position;")
@:glVertexSource("#pragma header
void main(void) {
#pragma body
}")

void main(void) {

#pragma body

}")
@:glFragmentHeader("varying float openfl_Alphav;
varying vec4 openfl_ColorMultiplierv;
varying vec4 openfl_ColorOffsetv;
varying vec2 openfl_TextureCoordv;

uniform bool openfl_HasColorTransform;
uniform sampler2D openfl_Texture;
uniform vec2 openfl_TextureSize;")
@:glFragmentBody("vec4 color = texture2D (openfl_Texture, openfl_TextureCoordv);

if (color.a == 0.0) {

gl_FragColor = vec4 (0.0, 0.0, 0.0, 0.0);

} else if (openfl_HasColorTransform) {

color = vec4 (color.rgb / color.a, color.a);
varying vec4 openfl_ColorMultiplierv;
varying vec4 openfl_ColorOffsetv;
varying vec2 openfl_TextureCoordv;

mat4 colorMultiplier = mat4 (0);
colorMultiplier[0][0] = openfl_ColorMultiplierv.x;
colorMultiplier[1][1] = openfl_ColorMultiplierv.y;
colorMultiplier[2][2] = openfl_ColorMultiplierv.z;
colorMultiplier[3][3] = 1.0; // openfl_ColorMultiplierv.w;
uniform bool openfl_HasColorTransform;
uniform vec2 openfl_TextureSize;
uniform sampler2D openfl_Texture;")

color = clamp (openfl_ColorOffsetv + (color * colorMultiplier), 0.0, 1.0);
@:glFragmentBody("vec4 color = texture2D(openfl_Texture, openfl_TextureCoordv);

if (color.a > 0.0) {
if (color.a == 0.0 || openfl_Alphav == 0.0) discard;
else if (openfl_HasColorTransform) {
color = vec4(color.rgb / color.a, color.a);
vec4 mult = vec4(openfl_ColorMultiplierv.rgb, 1.0);
color = clamp(openfl_ColorOffsetv + (color * mult), 0.0, 1.0);

gl_FragColor = vec4 (color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav);

} else {

gl_FragColor = vec4 (0.0, 0.0, 0.0, 0.0);

}

} else {

gl_FragColor = color * openfl_Alphav;
gl_FragColor = vec4(color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav);
if (color.a == 0.0) discard;
}
else {
gl_FragColor = color * openfl_Alphav;
}")

}")
@:glFragmentSource("#pragma header

void main(void) {

#pragma body

}")
public function new(code:ByteArray = null)
{
void main(void) {
#pragma body
}")
public function new(code:ByteArray = null) {
super(code);
}
}
7 changes: 7 additions & 0 deletions src/openfl/display/Graphics.hx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import openfl.display._internal.Context3DBuffer;
import openfl.display._internal.DrawCommandBuffer;
import openfl.display._internal.DrawCommandReader;
import openfl.display._internal.ShaderBuffer;
import openfl.display3D.Context3DCompareMode;
import openfl.display3D.IndexBuffer3D;
import openfl.display3D.VertexBuffer3D;
import openfl.errors.ArgumentError;
Expand Down Expand Up @@ -1566,6 +1567,12 @@ import js.html.CanvasRenderingContext2D;
__commands.overrideBlendMode(blendMode);
}

public function overrideDepthTest(depthTest:Bool = false, compareMode:Context3DCompareMode):Void
{
if (compareMode == null) compareMode = ALWAYS;
__commands.overrideDepthTest(depthTest, compareMode);
}

/**
Queries a Sprite or Shape object (and optionally, its children) for its vector
graphics content. The result is a Vector of IGraphicsData objects. Transformations
Expand Down
109 changes: 43 additions & 66 deletions src/openfl/display/GraphicsShader.hx
Original file line number Diff line number Diff line change
Expand Up @@ -5,87 +5,64 @@ import openfl.utils.ByteArray;
class GraphicsShader extends Shader
{
@:glVertexHeader("attribute float openfl_Alpha;
attribute vec4 openfl_ColorMultiplier;
attribute vec4 openfl_ColorOffset;
attribute vec4 openfl_Position;
attribute vec2 openfl_TextureCoord;
attribute vec4 openfl_ColorMultiplier;
attribute vec4 openfl_ColorOffset;
attribute vec4 openfl_Position;
attribute vec2 openfl_TextureCoord;

varying float openfl_Alphav;
varying vec4 openfl_ColorMultiplierv;
varying vec4 openfl_ColorOffsetv;
varying vec2 openfl_TextureCoordv;
varying float openfl_Alphav;
varying vec4 openfl_ColorMultiplierv;
varying vec4 openfl_ColorOffsetv;
varying vec2 openfl_TextureCoordv;

uniform mat4 openfl_Matrix;
uniform bool openfl_HasColorTransform;
uniform vec2 openfl_TextureSize;", true)
@:glVertexBody("openfl_Alphav = openfl_Alpha;
openfl_TextureCoordv = openfl_TextureCoord;
uniform mat4 openfl_Matrix;
uniform bool openfl_HasColorTransform;
uniform vec2 openfl_TextureSize;")

if (openfl_HasColorTransform) {
@:glVertexBody("openfl_Alphav = openfl_Alpha;
openfl_TextureCoordv = openfl_TextureCoord;

openfl_ColorMultiplierv = openfl_ColorMultiplier;
openfl_ColorOffsetv = openfl_ColorOffset / 255.0;
if (openfl_HasColorTransform) {
openfl_ColorMultiplierv = openfl_ColorMultiplier;
openfl_ColorOffsetv = openfl_ColorOffset / 255.0;
}

}
gl_Position = openfl_Matrix * openfl_Position;")

gl_Position = openfl_Matrix * openfl_Position;")
@:glVertexSource("#pragma header
void main(void) {
#pragma body
}")

void main(void) {

#pragma body

}")
@:glFragmentHeader("varying float openfl_Alphav;
varying vec4 openfl_ColorMultiplierv;
varying vec4 openfl_ColorOffsetv;
varying vec2 openfl_TextureCoordv;

uniform bool openfl_HasColorTransform;
uniform vec2 openfl_TextureSize;
uniform sampler2D bitmap;", true)
@:glFragmentBody("vec4 color = texture2D (bitmap, openfl_TextureCoordv);

if (color.a == 0.0) {

gl_FragColor = vec4 (0.0, 0.0, 0.0, 0.0);

} else if (openfl_HasColorTransform) {

color = vec4 (color.rgb / color.a, color.a);
varying vec4 openfl_ColorMultiplierv;
varying vec4 openfl_ColorOffsetv;
varying vec2 openfl_TextureCoordv;

mat4 colorMultiplier = mat4 (0);
colorMultiplier[0][0] = openfl_ColorMultiplierv.x;
colorMultiplier[1][1] = openfl_ColorMultiplierv.y;
colorMultiplier[2][2] = openfl_ColorMultiplierv.z;
colorMultiplier[3][3] = 1.0; // openfl_ColorMultiplierv.w;
uniform bool openfl_HasColorTransform;
uniform vec2 openfl_TextureSize;
uniform sampler2D bitmap;")

color = clamp (openfl_ColorOffsetv + (color * colorMultiplier), 0.0, 1.0);
@:glFragmentBody("vec4 color = texture2D(bitmap, openfl_TextureCoordv);

if (color.a > 0.0) {
if (color.a == 0.0 || openfl_Alphav == 0.0) discard;
else if (openfl_HasColorTransform) {
color = vec4(color.rgb / color.a, color.a);
vec4 mult = vec4(openfl_ColorMultiplierv.rgb, 1.0);
color = clamp(openfl_ColorOffsetv + (color * mult), 0.0, 1.0);

gl_FragColor = vec4 (color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav);

} else {

gl_FragColor = vec4 (0.0, 0.0, 0.0, 0.0);

}

} else {

gl_FragColor = color * openfl_Alphav;
gl_FragColor = vec4(color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav);
if (color.a == 0.0) discard;
}
else {
gl_FragColor = color * openfl_Alphav;
}")

}", true)
@:glFragmentSource("#pragma header

void main(void) {

#pragma body

}")
public function new(code:ByteArray = null)
{
void main(void) {
#pragma body
}")
public function new(code:ByteArray = null) {
super(code);
}
}
Loading