157 lines
3.6 KiB
C++
157 lines
3.6 KiB
C++
#define WIN32_LEAN_AND_MEAN
|
|
#define WIN32_EXTRA_LEAN
|
|
#include "synth.h"
|
|
#include <GL/gl.h>
|
|
#include "glext.h"
|
|
|
|
#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
|
|
|
|
#pragma data_seg(".Shader0")
|
|
#include "intro_small.h"
|
|
char* source = intro_fs;
|
|
|
|
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 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(".glCreateShaderProgramv")
|
|
static const char* sglCreateShaderProgramv = "glCreateShaderProgramv";
|
|
|
|
#pragma data_seg(".glUseProgram")
|
|
static const char* sglUseProgram = "glUseProgram";
|
|
|
|
#pragma data_seg(".glUniform4f")
|
|
static const char* sglUniform4f = "glUniform4f";
|
|
|
|
#define shaderOffset 14
|
|
#define shaderCount 12
|
|
#define ATOM_EDIT 0xC018
|
|
#define ATOM_STATIC 0xC019
|
|
#define SCENE_LENGTH (SAMPLES_PER_TICK * 128)
|
|
|
|
#pragma bss_seg(".mainbss")
|
|
static PFNGLCREATESHADERPROGRAMVPROC glCreateShaderProgramv;
|
|
static PFNGLUSEPROGRAMPROC glUseProgram;
|
|
static PFNGLUNIFORM4FPROC glUniform4f;
|
|
static GLuint programs[shaderCount];
|
|
|
|
#pragma code_seg(".main")
|
|
void _cdecl main()
|
|
{
|
|
InitSound();
|
|
|
|
#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
|
|
|
|
SetPixelFormat(hDC, ChoosePixelFormat(hDC, (const PIXELFORMATDESCRIPTOR*)&devmode.pfd), 0);
|
|
wglMakeCurrent(hDC, wglCreateContext(hDC));
|
|
|
|
glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)wglGetProcAddress(sglCreateShaderProgramv);
|
|
glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress(sglUseProgram);
|
|
glUniform4f = (PFNGLUNIFORM4FPROC)wglGetProcAddress(sglUniform4f);
|
|
|
|
for (int i = 0; i < shaderCount; ++i)
|
|
{
|
|
programs[i] = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &source);
|
|
intro_fs[shaderOffset]++;
|
|
if (i == 9)
|
|
{
|
|
intro_fs[shaderOffset] = 'A';
|
|
}
|
|
glUseProgram(programs[i]);
|
|
glUniform4f(0, i, SCREENHEIGHT, ASPECTOFFSET, 0.0f);
|
|
glRecti(-1, -1, 1, 1);
|
|
}
|
|
|
|
ShowCursor(FALSE);
|
|
PlaySound();
|
|
|
|
do
|
|
{
|
|
get_Sample();
|
|
|
|
float fTime = (float)MMTime.u.sample / SCENE_LENGTH;
|
|
|
|
glUseProgram(programs[(int)fTime]);
|
|
|
|
int i = ((MMTime.u.sample >> 8) << 5) + 2 * 2;
|
|
float* a = &_4klang_envelope_buffer;
|
|
float aha = a[i] + a[i + 1];
|
|
|
|
glUniform4f(0, fTime, SCREENHEIGHT, ASPECTOFFSET, aha);
|
|
glRecti(-1, -1, 1, 1);
|
|
SwapBuffers(hDC);
|
|
|
|
::PeekMessage(0, 0, 0, 0, 0);
|
|
} while (MMTime.u.sample < MAX_SAMPLES && !GetAsyncKeyState(VK_ESCAPE));
|
|
|
|
ExitProcess(0);
|
|
}
|