mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
Rainbow: WinGL..
git-svn-id: svn://ultimatepp.org/upp/trunk@3713 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
595e7599de
commit
ca3e94e286
4 changed files with 117 additions and 112 deletions
|
|
@ -8,8 +8,6 @@ void printShaderInfoLog(GLuint obj, const char* fileName)
|
|||
int infoLength = 0;
|
||||
int charsWritten = 0;
|
||||
|
||||
DeleteFile(fileName);
|
||||
|
||||
glGetShaderiv(obj, GL_INFO_LOG_LENGTH, &infoLength);
|
||||
|
||||
if(infoLength > 1)
|
||||
|
|
@ -30,8 +28,6 @@ void printProgramInfoLog(GLuint obj, const char* fileName)
|
|||
int infoLength = 0;
|
||||
int charsWritten = 0;
|
||||
|
||||
DeleteFile(fileName);
|
||||
|
||||
glGetProgramiv(obj, GL_INFO_LOG_LENGTH, &infoLength);
|
||||
|
||||
if(infoLength > 1)
|
||||
|
|
@ -65,129 +61,121 @@ bool checkGLError()
|
|||
unsigned int lastError = glGetError();
|
||||
if(GL_NO_ERROR != lastError)
|
||||
{
|
||||
switch(lastError)
|
||||
{
|
||||
case GL_INVALID_ENUM:
|
||||
RLOG("GL_INVALID_ENUM");
|
||||
break;
|
||||
case GL_INVALID_VALUE:
|
||||
RLOG("GL_INVALID_VALUE");
|
||||
break;
|
||||
case GL_INVALID_OPERATION:
|
||||
RLOG("GL_INVALID_OPERATION");
|
||||
break;
|
||||
case GL_STACK_OVERFLOW:
|
||||
RLOG("GL_STACK_OVERFLOW");
|
||||
break;
|
||||
case GL_STACK_UNDERFLOW:
|
||||
RLOG("GL_STACK_UNDERFLOW");
|
||||
break;
|
||||
case GL_OUT_OF_MEMORY:
|
||||
RLOG("GL_OUT_OF_MEMORY");
|
||||
break;
|
||||
}
|
||||
error = (const char*) gluErrorString(lastError);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IsProgramCompiled(int program)
|
||||
{
|
||||
GLint result = GL_FALSE;
|
||||
glGetShaderiv(program, GL_COMPILE_STATUS, &result);
|
||||
return result == GL_TRUE;
|
||||
}
|
||||
|
||||
int CompileProgram(const char* frag, const char* vert)
|
||||
{
|
||||
const GLchar* vertexShaderSrc = (const GLchar*) vert;
|
||||
const GLchar* fragmentShaderSrc = (const GLchar*) frag;
|
||||
|
||||
DeleteFile("shader_vertex.log");
|
||||
DeleteFile("shader_fragment.log");
|
||||
DeleteFile("shader_link.log");
|
||||
DeleteFile("shader_validation.log");
|
||||
|
||||
int program = glCreateProgram();
|
||||
|
||||
GLenum vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
||||
GLenum fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
|
||||
glShaderSource(vertexShader, 1, &vertexShaderSrc, NULL);
|
||||
if(!checkGLError())
|
||||
return -1;
|
||||
glShaderSource(fragmentShader, 1, &fragmentShaderSrc, NULL);
|
||||
if(!checkGLError())
|
||||
return -2;
|
||||
glCompileShader(vertexShader);
|
||||
if(!checkGLError())
|
||||
if(!IsProgramCompiled(vertexShader))
|
||||
{
|
||||
error = "Vertex shader compilation error (see shader_vertex.log)";
|
||||
printShaderInfoLog(vertexShader, "shader_vertex.log");
|
||||
return -3;
|
||||
}
|
||||
glShaderSource(fragmentShader, 1, &fragmentShaderSrc, NULL);
|
||||
glCompileShader(fragmentShader);
|
||||
if(!checkGLError())
|
||||
if(!IsProgramCompiled(fragmentShader))
|
||||
{
|
||||
error = "Fragment shader compilation error (see shader_fragment.log)";
|
||||
printShaderInfoLog(fragmentShader, "shader_fragment.log");
|
||||
return -4;
|
||||
}
|
||||
glAttachShader(program, vertexShader);
|
||||
if(!checkGLError())
|
||||
return -5;
|
||||
glAttachShader(program, fragmentShader);
|
||||
if(!checkGLError())
|
||||
return -6;
|
||||
glLinkProgram(program);
|
||||
if(!checkGLError())
|
||||
return -7;
|
||||
|
||||
printShaderInfoLog(vertexShader, "vertex.log");
|
||||
printShaderInfoLog(fragmentShader, "fragment.log");
|
||||
printProgramInfoLog(program, "program.log");
|
||||
printProgramValidationLog(program, "programv.log");
|
||||
//if(!IsProgramCompiled(program)) /* ATI always reports validation warning */
|
||||
{
|
||||
printProgramInfoLog(program, "shader_link.log");
|
||||
printProgramValidationLog(program, "shader_validation.log");
|
||||
//return -7;
|
||||
}
|
||||
|
||||
return program;
|
||||
}
|
||||
|
||||
const String fragAlphaMag = "\
|
||||
uniform sampler2D textMap; \
|
||||
uniform vec4 textColor; \
|
||||
\
|
||||
float alphaThreshold = 0.5;\
|
||||
float distanceScale = 15.0;\
|
||||
\
|
||||
float outlineOuter = 0.3;\
|
||||
float outlineInner = 0.1;\
|
||||
vec4 outlineColor = vec4(0, 0, 0, 1);\
|
||||
\
|
||||
float glowOffsetX = 0.005;\
|
||||
float glowOffsetY = 0.005;\
|
||||
float glowStart = .7;\
|
||||
float glowEnd = 0.5;\
|
||||
vec4 glowColor = vec4(0.0, 0.0, 0.0, 1.0);\
|
||||
\
|
||||
void main()\
|
||||
{\
|
||||
vec4 color = texture2D(textMap, gl_TexCoord[0].xy);\
|
||||
float distanceFactor = color.a;\
|
||||
\
|
||||
float width = fwidth(gl_TexCoord[0].xy) * distanceScale;\
|
||||
\
|
||||
/*float outlineMin1 = outlineOuter + width * 2.0;\
|
||||
float outlineMax1 = outlineInner + width * 2.0;\
|
||||
\
|
||||
if (distanceFactor > outlineOuter && distanceFactor < outlineMax1)\
|
||||
{\
|
||||
float outlineAlpha;\
|
||||
\
|
||||
if (distanceFactor <= outlineMin1)\
|
||||
outlineAlpha = smoothstep(outlineOuter, outlineMin1, distanceFactor);\
|
||||
else\
|
||||
outlineAlpha = smoothstep(outlineMax1, outlineInner, distanceFactor);\
|
||||
\
|
||||
color = mix(color, outlineColor, outlineAlpha);\
|
||||
}*/\
|
||||
\
|
||||
color.rgb = textColor.rgb; \
|
||||
color.a = smoothstep(alphaThreshold - width, alphaThreshold + width, distanceFactor);\
|
||||
\
|
||||
/*vec2 glowOffset = vec2(-glowOffsetX, -glowOffsetY);\
|
||||
float glowDistance = texture2D(textMap, gl_TexCoord[0].xy + glowOffset).a;\
|
||||
float glowFactor = smoothstep(glowStart, glowEnd, glowDistance);\
|
||||
\
|
||||
color = mix(vec4(glowColor.rgb, glowFactor), color, color.a);*/\
|
||||
\
|
||||
gl_FragColor = color;\
|
||||
}\
|
||||
";
|
||||
const String vertAlphaMag = "\
|
||||
void main() \
|
||||
{ \
|
||||
gl_TexCoord[0] = gl_MultiTexCoord0; \
|
||||
gl_Position = ftransform(); \
|
||||
} \
|
||||
";
|
||||
const String fragAlphaMag =
|
||||
"uniform sampler2D textMap; \n"
|
||||
"uniform vec4 textColor; \n"
|
||||
" \n"
|
||||
"float alphaThreshold = 0.50; \n"
|
||||
"float distanceScale = 15.0; \n"
|
||||
" \n"
|
||||
"float outlineOuter = 0.3; \n"
|
||||
"float outlineInner = 0.1; \n"
|
||||
"vec4 outlineColor = vec4(0, 0, 0, 1); \n"
|
||||
" \n"
|
||||
"float glowOffsetX = 0.005; \n"
|
||||
"float glowOffsetY = 0.005; \n"
|
||||
"float glowStart = .7; \n"
|
||||
"float glowEnd = 0.5; \n"
|
||||
"vec4 glowColor = vec4(0.0, 0.0, 0.0, 1.0); \n"
|
||||
" \n"
|
||||
"void main() \n"
|
||||
"{ \n"
|
||||
" vec4 color = texture2D(textMap, gl_TexCoord[0].xy); \n"
|
||||
" float distanceFactor = color.a; \n"
|
||||
" \n"
|
||||
" float width = fwidth(gl_TexCoord[0].x) * distanceScale; \n"
|
||||
" \n"
|
||||
" /*float outlineMin1 = outlineOuter + width * 2.0; \n"
|
||||
" float outlineMax1 = outlineInner + width * 2.0; \n"
|
||||
" \n"
|
||||
" if (distanceFactor > outlineOuter && distanceFactor < outlineMax1) \n"
|
||||
" { \n"
|
||||
" float outlineAlpha; \n"
|
||||
" \n"
|
||||
" if (distanceFactor <= outlineMin1) \n"
|
||||
" outlineAlpha = smoothstep(outlineOuter, outlineMin1, distanceFactor); \n"
|
||||
" else \n"
|
||||
" outlineAlpha = smoothstep(outlineMax1, outlineInner, distanceFactor); \n"
|
||||
" \n"
|
||||
" color = mix(color, outlineColor, outlineAlpha); \n"
|
||||
" }*/ \n"
|
||||
" \n"
|
||||
" color.rgb = textColor.rgb; \n"
|
||||
" color.a = smoothstep(alphaThreshold - width, alphaThreshold + width, distanceFactor); \n"
|
||||
" \n"
|
||||
" /*vec2 glowOffset = vec2(-glowOffsetX, -glowOffsetY); \n"
|
||||
" float glowDistance = texture2D(textMap, gl_TexCoord[0].xy + glowOffset).a; \n"
|
||||
" float glowFactor = smoothstep(glowStart, glowEnd, glowDistance); \n"
|
||||
" \n"
|
||||
" color = mix(vec4(glowColor.rgb, glowFactor), color, color.a);*/ \n"
|
||||
" \n"
|
||||
" gl_FragColor = color; \n"
|
||||
"} \n"
|
||||
;
|
||||
|
||||
|
||||
const String vertAlphaMag =
|
||||
"void main() \n"
|
||||
"{ \n"
|
||||
" gl_TexCoord[0] = gl_MultiTexCoord0; \n"
|
||||
" gl_Position = ftransform(); \n"
|
||||
"} \n"
|
||||
;
|
||||
END_UPP_NAMESPACE
|
||||
|
|
@ -11,6 +11,7 @@ HWND glHwnd = NULL;
|
|||
HDC hDC = NULL;
|
||||
HGLRC hRC = NULL;
|
||||
int alphaMagProg = -1;
|
||||
String error;
|
||||
|
||||
bool glEndSession = false;
|
||||
|
||||
|
|
@ -122,39 +123,42 @@ int CreateGlContext()
|
|||
pfd.iLayerType = PFD_MAIN_PLANE;
|
||||
int pf = ChoosePixelFormat(hDC, &pfd);
|
||||
if(!pf) {
|
||||
RLOG("OpenGL: ChoosePixelFormat error");
|
||||
error ="ChoosePixelFormat error";
|
||||
return -2;
|
||||
}
|
||||
RLOG("OpenGL: ChoosePixelFormat ok..");
|
||||
if(!SetPixelFormat(hDC, pf, &pfd)) {
|
||||
RLOG("OpenGL: SetPixelFormat error");
|
||||
error = "SetPixelFormat error";
|
||||
return -3;
|
||||
}
|
||||
DescribePixelFormat(hDC, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
|
||||
hRC = wglCreateContext(hDC);
|
||||
if(!hRC)
|
||||
{
|
||||
RLOG("OpenGL: wglCreateContext error");
|
||||
error = "wglCreateContext error";
|
||||
return -4;
|
||||
}
|
||||
RLOG("OpenGL: wglCreateContext ok..");
|
||||
if(!wglMakeCurrent(hDC, hRC))
|
||||
{
|
||||
RLOG("OpenGL: wglMakeCurrent error");
|
||||
error = "wglMakeCurrent error";
|
||||
return -5;
|
||||
}
|
||||
RLOG("OpenGL: wglMakeCurrent ok..");
|
||||
GLenum err = glewInit();
|
||||
if(err != GLEW_OK)
|
||||
{
|
||||
RLOG("OpenGL: Glew library initialization error: " + String((const char*) glewGetErrorString(err)));
|
||||
error = "Glew library initialization error: " + String((const char*) glewGetErrorString(err));
|
||||
return -6;
|
||||
}
|
||||
RLOG("OpenGL: glewInit ok..");
|
||||
|
||||
alphaMagProg = CompileProgram(fragAlphaMag, vertAlphaMag);
|
||||
if(alphaMagProg < 0)
|
||||
{
|
||||
error = "Shader compilation error";
|
||||
return -7;
|
||||
}
|
||||
|
||||
RLOG("OpenGL: CompileProgram ok..");
|
||||
|
||||
|
|
@ -172,16 +176,25 @@ int AppMain(HINSTANCE hInstance, LPSTR lpCmdLine)
|
|||
{
|
||||
UPP::coreCmdLine__() = UPP::SplitCmdLine__(UPP::FromSystemCharset(lpCmdLine));
|
||||
UPP::AppInitEnvironment__();
|
||||
// Ctrl::InitTimer();
|
||||
Ctrl::InitGl();
|
||||
//int r = UPP::GlInit(hInstance);
|
||||
int r = UPP::CreateGlWindow(hInstance);
|
||||
if(r < 0)
|
||||
::MessageBox(NULL, Format("OpenGL window could not be created: %r (%s)", r, GetLastErrorMessage()), NULL, MB_ICONEXCLAMATION | MB_OK);
|
||||
{
|
||||
error = Format("OpenGL window could not be created: %d (%s)", r, GetLastErrorMessage());
|
||||
RLOG(error);
|
||||
::MessageBox(NULL, error, NULL, MB_ICONEXCLAMATION | MB_OK);
|
||||
}
|
||||
else
|
||||
{
|
||||
r = UPP::CreateGlContext();
|
||||
}
|
||||
|
||||
if(r < 0)
|
||||
::MessageBox(NULL, Format("OpenGL context could not be created: %r (%s)", r, GetLastErrorMessage()), NULL, MB_ICONEXCLAMATION | MB_OK);
|
||||
{
|
||||
error = Format("OpenGL context could not be created: %d (%s)", r, error);
|
||||
RLOG(error);
|
||||
::MessageBox(NULL, error, NULL, MB_ICONEXCLAMATION | MB_OK);
|
||||
}
|
||||
|
||||
if(r > 0)
|
||||
{
|
||||
|
|
@ -190,7 +203,9 @@ int AppMain(HINSTANCE hInstance, LPSTR lpCmdLine)
|
|||
UPP::UsrLog("---------- About to delete this log of WinGL...");
|
||||
UPP::DeleteUsrLog();
|
||||
return UPP::GetExitCode();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@ extern HDC hDC;
|
|||
extern HGLRC hRC;
|
||||
extern int alphaMagProg;
|
||||
|
||||
extern String error;
|
||||
|
||||
int CreateGlWindow(HINSTANCE hInstance);
|
||||
int CreateGlContext();
|
||||
void ActivateGlContext();
|
||||
|
|
|
|||
|
|
@ -219,7 +219,7 @@ void Ctrl::DrawScreen()
|
|||
#endif
|
||||
draw.alpha = 255.f;
|
||||
draw.Offset(infoPanel.GetRect().TopLeft());
|
||||
infoPanel.CtrlPaint(draw, clip, NULL);
|
||||
infoPanel.CtrlPaint(draw, clip);
|
||||
draw.End();
|
||||
#if CLIP_MODE == 2
|
||||
glEnable(GL_STENCIL_TEST);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue