Files
bluflame/uc16-4k/main_rel.cpp
2026-04-18 22:31:51 +02:00

229 lines
5.1 KiB
C++

#define WIN32_LEAN_AND_MEAN
#define WIN32_EXTRA_LEAN
#include "synth.h"
#include <GL/gl.h>
#include "glext.h"
#ifdef _DEBUG
#include <io.h>
#include <process.h>
#include "Shaders.h"
HANDLE gh_ShaderCompileEvent;
static char** gs_LastShader_;
static __time64_t gi_ShaderChangedDate;
static unsigned int gi_ShaderProgram;
static unsigned int gi_LastShaderProgram;
static const char* gs_ShaderFile = "mark.fs";
DWORD WINAPI filemon(void* args)
{
while (true)
{
_finddata_t fdata;
long hfile = _findfirst(gs_ShaderFile, &fdata);
if (hfile != -1)
{
if (fdata.time_write != gi_ShaderChangedDate)
{
gi_ShaderChangedDate = fdata.time_write;
::SetEvent(gh_ShaderCompileEvent);
std::cout << "Shader loaded." << std::endl;
}
_findclose(hfile);
}
::Sleep(100);
}
return 0;
}
#else
#pragma data_seg(".Shader0")
#include "mark_small.h"
#endif
#ifndef SCREENWIDTH
#define SCREENWIDTH 1280
#endif
#ifndef SCREENHEIGHT
#define SCREENHEIGHT 720
#endif
#ifndef ASPECTOFFSET
#define ASPECTOFFSET ((float(SCREENWIDTH) / float(SCREENHEIGHT) - 1.0f) * 0.5f)
#endif
#define WINDOWED
struct FAKEPFD
{
WORD nSize;
WORD nVersion;
DWORD dwFlags;
// Snip
};
struct FAKEDEVMODE
{
BYTE dmDeviceName[CCHDEVICENAME];
WORD dmSpecVersion;
WORD dmDriverVersion;
WORD dmSize;
WORD dmDriverExtra;
DWORD dmFields;
union {
/* printer only fields */
struct {
short dmOrientation;
short dmPaperSize;
short dmPaperLength;
short dmPaperWidth;
short dmScale;
short dmCopies;
short dmDefaultSource;
short dmPrintQuality;
};
FAKEPFD pfd;
};
short dmColor;
short dmDuplex;
short dmYResolution;
short dmTTOption;
short dmCollate;
BYTE dmFormName[CCHFORMNAME];
WORD dmLogPixels;
DWORD dmBitsPerPel;
DWORD dmPelsWidth;
DWORD dmPelsHeight;
union {
DWORD dmDisplayFlags;
DWORD dmNup;
};
DWORD dmDisplayFrequency;
};
#pragma bss_seg(".mainbss")
static PFNGLCREATESHADERPROGRAMEXTPROC glCreateShaderProgramEXT;
static PFNGLUSEPROGRAMPROC glUseProgram;
static PFNGLUNIFORM4FPROC glUniform4f;
#pragma data_seg(".devmode")
static FAKEDEVMODE devmode = {
"", 0, 0, sizeof(devmode), 0, DM_PELSWIDTH | DM_PELSHEIGHT, 0, 0, PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, 0, SCREENWIDTH, SCREENHEIGHT, 0, 0
};
#pragma data_seg(".fltused")
int _fltused = 1;
#pragma data_seg(".glCreateShaderProgramEXT")
static const char* sglCreateShaderProgramEXT = "glCreateShaderProgramEXT";
#pragma data_seg(".glUseProgram")
static const char* sglUseProgram = "glUseProgram";
#pragma data_seg(".glUniform4f")
static const char* sglUniform4f = "glUniform4f";
#define shaderCountOffset 14
#define ATOM_EDIT 0xC018
#define ATOM_STATIC 0xC019
#define SCENE_LENGTH (SAMPLES_PER_TICK * 128)
#pragma code_seg(".main")
void _cdecl main()
{
InitSound();
#ifdef _DEBUG
HDC hDC = GetDC(CreateWindowExA(0, (LPCSTR)ATOM_EDIT, 0, WS_OVERLAPPEDWINDOW | WS_SYSMENU | WS_VISIBLE, 0, 0, SCREENWIDTH, SCREENHEIGHT, 0, 0, 0, 0));
gh_ShaderCompileEvent = ::CreateEvent(NULL, FALSE, FALSE, TEXT("WriteEvent"));
SetThreadPriority((HANDLE)CreateThread(0, 0, &filemon, 0, 0, 0), THREAD_PRIORITY_BELOW_NORMAL);
#else
#ifndef WINDOWED
ChangeDisplaySettings((DEVMODEA*)&devmode, CDS_FULLSCREEN);
HDC hDC = GetDC(CreateWindowExA(0, (LPCSTR)ATOM_STATIC, 0, WS_POPUP | WS_VISIBLE | WS_MAXIMIZE, 0, 0, 0, 0, 0, 0, 0, 0));
#else
HDC hDC = GetDC(CreateWindowExA(0, (LPCSTR)ATOM_STATIC, 0, WS_VISIBLE | WS_SYSMENU, 0, 0, SCREENWIDTH, SCREENHEIGHT, 0, 0, 0, 0));
#endif
#endif
SetPixelFormat(hDC, ChoosePixelFormat(hDC, (const PIXELFORMATDESCRIPTOR*)&devmode.pfd), 0);
// if size is a problem, try this:
//SetPixelFormat(hDC, 8, 0);
wglMakeCurrent(hDC, wglCreateContext(hDC));
#ifdef _DEBUG
initShaders();
#endif
glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)wglGetProcAddress(sglCreateShaderProgramEXT);
glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress(sglUseProgram);
glUniform4f = (PFNGLUNIFORM4FPROC)wglGetProcAddress(sglUniform4f);
#ifndef _DEBUG
for (int i = 0; i < 12; ++i)
{
glUseProgram(glCreateShaderProgramEXT(GL_FRAGMENT_SHADER, mark_fs_0));
mark_fs_0[shaderCountOffset]++;
if (i == 9)
{
mark_fs_0[shaderCountOffset] = 'A';
}
glUniform4f(0, i, SCREENHEIGHT, ASPECTOFFSET, 0.0f);
glRecti(-1, -1, 1, 1);
}
ShowCursor(FALSE);
#endif
PlaySound();
do
{
get_Sample();
float fTime = (float)MMTime.u.sample / SCENE_LENGTH;
#ifdef _DEBUG
if (::WaitForSingleObject(gh_ShaderCompileEvent, 0) == WAIT_OBJECT_0)
{
::Sleep(50);
glUseProgram(createFragmentProgram(gs_ShaderFile));
PrintErrors();
}
#else
glUseProgram((int)fTime + 1);
#endif
int i = ((MMTime.u.sample >> 8) << 5) + 2 * 2;
glUniform4f(0, fTime, SCREENHEIGHT, ASPECTOFFSET, 0);
glRecti(-1, -1, 1, 1);
SwapBuffers(hDC);
#ifdef _DEBUG
MSG msg;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
return;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
#else
::PeekMessage(0, 0, 0, 0, 0);
#endif
} while
#ifdef _DEBUG
(true);
#else
(MMTime.u.sample < MAX_SAMPLES && !GetAsyncKeyState(VK_ESCAPE));
#endif
ExitProcess(0);
}