// auld
// /CRINKLER /COMPMODE:SLOW /ORDERTRIES:3000 /UNSAFEIMPORT

#include <windows.h>
#include <math.h>
#include <GL/gl.h>
#include "glext.h"

#pragma data_seg(".fshader")
const GLchar *fsh="\
float d,w=dot(vec3(gl_Color),vec3(256/256,256,256*256))*.256;\
\
float o(vec3 p){return min(\
cos(p.x)+cos(p.y*1.5)+cos(p.z)+cos(p.y*20)*.0256,\
length(max(abs(p-vec3(cos(p.z*1.5)*.256,cos(p.z)*.256-.5,0))-vec3(.12,.0256,w+3.),vec3(0)))\
);}\
\
vec3 n(vec3 p){vec3 f=vec3(.0256,0,0);return normalize(vec3(o(p+f.xyy),o(p+f.yxy),o(p+f.yyx)));}\
\
void main(){\
vec3 s=vec3(cos(w)*.5,-cos(w*.5)*.5+.256,w);\
vec3 p=s;\
vec3 e=normalize(vec3((gl_FragCoord.xy)*.00256-1.,1.));\
for(int i=0;i<64;i++){d=o(p);p+=d*e;}\
vec3 pp=p;\
p+=e=reflect(e,n(p));\
for(int i=0;i<64;i++){d=o(p);p+=d*e;}\
gl_FragColor=abs(dot(n(p),vec3(.1)))+vec4(.3,cos(w*.5)*.5+.5,-cos(w*.5)*.5+.5,1)*length(p-s)*.0256\
+length(p-s)*.0256+(1-min(pp.y+1.8,1.))*vec4(1,.8,.7,1);\
}";


#pragma code_seg(".shaders")
void inline setShaders() {	    
		GLuint s = ((PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"))(GL_FRAGMENT_SHADER);	
		((PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource")) (s, 1, &fsh, NULL);
		((PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader"))(s);
		GLuint p = ((PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram"))();
		((PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader")) (p,s);
		((PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram"))(p);
		((PFNGLUSEPROGRAMPROC) wglGetProcAddress("glUseProgram"))(p);
}

#pragma data_seg(".pfd")
static PIXELFORMATDESCRIPTOR pfd={
0, // Size Of This Pixel Format Descriptor... BAD coding, nothing new, saves 6 bytes
0, PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
};

//optional
#pragma data_seg(".dev")
static DEVMODE dmScreenSettings={
"",0,0,sizeof(dmScreenSettings),0,DM_PELSWIDTH|DM_PELSHEIGHT,
0,0,0,0,0,0,0,0,0,0,0,0,0,"",0,0,1024,768,0,0,0,0,0,0,0,0,0,0
};

#pragma code_seg(".t")
static int t;
#pragma code_seg(".main")
void WinMainCRTStartup()
{
//int t;
//  optional..
   ChangeDisplaySettings (&dmScreenSettings,CDS_FULLSCREEN);  
   HDC hDC = GetDC( CreateWindow("edit", 0, WS_POPUP|WS_VISIBLE|WS_MAXIMIZE, 0, 0, 0, 0, 0, 0, 0, 0) );
   SetPixelFormat ( hDC, ChoosePixelFormat ( hDC, &pfd) , &pfd );
   wglMakeCurrent ( hDC, wglCreateContext(hDC) );
   setShaders();
   ShowCursor(FALSE);
    do {
		 t=timeGetTime();
		 glColor4ubv((unsigned char *)(&t));
		 glRects(-1,-1,1,1);
         SwapBuffers(hDC);
    } while ( !GetAsyncKeyState(VK_ESCAPE) );   
	ExitProcess(0);// added for nvidia/vista 
}

 