JD2022-TU1/main/extern/Camcam/LIBS/Render/OGL_AE.cpp

569 lines
16 KiB
C++

#include "OGL_Class.h"
#include "Rrasters.h"
void CopyFrameBufferToTexture(int x, int y, int w, int h, int textW, int textH);
/*
ulType =
0 -> Blur
1 -> RadialBlur
2 -> Zoom Smooth
3 -> Invert
4 -> GodRay
5 -> ZColor
6 -> Alpha To Color
7 -> Erosion
8 -> Contrast
9 -> Brightness
10 -> Multiply by Factor1
11 -> Add Factor1
12 -> mul Factor1=R Factor2=G Factor3=B
13 -> AlphaPremult Pass
*/
void OGL_DI::AfterEffect(u32 ulType,u32 Color,float Factor1,float Factor2,float Factor3 ,float Factor4 ,float Factor5 )
{
START_RASTER(AE_Effects);
if (ulType == 8) // Contrast
{
if (Factor1 <= 1.0f)
{
AfterEffect(3,0,0.5f - Factor1,0,0,0,0);
} else
{
while (Factor1 >= 2.0f)
{
AfterEffect(3,0,1.0f,0,0,0,0); // Invert
AfterEffect(11,0,0.25f,0.25f,0.25f,0,0); // Add 0.25f -> INVERT = SUB 0.25f
AfterEffect(3,0,1.0f,0,0,0,0); // Invert
AfterEffect(10,0,2.f,0,0,0,0); // Multiply 0.5f
Factor1 /= 2.0f;
}
AfterEffect(3,0,1.0f,0,0,0,0); // Invert
AfterEffect(11,0,(Factor1 - 1.0f) / 4.0f,(Factor1 - 1.0f) / 4.0f,(Factor1 - 1.0f) / 4.0f,0,0); // Add 0.25f -> INVERT = SUB 0.25f
AfterEffect(3,0,1.0f,0,0,0,0); // Invert
AfterEffect(10,0,Factor1,0,0,0,0); // Multiply
}
STOP_RASTER(AE_Effects)
return;
}
if (ulType == 9) // Brightness
{
if (Factor1 < 1.0f)
{
AfterEffect(10,0,Factor1,0,0,0,0);
} else
{
AfterEffect(3,0,1.0f,0,0,0,0); // Invert
AfterEffect(10,0,1.0f - (Factor1 - 1.f),0,0,0,0); // Multiply
AfterEffect(3,0,1.0f,0,0,0,0); // Invert
}
STOP_RASTER(AE_Effects)
return;
}
s32 AreaX = CurrentRect.right - CurrentRect.left;
s32 AreaY = CurrentRect.bottom - CurrentRect.top;
float ConvoleRevolution = 0.666666f;
u32 SavePicking;
SavePicking = PickingEnable;
PickingEnable = 0;
if (ulType != 5) Color = 0xffffffff;
// if (ulType == 2) ulType = 4;
SAVE_MATRIXES();
{
float Viewport[4];
glGetFloatv(GL_VIEWPORT,Viewport);
float UVMatrix[] = {1,0,0,1,0,0};
float CX,CY,YC;
UVMatrix[0] = Viewport[2] / (float)AreaX;
UVMatrix[3] = Viewport[3] / (float)AreaY;
UVMatrix[4] = Viewport[0] / (float)AreaX;
UVMatrix[5] = Viewport[1] / (float)AreaY;
CX = (float)AreaX / OGLTextureSizeX;
CY = (float)AreaY / OGLTextureSizeY;
GLfloat Persp2[16]= {
CX*UVMatrix[0], CX*UVMatrix[1], 0, 0,
CY*UVMatrix[2], CY*UVMatrix[3], 0, 0,
0, 0, 1, 0,
CX*UVMatrix[4], CY*UVMatrix[5], 0, 1,
};
SetMatrix(GL_TEXTURE,Persp2);
}
/* Save front buffer */
float Coef = (float)AreaY/(float)AreaX;
RS DefaultRS;
GLOB_SetDefaultRS(&DefaultRS);
DefaultRS.BACKFACE = 0;
DefaultRS.NOZTEST = 1;
DefaultRS.NOZWRITE = 1;
DefaultRS.HIDECOLOR = 1;
DefaultRS.HIDEALPHA = 0;
Matrix(NULL);
if (ulType == 13) // AlphaPremult
{
DefaultRS.BlendingMode = 1; // Alpha
Matrix(NULL);
Ortho();
DefaultRS.HIDECOLOR = 0;
DefaultRS.HIDEALPHA = 1;
SetRS(&DefaultRS,-1);
glBlendFunc(GL_ZERO,GL_DST_ALPHA);
u32 ColorM = 0xffffffff;
DrawQuad(ColorM,-1.0f, 1.0f * Coef ,+2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
PickingEnable = SavePicking;
RESTORE_MATRIXES();
STOP_RASTER(AE_Effects)
return;
} else
if (ulType == 11) // Add Factor1 (factor is in [0,1]) -> ONLY Brighter
{
DefaultRS.BlendingMode = 1; // Alpha
Matrix(NULL);
Ortho();
DefaultRS.HIDECOLOR = 0;
DefaultRS.HIDEALPHA = 0;
SetRS(&DefaultRS,-1);
glBlendFunc(GL_ONE,GL_ONE);
if (Factor1 > 1.0) Factor1 = 1.0f;
if (Factor1 < 0.0) Factor1 = 0.0f;
if (Factor2 > 1.0) Factor2 = 1.0f;
if (Factor2 < 0.0) Factor2 = 0.0f;
if (Factor3 > 1.0) Factor3 = 1.0f;
if (Factor3 < 0.0) Factor3 = 0.0f;
u32 ColorM = Factor1 * 255.0f;
ColorM |= (u32)(Factor2*255.0f) << 8;
ColorM |= (u32)(Factor3*255.0f) << 16;
ColorM |= 0xff000000;
DrawQuad(ColorM,-1.0f, 1.0f * Coef ,+2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
PickingEnable = SavePicking;
RESTORE_MATRIXES();
STOP_RASTER(AE_Effects)
return;
} else
if ((ulType == 10)||(ulType == 12)) // Multiply by Factor1 (factor is in [0,2])
{
DefaultRS.BlendingMode = 1; // Alpha
Matrix(NULL);
Ortho();
DefaultRS.HIDECOLOR = 0;
DefaultRS.HIDEALPHA = 0;
SetRS(&DefaultRS,-1);
if (ulType == 10)
{
Factor3 = Factor2 = Factor1;
}
if (Factor1 > 1.0f)
{
glBlendFunc(GL_DST_COLOR,GL_ONE);
Factor1 = Factor1 - 1.0f;
Factor2 = Factor2 - 1.0f;
Factor3 = Factor3 - 1.0f;
}
else
glBlendFunc(GL_ZERO,GL_SRC_COLOR);
if (Factor1 > 1.0) Factor1 = 1.0f;
if (Factor1 < 0.0) Factor1 = 0.0f;
if (Factor2 > 1.0) Factor2 = 1.0f;
if (Factor2 < 0.0) Factor2 = 0.0f;
if (Factor3 > 1.0) Factor3 = 1.0f;
if (Factor3 < 0.0) Factor3 = 0.0f;
u32 ColorM;
ColorM = Factor1 * 255.0f;
ColorM |= (u32)(Factor2 * 255.0f) << 8;
ColorM |= (u32)(Factor3 * 255.0f) << 16;
ColorM |= 0xff000000;
DrawQuad(ColorM,-1.0f, 1.0f * Coef ,+2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
PickingEnable = SavePicking;
RESTORE_MATRIXES();
STOP_RASTER(AE_Effects)
return;
} else
if (ulType == 6) // Color 2 Alpha
{
DefaultRS.BlendingMode = 1; // Alpha
Matrix(NULL);
Ortho();
DefaultRS.HIDECOLOR = 0;
DefaultRS.HIDEALPHA = 0;
SetRS(&DefaultRS,-1);
if (Factor1)
glBlendFunc(GL_ONE_MINUS_DST_ALPHA,GL_ZERO);
else
glBlendFunc(GL_DST_ALPHA,GL_ZERO);
DrawQuad(0xffffffff,-1.0f, 1.0f * Coef ,+2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
PickingEnable = SavePicking;
RESTORE_MATRIXES();
STOP_RASTER(AE_Effects)
return;
} else
if (ulType == 5) // ZColor
{
RS DefaultRS;
GLOB_SetDefaultRS(&DefaultRS);
DefaultRS.BACKFACE = 0;
DefaultRS.NOZTEST = 0;
DefaultRS.NOZWRITE = 1;
DefaultRS.HIDECOLOR = 0;
DefaultRS.HIDEALPHA = 0;
SetRS(&DefaultRS,-1);
if (Factor1 > 0.0) glDepthFunc(GL_LEQUAL);
Factor1 = fabs(Factor1);
Perspective(-1.0f);
float SaveCZ;
SaveCZ = ZQuad;
ZQuad = Factor1;
DrawQuad(Color,-1,1,2,-2,0.0f,0.0f,1.0f,1.0f/*,Factor1*/);
ZQuad = SaveCZ;
glDepthFunc(GL_GEQUAL);
PickingEnable = SavePicking;
RESTORE_MATRIXES();
STOP_RASTER(AE_Effects)
return;
} else
if (ulType == 18) // Invert Alpha
{
DefaultRS.BlendingMode = 1; // Alpha
Matrix(NULL);
Ortho();
DefaultRS.HIDECOLOR = 1;
DefaultRS.HIDEALPHA = 0;
SetRS(&DefaultRS,-1);
glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);
u32 Color2;
if (Factor1 > 1.0f) Factor1 = 1.0f;
if (Factor1 < 0.0f) Factor1 = 0.0f;
Color2 = Factor1*255.0f;
Color2 |= Color2 <<8;
Color2 |= Color2 <<16;
DrawQuad(Color2,-1.0f, 1.0f * Coef ,+2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
PickingEnable = SavePicking;
RESTORE_MATRIXES();
STOP_RASTER(AE_Effects)
return;
}
Ortho();
SetRS(&DefaultRS,-1);
DrawQuad(0xffffffff,-1.0f, +1.0f * Coef,2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
if (ulType == 4) // GODEAY
{
glEnable(GL_TEXTURE_2D);
ValidateLayer(NUMBER_OF_WORKING_REF - 3);
CopyFrameBufferToTexture(ActivRect.left , ActivRect.top , ActivRect.left , ActivRect.top , ActivRect.right - ActivRect.left, ActivRect.bottom - ActivRect.top);
//YTEST glCopyTexSubImage2D(GL_TEXTURE_2D, 0 , ActivRect.left , ActivRect.top , ActivRect.left , ActivRect.top , ActivRect.right - ActivRect.left, ActivRect.bottom - ActivRect.top);
}
DefaultRS.HIDECOLOR = 0;
DefaultRS.HIDEALPHA = 1;
if (ulType == 3) // Invert
{
DefaultRS.BlendingMode = 1; // Alpha
Matrix(NULL);
Ortho();
SetRS(&DefaultRS,-1);
glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_SRC_ALPHA);
u32 Color2;
if (Factor1 > 1.0f) Factor1 = 1.0f;
if (Factor1 < 0.0f) Factor1 = 0.0f;
Color2 = Factor1*255.0f;
Color2 |= Color2 <<8;
Color2 |= Color2 <<16;
Color2 ^= 0xff000000;
DrawQuad(Color2,-1.0f, 1.0f * Coef ,+2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
FORCE_RENDER_FLAG |= 4;
} else
{
float BlurFactoC;
glEnable(GL_TEXTURE_2D);
ValidateLayer(NUMBER_OF_WORKING_REF - 2);
CopyFrameBufferToTexture(ActivRect.left , ActivRect.top , ActivRect.left , ActivRect.top , ActivRect.right - ActivRect.left, ActivRect.bottom - ActivRect.top);
//YTEST glCopyTexSubImage2D(GL_TEXTURE_2D, 0 , ActivRect.left , ActivRect.top , ActivRect.left , ActivRect.top , ActivRect.right - ActivRect.left, ActivRect.bottom - ActivRect.top);
BlurFactoC = Factor1;
if (ulType == 1) // RadialBlur
BlurFactoC = sqrt((Factor1 * Factor1 + Factor2 * Factor2));
while (abs(BlurFactoC) > 1.0f / 512.0f)
{
DefaultRS.BlendingMode = 1; // Alpha
if (ulType == 7)// Erosion
DefaultRS.BlendingMode = 5; // Erosion = Multiply
Matrix(NULL);
Ortho();
SetRS(&DefaultRS,-1);
glEnable(GL_TEXTURE_2D);
ValidateLayer(NUMBER_OF_WORKING_REF - 2);
if ((ulType == 0) || (ulType == 7))// Blurdddd or Erosion
{
/* method 1*/
DrawQuad(0xFFffffff,-1.0f+BlurFactoC, +1.0f * Coef,2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
DrawQuad(0x80ffffff,-1.0f ,BlurFactoC + 1.0f * Coef,+2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
DrawQuad(0x55ffffff,-1.0f-BlurFactoC, +1.0f * Coef,2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
DrawQuad(0x3Fffffff,-1.0f , +-BlurFactoC + 1.0f * Coef,2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
BlurFactoC *= 0.5f;
} else
if (ulType == 1) // RadialBlur
{
DrawQuad(0xFFffffff,-1.0f+Factor1, 1.0f * Coef +Factor2,2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
DrawQuad(0x80ffffff,-1.0f-Factor1, 1.0f * Coef -Factor2,+2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
Factor1*= 0.5f;
Factor2*= 0.5f;
BlurFactoC *= 0.5f;
} else
if (ulType == 2) // ZoomSmooth
{
float X1,Y1,X2,Y2;
X1 = -1.0f + BlurFactoC * Factor2 ;
X2 = +1.0f - BlurFactoC * (1.0f - Factor2) ;
Y1 = -1.0f + BlurFactoC * Factor3 ;
Y2 = +1.0f - BlurFactoC * (1.0f - Factor3) ;
DrawQuad(0xFFffffff,X1, -Y1* Coef,X2 - X1, -(Y2-Y1) * Coef,0.0f,0.0f,1.0f,1.0f);
X1 = -1.0f - BlurFactoC * Factor2 ;
X2 = +1.0f + BlurFactoC * (1.0f - Factor2);
Y1 = -1.0f - BlurFactoC * Factor3;
Y2 = +1.0f + BlurFactoC * (1.0f - Factor3);
DrawQuad(0x80ffffff,X1, -Y1* Coef,X2 - X1, -(Y2-Y1) * Coef,0.0f,0.0f,1.0f,1.0f);
BlurFactoC *= 0.5f;
} else
if (ulType == 4) // GODEAY
{
float X1,Y1,X2,Y2;
static u32 V1 = 0xFFffffff;
static u32 V2 = 0x80ffffff;
static u32 V3 = 0x80ffffff;
DefaultRS.BlendingMode = 1; // ADD
SetRS(&DefaultRS,-1);
glEnable(GL_TEXTURE_2D);
ValidateLayer(NUMBER_OF_WORKING_REF - 2);
X1 = -1.0f;
X2 = +1.0f;
Y1 = -1.0f;
Y2 = +1.0f;
DrawQuad(V1,X1, -Y1* Coef,X2 - X1, -(Y2-Y1) * Coef,0.0f,0.0f,1.0f,1.0f);
DefaultRS.BlendingMode = 1; // ADD
SetRS(&DefaultRS,-1);
glEnable(GL_TEXTURE_2D);
ValidateLayer(NUMBER_OF_WORKING_REF - 2);
V2 = 0x00ffffff;
V2 |= ((int)(ConvoleRevolution * 255.0f) << 24);
V2 ^= 0xff000000;
ConvoleRevolution = (ConvoleRevolution - 0.5f) * 0.5f + 0.5f;
X1 = -1.0f - BlurFactoC * Factor2;
X2 = +1.0f + BlurFactoC * (1.0f - Factor2);
Y1 = -1.0f - BlurFactoC * Factor3;
Y2 = +1.0f + BlurFactoC * (1.0f - Factor3);
DrawQuad(V2,X1, -Y1* Coef,X2 - X1, -(Y2-Y1) * Coef,0.0f,0.0f,1.0f,1.0f);
BlurFactoC *= 0.5f;
}
CopyFrameBufferToTexture(ActivRect.left , ActivRect.top , ActivRect.left , ActivRect.top , ActivRect.right - ActivRect.left, ActivRect.bottom - ActivRect.top);
//YTEST glCopyTexSubImage2D(GL_TEXTURE_2D, 0 , ActivRect.left , ActivRect.top , ActivRect.left , ActivRect.top , ActivRect.right - ActivRect.left, ActivRect.bottom - ActivRect.top);
}
}
if (ulType == 4) // GODEAY
{
float X1,Y1,X2,Y2;
u32 V1 = 0xFFffffff;
DefaultRS.BlendingMode = 0; // ADD
SetRS(&DefaultRS,-1);
glEnable(GL_TEXTURE_2D);
ValidateLayer(NUMBER_OF_WORKING_REF - 3);
X1 = -1.0f;
X2 = +1.0f;
Y1 = -1.0f;
Y2 = +1.0f;
DrawQuad(V1,X1, -Y1* Coef,X2 - X1, -(Y2-Y1) * Coef,0.0f,0.0f,1.0f,1.0f);
DefaultRS.BlendingMode = 2; // ADD
SetRS(&DefaultRS,-1);
glEnable(GL_TEXTURE_2D);
ValidateLayer(NUMBER_OF_WORKING_REF - 2);
if (Factor4 < 0) Factor4 = 0;
if (Factor4 > 1.0) Factor4 = 1.0f;
V1 = (u32)(Factor4 * 255.0f);
V1 |= V1 <<8;
V1 |= V1 <<8;
DrawQuad(V1,X1, -Y1* Coef,X2 - X1, -(Y2-Y1) * Coef,0.0f,0.0f,1.0f,1.0f);
}
PickingEnable = SavePicking;
RESTORE_MATRIXES();
STOP_RASTER(AE_Effects);
FORCE_RENDER_FLAG |= 4;
}
/*
AE_LayerSave = 0
AE_LayerBlend = 1
AE_LayerScreen = 2
AE_LayerMultiply = 3
AE_LayerPrviousAlpha = 4
AE_LayerCopy = 5
//*/
void OGL_DI::LayerOperation(u32 ulType,u32 SlotIndex,u32 Color,float Factor1,float Factor2)
{
START_RASTER(AE_Layer);
s32 AreaX = CurrentRect.right - CurrentRect.left;
s32 AreaY = CurrentRect.bottom - CurrentRect.top;
u32 SavePicking;
SavePicking = PickingEnable;
PickingEnable = 0;
SAVE_MATRIXES();
{
float Viewport[4];
glGetFloatv(GL_VIEWPORT,Viewport);
float UVMatrix[] = {1,0,0,1,0,0};
float CX,CY,YC;
if (ulType != 20)
{
UVMatrix[0] = Viewport[2] / (float)AreaX;
UVMatrix[3] = Viewport[3] / (float)AreaY;
UVMatrix[4] = Viewport[0] / (float)AreaX;
UVMatrix[5] = Viewport[1] / (float)AreaY;
} else ulType = 1;
CX = (float)AreaX / OGLTextureSizeX;
CY = (float)AreaY / OGLTextureSizeY;
GLfloat Persp2[16]= { CX*UVMatrix[0], CX*UVMatrix[1], 0, 0,
CY*UVMatrix[2], CY*UVMatrix[3], 0, 0,
0, 0, 1, 0,
CX*UVMatrix[4], CY*UVMatrix[5], 0, 1};
SetMatrix(GL_TEXTURE,Persp2);
}
RS DefaultRS;
GLOB_SetDefaultRS(&DefaultRS);
DefaultRS.BACKFACE = 0;
DefaultRS.NOZTEST = 1;
DefaultRS.NOZWRITE = 1;
DefaultRS.HIDECOLOR = 0;
DefaultRS.HIDEALPHA = 0;
if (QuadHideColor & 1) DefaultRS.HIDECOLOR = 1;
if (QuadHideColor & 2) DefaultRS.HIDEALPHA = 1;
Matrix(NULL);
Ortho();
if (SlotIndex >= NUMBER_OF_OGL_WORKING_REF ) SlotIndex = NUMBER_OF_OGL_WORKING_REF - 1;
float Coef = (float)AreaY/(float)AreaX;
switch (ulType)
{
case 0: // Save
if (Color)
{
DefaultRS.HIDECOLOR = 1;
SetRS(&DefaultRS,-1);
DrawQuad(0xffffffff,-1.0f, +1.0f * Coef,2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
DefaultRS.HIDECOLOR = 0;//*/ // TEST YOUSS
}
SetRS(&DefaultRS,-1);
ValidateLayer(SlotIndex);
CopyFrameBufferToTexture(ActivRect.left , ActivRect.top , ActivRect.left , ActivRect.top , ActivRect.right - ActivRect.left, ActivRect.bottom - ActivRect.top);
//YTEST glCopyTexSubImage2D(GL_TEXTURE_2D, 0 , ActivRect.left , ActivRect.top , ActivRect.left , ActivRect.top , ActivRect.right - ActivRect.left, ActivRect.bottom - ActivRect.top);
break;
case 1: // Blend
DefaultRS.BlendingMode = 1; // Alpha
SetRS(&DefaultRS,-1);
ValidateLayer(SlotIndex);
if (Factor1<0) Factor1 = 0;
if (Factor1>1.0f) Factor1 = 1.0f;
Factor1 = 1.0f - Factor1;
Color = (u32)(255.0f * Factor1)<<24;
Color |= 0xffffff;
DrawQuad(Color,-1.0f, +1.0f * Coef,2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
break;
case 5: // COPY
DefaultRS.BlendingMode = 0; // Copy
SetRS(&DefaultRS,-1);
ValidateLayer(SlotIndex);
DrawQuad(0xffffffff,-1.0f, +1.0f * Coef,2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
break;
case 2: // Screen
DefaultRS.BlendingMode = 2; // Add
SetRS(&DefaultRS,-1);
ValidateLayer(SlotIndex);
if (Factor1<0) Factor1 = 0;
if (Factor1>1.0f) Factor1 = 1.0f;
Color = 255.0f * Factor1;
Color |= Color << 8;
Color |= Color << 8;
DrawQuad(Color,-1.0f, +1.0f * Coef,2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
break;
case 3: // Multiply
DefaultRS.BlendingMode = 5; // Multiply
SetRS(&DefaultRS,-1);
ValidateLayer(SlotIndex);
if (Factor1<0) Factor1 = 0;
if (Factor1>1.0f) Factor1 = 1.0f;
DrawQuad(0xffffffff,-1.0f, +1.0f * Coef,2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
break;
case 4: // AlphaDest
DefaultRS.BlendingMode = 4; // PreviousAlpha
SetRS(&DefaultRS,-1);
ValidateLayer(SlotIndex);
if (Factor1<0) Factor1 = 0;
if (Factor1>1.0f) Factor1 = 1.0f;
DrawQuad(0xffffffff,-1.0f, +1.0f * Coef,2.0f, -2.0f * Coef,0.0f,0.0f,1.0f,1.0f);
break;
}
PickingEnable = SavePicking;
RESTORE_MATRIXES();
STOP_RASTER(AE_Layer);
}