Advertisement
Kitomas

code for 2025-06-26 (4/4)

Jun 27th, 2025
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 41.13 KB | None | 0 0
  1. /******************************************************************************/
  2. /******************************************************************************/
  3. //"opengl_metaballs_2025-06-26\include\sound_stuff.hpp":
  4. // This file should not be included on its own,
  5. // but rather as part of "public_stuff.hpp"!
  6. //
  7. // (Most of this is lifted straight from kit_sdl2, so if some
  8. //  things here are inconsisent with the rest, that's why!)
  9. //
  10. // ALSO, DO NOT USE THIS AS REFERENCE IN A FUTURE PROJECT,
  11. // BECAUSE IT'S A HACKY MESS!
  12. #ifndef _SOUND_STUFF_HPP
  13. #define _SOUND_STUFF_HPP
  14.  
  15. #ifdef SOUND_STUFF_USED
  16.  
  17. #include <windows.h>
  18.  
  19.  
  20.  
  21.  
  22.  
  23. //#define AUDIODATA_FILELOAD_USED
  24. #define AUDIODATA_SAVEAUDIO_USED
  25. #define AUDIODATA_CONVERTFORMAT_USED
  26.  
  27.  
  28.  
  29.  
  30.  
  31. #define GET_AUDIO_BITSIZE(x)     (x & (0xFF ))
  32. #define GET_AUDIO_ISFLOAT(x)     (x & (1<< 8))
  33. #define GET_AUDIO_ISBIGENDIAN(x) (x & (1<<12))
  34. #define GET_AUDIO_ISSIGNED(x)    (x & (1<<15))
  35.  
  36. #define GET_AUDIO_BYTESIZE(x)    (GET_AUDIO_BITSIZE(x)/8)
  37.  
  38.  
  39.  
  40. enum AudioSampleFormatEnum {
  41.   SMPFMT_U8     = 0x0008,  //unsigned  8-bit samples
  42.   SMPFMT_S8     = 0x8008,  //  signed  8-bit samples
  43.   SMPFMT_U16LSB = 0x0010,  //unsigned 16-bit samples
  44.   SMPFMT_S16LSB = 0x8010,  //  signed 16-bit samples
  45.   SMPFMT_S32LSB = 0x8020,  //  signed 32-bit samples
  46.   SMPFMT_F32LSB = 0x8120,  //32-bit floating point samples
  47.  
  48.   SMPFMT_U16MSB = 0x1010,  //same as LSB, except with big-endian byte order
  49.   SMPFMT_S16MSB = 0x9010,  //same as LSB, except with big-endian byte order
  50.   SMPFMT_S32MSB = 0x9020,  //same as LSB, except with big-endian byte order
  51.   SMPFMT_F32MSB = 0x9120,  //same as LSB, except with big-endian byte order
  52.  
  53.   SMPFMT_S24LSB = 0x8018,  //  signed 24-bit samples
  54.   SMPFMT_F64LSB = 0x8140,  //64-bit floating point samples
  55.  
  56.   SMPFMT_S24MSB = 0x9018,  //same as LSB, except with big-endian byte order
  57.   SMPFMT_F64MSB = 0x9140,  //same as LSB, except with big-endian byte order
  58.  
  59.   //aliases
  60.   SMPFMT_U16    = SMPFMT_U16LSB,
  61.   SMPFMT_S16    = SMPFMT_S16LSB,
  62.   SMPFMT_S24    = SMPFMT_S24LSB,
  63.   SMPFMT_S32    = SMPFMT_S32LSB,
  64.   SMPFMT_F32    = SMPFMT_F32LSB,
  65.   SMPFMT_F64    = SMPFMT_F64LSB,
  66.  
  67.   //may also be used as a wildcard
  68.    //(as in this may be associated with a value != 0xFFFF)
  69.   SMPFMT_UKNOWN = 0xFFFF,
  70.  
  71. };
  72.  
  73.  
  74.  
  75.  
  76.  
  77. /******************************************************************************/
  78.  
  79.  
  80.  
  81.  
  82.  
  83. struct AudioDataHeader;
  84.  
  85. // The pointer this returns MUST have been allocated with mem_alloc()
  86. // Also, ->samples must not be a separate allocation! samples must be contiguous
  87. // and on the same memory block as the header itself!
  88. //
  89. // (Basically, header_ptr->samples = (u8*)header_ptr+header_ptr->headerSize)
  90. typedef AudioDataHeader* (*AudioDataLoaderCallback)(const char* filePath);
  91.  
  92. typedef bool (*AudioDataSaverCallback)(const char* filePath,
  93.                                        AudioDataHeader& header_in);
  94.  
  95.  
  96.  
  97.  
  98.  
  99. // File signature = "kPxM" (no null terminator)
  100. #define KPM_FILE_SIG (0x4D78506B)
  101.  
  102. // This struct is identical to a ".kpm" file as it contains the same header data
  103. struct AudioDataHeader { //72B (0x48B)
  104.   u32        magic; // (0x00) = KPM_FILE_SIG = 0x4D78506B = "kPxM"
  105.   u16       format; // (0x04) = one of AudioSampleFormatEnum if fmt_version == 1
  106.   u16   headerSize; // (0x06) = must be >=sizeof(AudioDataHeader)
  107.   u64     dataSize; // (0x08) = size of audio data, in bytes
  108.  
  109.   u64    loopStart; // (0x10) = which sample to loop back to
  110.   u64      loopEnd; // (0x18) = which sample to jump back to loopStart on
  111.  
  112.   u64   numSamples; // (0x20) = # of sample frames in audio data
  113.   u32   sampleRate; // (0x28) = the audio data's sample rate, in Hz
  114.   u32      bitRate; // (0x2C) = the audio's bit rate (per second)
  115.  
  116.   u16    loopCount; // (0x30) = # of times to loop audio (0 = no loop, 0xFFFF = inf loop)
  117.   u16     channels; // (0x32) = # of interlaced channels in the audio data
  118.   u8     _reserved; // (0x34)
  119.   u8   fmt_version; // (0x35) = 0=kit_w32, 1=kit_sdl2
  120.   u8          mode; // (0x36) = 0 for normal PCM or float data types
  121.   u8 metadata_type; // (0x37) = 0 for no metadata
  122.  
  123.   void*    samples; // (0x38) = the audio's sample data (appears as nullptr in file)
  124.   void*   userdata; // (0x40) = user-defined (also appears nullptr in file)
  125.                     // (0x48) = (start of sample data, assuming a .kpm file)
  126.  
  127.   // Only useful #ifdef _DEBUG
  128.   void printHeader(const char* name = nullptr);
  129.  
  130. };
  131.  
  132.  
  133.  
  134.  
  135.  
  136. class AudioData {
  137.   bool _allocate_hdr(u16 headerSize, u64 dataSize);
  138.  
  139. public:
  140.   AudioDataHeader* hdr = nullptr;
  141.  
  142.   StereoF32 volume = {1.0f, 1.0f};
  143.  
  144.  
  145.  
  146.   // Create with everything zeroed out, except headerSize, dataSize, and samples
  147.   AudioData(u16 headerSize, u64 dataSize){ _allocate_hdr(headerSize,dataSize); }
  148.  
  149.   // Create with zeroed out sample data
  150.   AudioData(AudioSampleFormatEnum format,
  151.             u64 numSamples, u16 channels, u32 sampleRate);
  152.  
  153. #ifdef AUDIODATA_FILELOAD_USED
  154.   // Create from an audio file of a specific file format
  155.   AudioData(const char* filePath, AudioDataLoaderCallback callback);
  156. #endif
  157.  
  158.   ~AudioData();
  159.  
  160.  
  161.  
  162.   inline void printHeader(const char* name = nullptr)
  163.   { if(hdr != nullptr) hdr->printHeader(name); }
  164.  
  165. #ifdef AUDIODATA_SAVEAUDIO_USED
  166.   // (This will overwrite any file named filePath! make sure to check
  167.   //  with fileio_exists() unless you intend to overwrite the previous file)
  168.   bool saveAudio(const char* filePath, AudioDataSaverCallback callback);
  169. #endif
  170.  
  171. #ifdef AUDIODATA_CONVERTFORMAT_USED
  172.   // The conversion method used is slightly inaccurate for a number of reasons.
  173.   // This function only serves as a convenience, where accuracy isn't
  174.   // needed beyond sounding more or less the same.
  175.   //
  176.   // (This will return early if hdr->format == format,
  177.   //  since no conversion would be necessary)
  178.   bool convertFormat(AudioSampleFormatEnum format);
  179. #endif
  180.  
  181. };
  182.  
  183.  
  184.  
  185.  
  186.  
  187. /******************************************************************************/
  188.  
  189.  
  190.  
  191.  
  192.  
  193. struct SoundEngineTrack { //88B
  194.   const AudioDataHeader* audio;
  195.  
  196.   // Time at the point of audio being queued, in seconds
  197.   f64                timestamp;
  198.  
  199.   f64                 position;
  200.  
  201.   f64                  spd_old;
  202.   f64                  spd_new;
  203.   f64                 spdDelta;
  204.  
  205.   StereoF32            vol_old;
  206.   StereoF32            vol_new;
  207.   StereoF32           volDelta;
  208.   StereoF32          volMaster;
  209.  
  210.   u16                    loops;
  211.   bool                stopping;
  212.  
  213.   char             _padding[5];
  214.  
  215. };
  216.  
  217.  
  218.  
  219.  
  220.  
  221. // WARNING: IF A CURRENTLY PLAYING AUDIO CLIP IS DESTROYED BEFORE
  222. // SOUNDENGINE, AN ACCESS VIOLATION MIGHT OCCUR IF ACTIVELY MIXING!
  223.  
  224. class SoundEngine {
  225.   SoundEngineTrack _tracks[64];
  226.   CRITICAL_SECTION   _lock;
  227.   u16          _tracks_len = 64;
  228.   u8              _padding;
  229.  
  230. public:
  231.   // (ALL TRACKS MUST BE FULLY STOPPED BEFORE CHANGING SAMPLERATE,
  232.   //  AS SAMPLERATE IS USED TO CALCULATE SOME AUDIO CLIP INFO!)
  233.  
  234.   bool    stopIfVolumeIsZero = true;
  235.   f32             sampleRate = (f32)sample_rate; // The *device*'s sample rate
  236.   StereoF32    volumeMaster = {1.0f, 1.0f};
  237.   // (Only the left channel of volumeMaster
  238.   //  is used if the source audio is mono)
  239.  
  240.  
  241.  
  242.   SoundEngine(u16 numTracks = 64, f32 _sampleRate = (f32)sample_rate);
  243.  
  244.   ~SoundEngine();
  245.  
  246.  
  247.  
  248.   bool isTrackPlaying(u16 track);
  249.  
  250.   u16        getActiveTracks();
  251.   inline u16 getTrackCount(){ return _tracks_len; }
  252.  
  253.  
  254.  
  255.   // Sets the volume multiplier of a given track,
  256.   // or all active tracks if track == 0xFFFF
  257.   //
  258.   // When forced == true, the volume state is set instantly, instead of
  259.   // being interpolated over the course of the next call to mixTracks()
  260.   bool setVolume(f32 volumeL, f32 volumeR,
  261.                  u16 track = 0xFFFF, bool forced = false);
  262.  
  263.   // Sets the speed multiplier of a given track,
  264.   // or all active tracks if track == 0xFFFF
  265.   //
  266.   // Forced has the same behavior as setVolume
  267.   bool setSpeed(f64 speedNew,
  268.                 u16 track = 0xFFFF, bool forced = false);
  269.  
  270.   // Sets the change in volume over time for a given track.
  271.   // or all active tracks if track == 0xFFFF
  272.   //
  273.   // DeltaSeconds is the time it will take for the volume
  274.   // to go from 0.0x -> 1.0x (or vice versa)
  275.   bool setVolumeDelta(f32 deltaSecondsL, f32 deltaSecondsR,
  276.                       u16 track = 0xFFFF);
  277.  
  278.   // Same behavior as setVolumeDelta, except applied to the speed multiplier
  279.   bool setSpeedDelta(f64 deltaSeconds,
  280.                      u16 track = 0xFFFF);
  281.  
  282.  
  283.  
  284.   // Returns the track the audio was queued into,
  285.   // or 0xFFFF if no empty track was found,
  286.   // or 0xFFFE on error
  287.   u16 play(const AudioData& audio, // (only f32 or StereoF32 samples allowed!)
  288.            f32 volumeL = 1.0f, f32 volumeR = 1.0f, f64 speed = 1.0);
  289.  
  290.   // (Make sure to stop all tracks before freeing any instances of AudioData,
  291.   //  as to avoid any issues related to dangling pointers and whatnot)
  292.   //
  293.   // (Also, unless forced is set to true, this function
  294.   //  won't work if stopIfVolumeIsZero is false!)
  295.   bool stop(u16 track = 0xFFFF, bool forced = false);
  296.  
  297.  
  298.  
  299.   // Returns false if timeout is reached, true otherwise
  300.   //
  301.   // Set timeoutSeconds to 0 to wait indefinitely
  302.   bool waitForTrack(f64 timeoutSeconds = 0, u16 track = 0xFFFF);
  303.  
  304.  
  305.  
  306.   // buffer_len is in elements, not bytes
  307.   //
  308.   // Returns referenceTimestamp, or 0.0 on error
  309.   f64 mixTracks(StereoF32* buffer, size_t buffer_len,
  310.                 f64 referenceTimestamp = timeGetSeconds());
  311.  
  312. };
  313.  
  314.  
  315.  
  316.  
  317.  
  318. #endif /* SOUND_STUFF_USED */
  319.  
  320. #endif /* _SOUND_STUFF_HPP */
  321. /******************************************************************************/
  322. /******************************************************************************/
  323. //"opengl_metaballs_2025-06-26\include\win32\audio.hpp":
  324. #ifndef _WIN32_AUDIO_HPP
  325. #define _WIN32_AUDIO_HPP
  326.  
  327. #include <public_stuff.hpp>
  328.  
  329. #include <windows.h>
  330. #include <mmsystem.h>
  331.  
  332.  
  333.  
  334. #define timeGetDevCaps         _Winmm_func.timeGetDevCaps_
  335. #define timeBeginPeriod        _Winmm_func.timeBeginPeriod_
  336.  
  337. #define waveOutGetNumDevs      _Winmm_func.waveOutGetNumDevs_
  338. #define waveOutGetDevCapsA     _Winmm_func.waveOutGetDevCapsA_
  339. #define waveOutGetVolume       _Winmm_func.waveOutGetVolume_
  340. #define waveOutSetVolume       _Winmm_func.waveOutSetVolume_
  341. #define waveOutGetErrorTextA   _Winmm_func.waveOutGetErrorTextA_
  342. #define waveOutOpen            _Winmm_func.waveOutOpen_
  343. #define waveOutClose           _Winmm_func.waveOutClose_
  344. #define waveOutPrepareHeader   _Winmm_func.waveOutPrepareHeader_
  345. #define waveOutUnprepareHeader _Winmm_func.waveOutUnprepareHeader_
  346. #define waveOutWrite           _Winmm_func.waveOutWrite_
  347. #define waveOutPause           _Winmm_func.waveOutPause_
  348. #define waveOutRestart         _Winmm_func.waveOutRestart_
  349. #define waveOutReset           _Winmm_func.waveOutReset_
  350. #define waveOutBreakLoop       _Winmm_func.waveOutBreakLoop_
  351. #define waveOutGetPosition     _Winmm_func.waveOutGetPosition_
  352. #define waveOutGetPitch        _Winmm_func.waveOutGetPitch_
  353. #define waveOutSetPitch        _Winmm_func.waveOutSetPitch_
  354. #define waveOutGetPlaybackRate _Winmm_func.waveOutGetPlaybackRate_
  355. #define waveOutSetPlaybackRate _Winmm_func.waveOutSetPlaybackRate_
  356. #define waveOutGetID           _Winmm_func.waveOutGetID_
  357. #define waveOutMessage         _Winmm_func.waveOutMessage_
  358.  
  359. union _Winmm_func_t {
  360.   FARPROC ptrs[1];
  361.  
  362.   struct {
  363.     // Idk why these first two are in WinMM at all, but whatever
  364.     MMRESULT (WINAPI *timeGetDevCaps_)(LPTIMECAPS, UINT);
  365.     MMRESULT (WINAPI *timeBeginPeriod_)(UINT);
  366.  
  367.     //UINT     (WINAPI *waveOutGetNumDevs_)(void);
  368.     MMRESULT (WINAPI *waveOutGetDevCapsA_)(UINT_PTR, LPWAVEOUTCAPSA, UINT);
  369.     //MMRESULT (WINAPI *waveOutGetVolume_)(HWAVEOUT, LPDWORD);
  370.     MMRESULT (WINAPI *waveOutSetVolume_)(HWAVEOUT, DWORD);
  371.     //MMRESULT (WINAPI *waveOutGetErrorTextA_)(MMRESULT, LPSTR, UINT);
  372.     MMRESULT (WINAPI *waveOutOpen_)(LPHWAVEOUT, UINT, LPCWAVEFORMATEX, DWORD_PTR, DWORD_PTR, DWORD);
  373.     //MMRESULT (WINAPI *waveOutClose_)(HWAVEOUT);
  374.     MMRESULT (WINAPI *waveOutPrepareHeader_)(HWAVEOUT, LPWAVEHDR, UINT);
  375.     //MMRESULT (WINAPI *waveOutUnprepareHeader_)(HWAVEOUT, LPWAVEHDR, UINT);
  376.     MMRESULT (WINAPI *waveOutWrite_)(HWAVEOUT, LPWAVEHDR, UINT);
  377.     MMRESULT (WINAPI *waveOutPause_)(HWAVEOUT);
  378.     //MMRESULT (WINAPI *waveOutRestart_)(HWAVEOUT);
  379.     //MMRESULT (WINAPI *waveOutReset_)(HWAVEOUT);
  380.     //MMRESULT (WINAPI *waveOutBreakLoop_)(HWAVEOUT);
  381.     //MMRESULT (WINAPI *waveOutGetPosition_)(HWAVEOUT, LPMMTIME, UINT);
  382.     //MMRESULT (WINAPI *waveOutGetPitch_)(HWAVEOUT, LPDWORD);
  383.     //MMRESULT (WINAPI *waveOutSetPitch_)(HWAVEOUT, DWORD);
  384.     //MMRESULT (WINAPI *waveOutGetPlaybackRate_)(HWAVEOUT, LPDWORD);
  385.     //MMRESULT (WINAPI *waveOutSetPlaybackRate_)(HWAVEOUT, DWORD);
  386.     //MMRESULT (WINAPI *waveOutGetID_)(HWAVEOUT, LPUINT);
  387.     //MMRESULT (WINAPI *waveOutMessage_)(HWAVEOUT, UINT, DWORD_PTR, DWORD_PTR);
  388.   };
  389. };
  390.  
  391. extern _Winmm_func_t _Winmm_func;
  392. extern char          _Winmm_names_a[];
  393. extern char          _Winmm_names_b[];
  394.  
  395.  
  396.  
  397. /******************************************************************************/
  398.  
  399.  
  400.  
  401. // Stereo audio samples as two 16-bit signed ints
  402. struct StereoS16 { s16 l,r; };
  403.  
  404.  
  405.  
  406. int WaveOutInit();
  407.  
  408. void WaveOutQuit();
  409.  
  410.  
  411.  
  412. #endif /* _WIN32_AUDIO_HPP */
  413. /******************************************************************************/
  414. /******************************************************************************/
  415. //"opengl_metaballs_2025-06-26\include\win32\input.hpp":
  416. #ifndef _WIN32_INPUT_HPP
  417. #define _WIN32_INPUT_HPP
  418.  
  419. #include <windows.h>
  420.  
  421. #include <public_stuff.hpp>
  422.  
  423.  
  424.  
  425. int InputInit();
  426.  
  427. void InputQuit();
  428.  
  429.  
  430.  
  431. union Event; // Forward declaration
  432.  
  433. // Returns false if queue is full
  434. bool AddToEventQueue(Event& event);
  435.  
  436. // Returns a EVENT_NULL event if queue is empty
  437. Event RemoveFromEventQueue();
  438.  
  439.  
  440.  
  441. #endif /* _WIN32_INPUT_HPP */
  442. /******************************************************************************/
  443. /******************************************************************************/
  444. //"opengl_metaballs_2025-06-26\include\win32\opengl.hpp":
  445. #ifndef _OPENGL_HPP
  446. #define _OPENGL_HPP
  447.  
  448. #define WIN32_LEAN_AND_MEAN
  449. #include <windows.h>
  450.  
  451. #include <GL/gl.h>
  452. #include <GL/glext.h>
  453. #include <GL/glcorearb.h>
  454.  
  455.  
  456.  
  457.  
  458.  
  459. // wgl (OpenGL 1.1):
  460. #define WGL_1_1_LEN               16
  461. #define wglCopyContext            _Opengl32_func.wglCopyContext_
  462. #define wglCreateContext          _Opengl32_func.wglCreateContext_
  463. #define wglCreateLayerContext     _Opengl32_func.wglCreateLayerContext_
  464. #define wglDeleteContext          _Opengl32_func.wglDeleteContext_
  465. #define wglDescribeLayerPlane     _Opengl32_func.wglDescribeLayerPlane_
  466. #define wglGetCurrentContext      _Opengl32_func.wglGetCurrentContext_
  467. #define wglGetCurrentDC           _Opengl32_func.wglGetCurrentDC_
  468. #define wglGetLayerPaletteEntries _Opengl32_func.wglGetLayerPaletteEntries_
  469. #define wglGetProcAddress         _Opengl32_func.wglGetProcAddress_
  470. #define wglMakeCurrent            _Opengl32_func.wglMakeCurrent_
  471. #define wglRealizeLayerPalette    _Opengl32_func.wglRealizeLayerPalette_
  472. #define wglSetLayerPaletteEntries _Opengl32_func.wglSetLayerPaletteEntries_
  473. #define wglShareLists             _Opengl32_func.wglShareLists_
  474. #define wglSwapLayerBuffers       _Opengl32_func.wglSwapLayerBuffers_
  475. #define wglUseFontBitmapsA        _Opengl32_func.wglUseFontBitmapsA_
  476. #define wglUseFontOutlinesA       _Opengl32_func.wglUseFontOutlinesA_
  477.  
  478. // gl (OpenGL 1.1):
  479. #define GL_1_1_LEN    9
  480. #define glClearColor  _Opengl32_func.glClearColor_
  481. #define glClear       _Opengl32_func.glClear_
  482. #define glPolygonMode _Opengl32_func.glPolygonMode_
  483. #define glViewport    _Opengl32_func.glViewport_
  484. #define glGetBooleanv _Opengl32_func.glGetBooleanv_
  485. #define glGetDoublev  _Opengl32_func.glGetDoublev_
  486. #define glGetFloatv   _Opengl32_func.glGetFloatv_
  487. #define glGetIntegerv _Opengl32_func.glGetIntegerv_
  488. #define glGetError    _Opengl32_func.glGetError_
  489.  
  490. // The rest of the wgl functions:
  491. // ...
  492.  
  493. // The rest of the gl functions:
  494. #define glCreateShader             _Opengl32_func.glCreateShader_
  495. #define glShaderSource             _Opengl32_func.glShaderSource_
  496. #define glCompileShader            _Opengl32_func.glCompileShader_
  497. #define glGetShaderiv              _Opengl32_func.glGetShaderiv_
  498. #define glGetShaderInfoLog         _Opengl32_func.glGetShaderInfoLog_
  499. #define glCreateProgram            _Opengl32_func.glCreateProgram_
  500. #define glAttachShader             _Opengl32_func.glAttachShader_
  501. #define glLinkProgram              _Opengl32_func.glLinkProgram_
  502. #define glGetProgramInfoLog        _Opengl32_func.glGetProgramInfoLog_
  503. #define glDeleteShader             _Opengl32_func.glDeleteShader_
  504. #define glGenVertexArrays          _Opengl32_func.glGenVertexArrays_
  505. #define glGenBuffers               _Opengl32_func.glGenBuffers_
  506. #define glBindVertexArray          _Opengl32_func.glBindVertexArray_
  507. #define glBindBuffer               _Opengl32_func.glBindBuffer_
  508. #define glBufferData               _Opengl32_func.glBufferData_
  509. #define glVertexAttribPointer      _Opengl32_func.glVertexAttribPointer_
  510. #define glVertexAttribIPointer     _Opengl32_func.glVertexAttribIPointer_
  511. #define glEnableVertexAttribArray  _Opengl32_func.glEnableVertexAttribArray_
  512. #define glDisableVertexAttribArray _Opengl32_func.glDisableVertexAttribArray_
  513. #define glUseProgram               _Opengl32_func.glUseProgram_
  514. #define glDrawArrays               _Opengl32_func.glDrawArrays_
  515. #define glDeleteVertexArrays       _Opengl32_func.glDeleteVertexArrays_
  516. #define glDeleteBuffers            _Opengl32_func.glDeleteBuffers_
  517. #define glDeleteProgram            _Opengl32_func.glDeleteProgram_
  518. #define glGetProgramiv             _Opengl32_func.glGetProgramiv_
  519. #define glBufferSubData            _Opengl32_func.glBufferSubData_
  520. #define glMapBufferRange           _Opengl32_func.glMapBufferRange_
  521. #define glGenTextures              _Opengl32_func.glGenTextures_
  522. #define glBindTexture              _Opengl32_func.glBindTexture_
  523. #define glTexBuffer                _Opengl32_func.glTexBuffer_
  524. #define glGetUniformLocation       _Opengl32_func.glGetUniformLocation_
  525.  
  526. #define glUniform1f                _Opengl32_func.glUniform1f_
  527. #define glUniform2f                _Opengl32_func.glUniform2f_
  528. #define glUniform3f                _Opengl32_func.glUniform3f_
  529. #define glUniform4f                _Opengl32_func.glUniform4f_
  530.  
  531. #define glUniform1i                _Opengl32_func.glUniform1i_
  532. #define glUniform2i                _Opengl32_func.glUniform2i_
  533. #define glUniform3i                _Opengl32_func.glUniform3i_
  534. #define glUniform4i                _Opengl32_func.glUniform4i_
  535.  
  536. #define glUniform1ui               _Opengl32_func.glUniform1ui_
  537. #define glUniform2ui               _Opengl32_func.glUniform2ui_
  538. #define glUniform3ui               _Opengl32_func.glUniform3ui_
  539. #define glUniform4ui               _Opengl32_func.glUniform4ui_
  540.  
  541. #define glUniform1fv               _Opengl32_func.glUniform1fv_
  542. #define glUniform2fv               _Opengl32_func.glUniform2fv_
  543. #define glUniform3fv               _Opengl32_func.glUniform3fv_
  544. #define glUniform4fv               _Opengl32_func.glUniform4fv_
  545.  
  546. #define glUniform1iv               _Opengl32_func.glUniform1iv_
  547. #define glUniform2iv               _Opengl32_func.glUniform2iv_
  548. #define glUniform3iv               _Opengl32_func.glUniform3iv_
  549. #define glUniform4iv               _Opengl32_func.glUniform4iv_
  550.  
  551. #define glUniform1uiv              _Opengl32_func.glUniform1uiv_
  552. #define glUniform2uiv              _Opengl32_func.glUniform2uiv_
  553. #define glUniform3uiv              _Opengl32_func.glUniform3uiv_
  554. #define glUniform4uiv              _Opengl32_func.glUniform4uiv_
  555.  
  556. #define glUniformMatrix2fv         _Opengl32_func.glUniformMatrix2fv_
  557. #define glUniformMatrix3fv         _Opengl32_func.glUniformMatrix3fv_
  558. #define glUniformMatrix4fv         _Opengl32_func.glUniformMatrix4fv_
  559. #define glUniformMatrix2x3fv       _Opengl32_func.glUniformMatrix2x3fv_
  560. #define glUniformMatrix3x2fv       _Opengl32_func.glUniformMatrix3x2fv_
  561. #define glUniformMatrix2x4fv       _Opengl32_func.glUniformMatrix2x4fv_
  562. #define glUniformMatrix4x2fv       _Opengl32_func.glUniformMatrix4x2fv_
  563. #define glUniformMatrix3x4fv       _Opengl32_func.glUniformMatrix3x4fv_
  564. #define glUniformMatrix4x3fv       _Opengl32_func.glUniformMatrix4x3fv_
  565.  
  566. #define glDeleteTextures           _Opengl32_func.glDeleteTextures_
  567.  
  568.  
  569.  
  570. // wglCreateContextAttribsARB is loaded and handled separately to _Opengl32_func
  571. #define wglCreateContextAttribsARB wglCreateContextAttribsARB_
  572. typedef HGLRC (WINAPI *PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC,HGLRC,const int*);
  573. extern PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB_;
  574.  
  575. #undef wglUseFontBitmaps
  576. #undef wglUseFontOutlines
  577. #define wglUseFontBitmaps  wglUseFontBitmapsA
  578. #define wglUseFontOutlines wglUseFontOutlinesA
  579.  
  580. union _Opengl32_func_t {
  581.   struct {
  582.     PROC ptrs_wgl_1_1[WGL_1_1_LEN];
  583.     PROC ptrs_gl_1_1[GL_1_1_LEN];
  584.     PROC ptrs_wgl[1];
  585.     PROC ptrs_gl[1];
  586.   };
  587.  
  588.   struct {
  589.     // wgl (OpenGL 1.1):
  590.     WINBOOL (WINAPI *wglCopyContext_)(HGLRC,HGLRC,UINT);
  591.     HGLRC   (WINAPI *wglCreateContext_)(HDC);
  592.     HGLRC   (WINAPI *wglCreateLayerContext_)(HDC,int);
  593.     WINBOOL (WINAPI *wglDeleteContext_)(HGLRC);
  594.     WINBOOL (WINAPI *wglDescribeLayerPlane_)(HDC,int,int,UINT,LPLAYERPLANEDESCRIPTOR);
  595.     HGLRC   (WINAPI *wglGetCurrentContext_)(VOID);
  596.     HDC     (WINAPI *wglGetCurrentDC_)(VOID);
  597.     int     (WINAPI *wglGetLayerPaletteEntries_)(HDC,int,int,int,COLORREF*);
  598.     PROC    (WINAPI *wglGetProcAddress_)(LPCSTR);
  599.     WINBOOL (WINAPI *wglMakeCurrent_)(HDC,HGLRC);
  600.     WINBOOL (WINAPI *wglRealizeLayerPalette_)(HDC,int,WINBOOL);
  601.     int     (WINAPI *wglSetLayerPaletteEntries_)(HDC,int,int,int,CONST COLORREF*);
  602.     WINBOOL (WINAPI *wglShareLists_)(HGLRC,HGLRC);
  603.     WINBOOL (WINAPI *wglSwapLayerBuffers_)(HDC,UINT);
  604.     WINBOOL (WINAPI *wglUseFontBitmapsA_)(HDC,DWORD,DWORD,DWORD);
  605.     WINBOOL (WINAPI *wglUseFontOutlinesA_)(HDC,DWORD,DWORD,DWORD,FLOAT,FLOAT,int,LPGLYPHMETRICSFLOAT);
  606.  
  607.     // gl (OpenGL 1.1):
  608.     void   (APIENTRY *glClearColor_)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
  609.     void   (APIENTRY *glClear_)(GLbitfield mask);
  610.     void   (APIENTRY *glPolygonMode_)(GLenum face, GLenum mode);
  611.     void   (APIENTRY *glViewport_)(GLint x, GLint y, GLsizei width, GLsizei height);
  612.     void   (APIENTRY *glGetBooleanv_)(GLenum pname, GLboolean *data);
  613.     void   (APIENTRY *glGetDoublev_)(GLenum pname, GLdouble *data);
  614.     void   (APIENTRY *glGetFloatv_)(GLenum pname, GLfloat *data);
  615.     void   (APIENTRY *glGetIntegerv_)(GLenum pname, GLint *data);
  616.     GLenum (APIENTRY *glGetError_)(void);
  617.  
  618.     // The rest of the wgl functions:
  619.     void* _dummy_ptr; // (Replace this with a proper proc if/when appropriate)
  620.     // ...
  621.  
  622.     // The rest of the gl functions:
  623.     GLuint (*glCreateShader_)(GLenum shaderType);
  624.     void   (*glShaderSource_)(GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
  625.     void   (*glCompileShader_)(GLuint shader);
  626.     void   (*glGetShaderiv_)(GLuint shader, GLenum pname, GLint *params);
  627.     void   (*glGetShaderInfoLog_)(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
  628.     GLuint (*glCreateProgram_)(void);
  629.     void   (*glAttachShader_)(GLuint program, GLuint shader);
  630.     void   (*glLinkProgram_)(GLuint program);
  631.     void   (*glGetProgramInfoLog_)(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
  632.     void   (*glDeleteShader_)(GLuint shader);
  633.     void   (*glGenVertexArrays_)(GLsizei n, GLuint *arrays);
  634.     void   (*glGenBuffers_)(GLsizei n, GLuint *buffers);
  635.     void   (*glBindVertexArray_)(GLuint array);
  636.     void   (*glBindBuffer_)(GLenum target, GLuint buffer);
  637.     void   (*glBufferData_)(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
  638.     void   (*glVertexAttribPointer_)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
  639.     void   (*glVertexAttribIPointer_)(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
  640.     void   (*glEnableVertexAttribArray_)(GLuint index);
  641.     void   (*glDisableVertexAttribArray_)(GLuint index);
  642.     void   (*glUseProgram_)(GLuint program);
  643.     void   (*glDrawArrays_)(GLenum mode, GLint first, GLsizei count);
  644.     void   (*glDeleteVertexArrays_)(GLsizei n, const GLuint *arrays);
  645.     void   (*glDeleteBuffers_)(GLsizei n, const GLuint *buffers);
  646.     void   (*glDeleteProgram_)(GLuint program);
  647.     void   (*glGetInteger64v_)(GLenum pname, GLint64 *data);
  648.     void   (*glGetBooleani_v_)(GLenum target, GLuint index, GLboolean *data);
  649.     void   (*glGetIntegeri_v_)(GLenum target, GLuint index, GLint *data);
  650.     void   (*glGetInteger64i_v_)(GLenum target, GLuint index, GLint64 *data);
  651.     void   (*glGetProgramiv_)(GLuint program, GLenum pname, GLint *params);
  652.     void   (*glBufferSubData_)(GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
  653.     void*  (*glMapBufferRange_)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
  654.     void   (*glGenTextures_)(GLsizei n, GLuint *textures);
  655.     void   (*glBindTexture_)(GLenum target, GLuint texture);
  656.     void   (*glTexBuffer_)(GLenum target, GLenum internalformat, GLuint buffer);
  657.     GLint  (*glGetUniformLocation_)(GLuint program, const GLchar *name);
  658.  
  659.     void   (*glUniform1f_)(GLint location, GLfloat v0);
  660.     void   (*glUniform2f_)(GLint location, GLfloat v0, GLfloat v1);
  661.     void   (*glUniform3f_)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
  662.     void   (*glUniform4f_)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
  663.  
  664.     void   (*glUniform1i_)(GLint location, GLint v0);
  665.     void   (*glUniform2i_)(GLint location, GLint v0, GLint v1);
  666.     void   (*glUniform3i_)(GLint location, GLint v0, GLint v1, GLint v2);
  667.     void   (*glUniform4i_)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
  668.  
  669.   //void   (*glUniform1ui_)(GLint location, GLuint v0);
  670.   //void   (*glUniform2ui_)(GLint location, GLuint v0, GLuint v1);
  671.   //void   (*glUniform3ui_)(GLint location, GLuint v0, GLuint v1, GLuint v2);
  672.   //void   (*glUniform4ui_)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
  673. //
  674.   //void   (*glUniform1fv_)(GLint location, GLsizei count, const GLfloat *value);
  675.   //void   (*glUniform2fv_)(GLint location, GLsizei count, const GLfloat *value);
  676.   //void   (*glUniform3fv_)(GLint location, GLsizei count, const GLfloat *value);
  677.   //void   (*glUniform4fv_)(GLint location, GLsizei count, const GLfloat *value);
  678. //
  679.   //void   (*glUniform1iv_)(GLint location, GLsizei count, const GLint *value);
  680.   //void   (*glUniform2iv_)(GLint location, GLsizei count, const GLint *value);
  681.   //void   (*glUniform3iv_)(GLint location, GLsizei count, const GLint *value);
  682.   //void   (*glUniform4iv_)(GLint location, GLsizei count, const GLint *value);
  683. //
  684.   //void   (*glUniform1uiv_)(GLint location, GLsizei count, const GLuint *value);
  685.   //void   (*glUniform2uiv_)(GLint location, GLsizei count, const GLuint *value);
  686.   //void   (*glUniform3uiv_)(GLint location, GLsizei count, const GLuint *value);
  687.   //void   (*glUniform4uiv_)(GLint location, GLsizei count, const GLuint *value);
  688. //
  689.   //void   (*glUniformMatrix2fv_)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  690.   //void   (*glUniformMatrix3fv_)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  691.   //void   (*glUniformMatrix4fv_)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  692.   //void   (*glUniformMatrix2x3fv_)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  693.   //void   (*glUniformMatrix3x2fv_)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  694.   //void   (*glUniformMatrix2x4fv_)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  695.   //void   (*glUniformMatrix4x2fv_)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  696.   //void   (*glUniformMatrix3x4fv_)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  697.   //void   (*glUniformMatrix4x3fv_)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  698.  
  699.   void     (*glDeleteTextures_)(GLsizei n, const GLuint *textures);
  700.  
  701.   };
  702. };
  703.  
  704. extern _Opengl32_func_t _Opengl32_func;
  705. extern char             _Opengl32_names_wgl_1_1[];
  706. extern char             _Opengl32_names_gl_1_1[];
  707. extern char             _Opengl32_names_wgl[];
  708. extern char             _Opengl32_names_gl[];
  709.  
  710.  
  711.  
  712.  
  713.  
  714. // Creates an OpenGL 3.3 core context, and loads any required extensions
  715. // (OpenGL 1.1 stuff is loaded inside "src/main.cpp"!)
  716.  
  717. int OpenGLInit();
  718.  
  719. void OpenGLQuit();
  720.  
  721.  
  722.  
  723.  
  724.  
  725. #endif // _OPENGL_HPP
  726. /******************************************************************************/
  727. /******************************************************************************/
  728. //"opengl_metaballs_2025-06-26\include\win32\video.hpp":
  729. #ifndef _WIN32_VIDEO_HPP
  730. #define _WIN32_VIDEO_HPP
  731.  
  732. #include <windows.h>
  733.  
  734.  
  735.  
  736. #define RegisterClassA          _User32_func.RegisterClassA_
  737. #define CreateWindowExA         _User32_func.CreateWindowExA_
  738. #define DefWindowProcA          _User32_func.DefWindowProcA_
  739. #define InvalidateRect          _User32_func.InvalidateRect_
  740. #define UpdateWindow            _User32_func.UpdateWindow_
  741. #define BeginPaint              _User32_func.BeginPaint_
  742. #define EndPaint                _User32_func.EndPaint_
  743. #define PeekMessageA            _User32_func.PeekMessageA_
  744. #define DispatchMessageA        _User32_func.DispatchMessageA_
  745. #define DestroyWindow           _User32_func.DestroyWindow_
  746. #define ReleaseDC               _User32_func.ReleaseDC_
  747. #define GetDC                   _User32_func.GetDC_
  748. #define PostQuitMessage         _User32_func.PostQuitMessage_
  749. #define MessageBoxA             _User32_func.MessageBoxA_
  750. #define TranslateMessage        _User32_func.TranslateMessage_
  751. #define GetWindowLongA          _User32_func.GetWindowLongA_
  752. #define AdjustWindowRectEx      _User32_func.AdjustWindowRectEx_
  753. #define LoadCursorA             _User32_func.LoadCursorA_
  754. #define MapVirtualKeyA          _User32_func.MapVirtualKeyA_
  755. #define GetCursorPos            _User32_func.GetCursorPos_
  756. #define ScreenToClient          _User32_func.ScreenToClient_
  757. #define ShowCursor              _User32_func.ShowCursor_
  758. #define ClipCursor              _User32_func.ClipCursor_
  759. #define GetClientRect           _User32_func.GetClientRect_
  760. #define ClientToScreen          _User32_func.ClientToScreen_
  761. #define SetCapture              _User32_func.SetCapture_
  762. #define ReleaseCapture          _User32_func.ReleaseCapture_
  763. #define SetCursorPos            _User32_func.SetCursorPos_
  764. #define RegisterRawInputDevices _User32_func.RegisterRawInputDevices_
  765. #define GetRawInputData         _User32_func.GetRawInputData_
  766. #define FillRect                _User32_func.FillRect_
  767. #define ShowWindow              _User32_func.ShowWindow_
  768.  
  769. union _User32_func_t {
  770.   FARPROC ptrs[1];
  771.  
  772.   struct {
  773.     ATOM    (WINAPI *RegisterClassA_)(CONST WNDCLASSA*);
  774.     HWND    (WINAPI *CreateWindowExA_)(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
  775.     LRESULT (WINAPI *DefWindowProcA_)(HWND, UINT, WPARAM, LPARAM);
  776.     WINBOOL (WINAPI *InvalidateRect_)(HWND, CONST RECT*, WINBOOL);
  777.     WINBOOL (WINAPI *UpdateWindow_)(HWND);
  778.     HDC     (WINAPI *BeginPaint_)(HWND, LPPAINTSTRUCT);
  779.     WINBOOL (WINAPI *EndPaint_)(HWND, CONST PAINTSTRUCT*);
  780.     WINBOOL (WINAPI *PeekMessageA_)(LPMSG, HWND, UINT, UINT, UINT);
  781.     LRESULT (WINAPI *DispatchMessageA_)(CONST MSG*);
  782.     WINBOOL (WINAPI *DestroyWindow_)(HWND);
  783.     int     (WINAPI *ReleaseDC_)(HWND, HDC);
  784.     HDC     (WINAPI *GetDC_)(HWND);
  785.     VOID    (WINAPI *PostQuitMessage_)(int);
  786.     int     (WINAPI *MessageBoxA_)(HWND, LPCSTR, LPCSTR, UINT);
  787.     WINBOOL (WINAPI *TranslateMessage_)(CONST MSG*);
  788.     LONG    (WINAPI *GetWindowLongA_)(HWND, int);
  789.     WINBOOL (WINAPI *AdjustWindowRectEx_)(LPRECT, DWORD, WINBOOL, DWORD);
  790.     HCURSOR (WINAPI *LoadCursorA_)(HINSTANCE, LPCSTR);
  791.     UINT    (WINAPI *MapVirtualKeyA_)(UINT, UINT);
  792.   //WINBOOL (WINAPI *GetCursorPos_)(LPPOINT);
  793.     WINBOOL (WINAPI *ScreenToClient_)(HWND, LPPOINT);
  794.     int     (WINAPI *ShowCursor_)(WINBOOL);
  795.     WINBOOL (WINAPI *ClipCursor_)(CONST RECT*);
  796.     WINBOOL (WINAPI *GetClientRect_)(HWND, LPRECT);
  797.     WINBOOL (WINAPI *ClientToScreen_)(HWND, LPPOINT);
  798.     HWND    (WINAPI *SetCapture_)(HWND);
  799.     WINBOOL (WINAPI *ReleaseCapture_)(VOID);
  800.     WINBOOL (WINAPI *SetCursorPos_)(int, int);
  801.     WINBOOL (WINAPI *RegisterRawInputDevices_)(PCRAWINPUTDEVICE, UINT, UINT);
  802.     UINT    (WINAPI *GetRawInputData_)(HRAWINPUT, UINT, LPVOID, PUINT, UINT);
  803.     int     (WINAPI *FillRect_)(HDC, CONST RECT*, HBRUSH);
  804.     WINBOOL (WINAPI *ShowWindow_)(HWND, int);
  805.   };
  806. };
  807.  
  808. extern _User32_func_t _User32_func;
  809. extern char           _User32_names_a[];
  810.  
  811.  
  812.  
  813. /******************************************************************************/
  814.  
  815.  
  816.  
  817. #define CreateCompatibleDC     _Gdi32_func.CreateCompatibleDC_
  818. #define CreateDIBSection       _Gdi32_func.CreateDIBSection_
  819. #define SelectObject           _Gdi32_func.SelectObject_
  820. #define DeleteObject           _Gdi32_func.DeleteObject_
  821. #define BitBlt                 _Gdi32_func.BitBlt_
  822. #define DeleteDC               _Gdi32_func.DeleteDC_
  823. #define StretchBlt             _Gdi32_func.StretchBlt_
  824. #define CreateCompatibleBitmap _Gdi32_func.CreateCompatibleBitmap_
  825. #define SetStretchBltMode      _Gdi32_func.SetStretchBltMode_
  826. #define SetDIBColorTable       _Gdi32_func.SetDIBColorTable_
  827. #define CreateSolidBrush       _Gdi32_func.CreateSolidBrush_
  828. #define SetPixelFormat         _Gdi32_func.SetPixelFormat_
  829. #define ChoosePixelFormat      _Gdi32_func.ChoosePixelFormat_
  830. #define SwapBuffers            _Gdi32_func.SwapBuffers_
  831.  
  832. union _Gdi32_func_t {
  833.   FARPROC ptrs[1];
  834.  
  835.   struct {
  836.     HDC     (WINAPI *CreateCompatibleDC_)(HDC);
  837.     HBITMAP (WINAPI *CreateDIBSection_)(HDC, CONST BITMAPINFO*, UINT, VOID**, HANDLE, DWORD);
  838.     HGDIOBJ (WINAPI *SelectObject_)(HDC, HGDIOBJ);
  839.     WINBOOL (WINAPI *DeleteObject_)(HGDIOBJ);
  840.     WINBOOL (WINAPI *BitBlt_)(HDC, int, int, int, int, HDC, int, int, DWORD);
  841.     WINBOOL (WINAPI *DeleteDC_)(HDC);
  842.     WINBOOL (WINAPI *StretchBlt_)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD);
  843.     HBITMAP (WINAPI *CreateCompatibleBitmap_)(HDC, int, int);
  844.     int     (WINAPI *SetStretchBltMode_)(HDC, int);
  845.     UINT    (WINAPI *SetDIBColorTable_)(HDC, UINT, UINT, CONST RGBQUAD*);
  846.     HBRUSH  (WINAPI *CreateSolidBrush_)(COLORREF);
  847.     WINBOOL (WINAPI *SetPixelFormat_)(HDC, int, CONST PIXELFORMATDESCRIPTOR*);
  848.     int     (WINAPI *ChoosePixelFormat_)(HDC, CONST PIXELFORMATDESCRIPTOR*);
  849.     WINBOOL (WINAPI *SwapBuffers_)(HDC);
  850.   };
  851. };
  852.  
  853. extern _Gdi32_func_t _Gdi32_func;
  854. extern char          _Gdi32_names_a[];
  855.  
  856.  
  857.  
  858. /******************************************************************************/
  859.  
  860.  
  861.  
  862. int WindowInit(HINSTANCE hThisInst);
  863.  
  864. void WindowQuit();
  865.  
  866.  
  867.  
  868. #endif /* _WIN32_VIDEO_HPP */
  869. /******************************************************************************/
  870. /******************************************************************************/
  871. //"opengl_metaballs_2025-06-26\src\win32\_WindowProc.hpp":
  872. #ifndef _WIN32__WINDOWPROC_HPP
  873. #define _WIN32__WINDOWPROC_HPP
  874.  
  875. #include <win32/video.hpp>
  876. #include <win32/input.hpp>
  877.  
  878. #include <windowsx.h>
  879.  
  880. #include <public_stuff.hpp>
  881.  
  882.  
  883.  
  884. //assumes window is without a menu
  885. static inline Point2d CalculateWindowSize(u32 innerWidth, u32 innerHeight,
  886.                                           u32 flags,      u32 flagsEx)
  887. {
  888.   RECT winSize;
  889.   winSize.left   = 0;
  890.   winSize.top    = 0;
  891.   winSize.right  = innerWidth;
  892.   winSize.bottom = innerHeight;
  893.   AdjustWindowRectEx(&winSize, flags, false, flagsEx);
  894.  
  895.   Point2d winSizeAdjusted;
  896.   winSizeAdjusted.x = winSize.right  - winSize.left;
  897.   winSizeAdjusted.y = winSize.bottom - winSize.top;
  898.   return winSizeAdjusted;
  899.  
  900. }
  901.  
  902.  
  903.  
  904. static inline Rect2d ConvertToKitRect(RECT& rectIn){
  905.   Rect2d rectOut;
  906.   rectOut.x = rectIn.left;
  907.   rectOut.y = rectIn.top;
  908.   rectOut.w = rectIn.right  - rectIn.left;
  909.   rectOut.h = rectIn.bottom - rectIn.top;
  910.  
  911.   return rectOut;
  912.  
  913. }
  914.  
  915.  
  916.  
  917. static inline RECT ConvertFromKitRect(Rect2d& rectIn){
  918.   RECT rectOut;
  919.   rectOut.left   = rectIn.x;
  920.   rectOut.top    = rectIn.y;
  921.   rectOut.right  = rectIn.x + rectIn.w;
  922.   rectOut.bottom = rectIn.y + rectIn.h;
  923.  
  924.   return rectOut;
  925.  
  926. }
  927.  
  928.  
  929.  
  930.  
  931.  
  932. union KEY_Params {
  933.   struct {
  934.     u32 repeatCount   : 16; // 0 -> 15
  935.     u32 scanCode      :  8; //16 -> 23
  936.     u32 extendedKey   :  1; //24
  937.     u32 _reserved     :  4; //25 -> 28
  938.     u32 altKeyDown    :  1; //29
  939.     u32 prevUnpressed :  1; //30
  940.     u32 currUnpressed :  1; //31
  941.   };
  942.  
  943.   u32 value;
  944.  
  945.   KEY_Params(u32 _value) : value(_value) {}
  946.  
  947. };
  948.  
  949.  
  950.  
  951. // This event handler is used for KEY_CHAR, KEY_UP, and KEY_DOWN events
  952. static inline void HANDLE_KEY_CHARUPDOWN(Event& event,
  953.                                          bool charEvent,u8 virtualKeyCode,
  954.                                          KEY_Params& params, u16 kmods)
  955. {
  956.   if(charEvent){
  957.     event.type = EVENT_KEY_CHAR;
  958.   } else {
  959.     if(params.currUnpressed) event.type = EVENT_KEY_UP;
  960.     else                     event.type = EVENT_KEY_DOWN;
  961.   }
  962.  
  963.   event.key.kmods = kmods;
  964.  
  965.   event.key.pkey = params.scanCode;
  966.   event.key.vkey = virtualKeyCode;
  967.  
  968.   event.key.pressed = !params.currUnpressed;
  969.   event.key.repeat  = params.repeatCount>0; //modified to act as a boolean
  970.   event.key.ischar  = charEvent;
  971.  
  972. }
  973.  
  974.  
  975.  
  976.  
  977.  
  978. union MOUSE_ButtonStates {
  979.   // The positions of these bits are the same as
  980.   // the bitmasks in Event_Mouse_ButtonEnum
  981.   struct {
  982.     u8  left   : 1;
  983.     u8  middle : 1;
  984.     u8  right  : 1;
  985.     u8  x1     : 1;
  986.     u8  x2     : 1;
  987.     u8  ctrl   : 1; // 'Is the control key currently pressed?'
  988.     u8  shift  : 1; // 'Is the shift key currently pressed?'
  989.     u8 _unused : 1;
  990.   };
  991.  
  992.   u8 value;
  993.  
  994.   MOUSE_ButtonStates() : value(0) {}
  995.   MOUSE_ButtonStates(u8 _value) : value(_value) {}
  996.  
  997. };
  998.  
  999.  
  1000.  
  1001. extern MOUSE_ButtonStates mbutton_states;
  1002.  
  1003.  
  1004.  
  1005. static inline void HANDLE_MOUSE_MOVED(Event& event, u8 buttonStates,
  1006.                                       Point2d& previous, Point2d& current)
  1007. {
  1008.   event.type = EVENT_MOUSE_MOVED;
  1009.  
  1010.   event.mouse.x = current.x;
  1011.   event.mouse.y = current.y;
  1012.  
  1013.  
  1014.   Fpoint2d _previous = { (f32)previous.x, (f32)previous.y };
  1015.   Fpoint2d _current  = { (f32) current.x, (f32) current.y };
  1016.  
  1017.   event.mouse.dx = _current.x - _previous.x;
  1018.   event.mouse.dy = _current.y - _previous.y;
  1019.  
  1020.  
  1021.   event.mouse.button  = buttonStates;
  1022.   event.mouse.pressed = buttonStates!=0;
  1023.  
  1024. }
  1025.  
  1026.  
  1027.  
  1028. // Same event handler is used for both MOUSE_HWHEEL and MOUSE_VWHEEL events
  1029. static inline void HANDLE_MOUSE_HVWHEEL(Event& event,
  1030.                                         bool verticalScroll, s16 scrollAmount,
  1031.                                         u8 buttonStates, Point2d& mousePos)
  1032. {
  1033.   if(verticalScroll){
  1034.     event.type = EVENT_MOUSE_VWHEEL;
  1035.     event.mouse.dy = (f32)scrollAmount/WHEEL_DELTA;
  1036.   } else {
  1037.     event.type = EVENT_MOUSE_HWHEEL;
  1038.     event.mouse.dx = (f32)scrollAmount/WHEEL_DELTA;
  1039.   }
  1040.  
  1041.   event.mouse.x = mousePos.x;
  1042.   event.mouse.y = mousePos.y;
  1043.  
  1044.   event.mouse.button  = buttonStates;
  1045.   event.mouse.pressed = buttonStates!=0;
  1046.  
  1047. }
  1048.  
  1049.  
  1050.  
  1051. // Same event handler is used for both MOUSE_UP and MOUSE_DOWN events
  1052. static inline void HANDLE_MOUSE_UPDOWN(Event& event, Point2d& clickPosition,
  1053.                                        u8 buttonStates, bool pressed, bool doubleClick)
  1054. {
  1055.   if(pressed) event.type = EVENT_MOUSE_DOWN;
  1056.   else        event.type = EVENT_MOUSE_UP;
  1057.  
  1058.   event.mouse.x = clickPosition.x;
  1059.   event.mouse.y = clickPosition.y;
  1060.  
  1061.   event.mouse.button   = buttonStates;
  1062.   event.mouse.pressed  = pressed;
  1063.   event.mouse.dblClick = doubleClick;
  1064.  
  1065. }
  1066.  
  1067.  
  1068.  
  1069. static void add_event(Event& evt);
  1070.  
  1071. // flag_which must be one of the "DOWN" flags (Ex.: RI_MOUSE_BUTTON_1_DOWN)
  1072. // (Also, timestamp is assumed to have already been set inside evt!)
  1073. static void send_raw_mbutton_press(Event& evt, u16 flags,
  1074.                                    u16 flag_which, u8 button_which);
  1075.  
  1076.  
  1077.  
  1078. // This doesn't handle a single mouse event,
  1079. // but rather all of the mouse events when the cursor is trapped
  1080. static inline void HANDLE_MOUSE_RAWINPUT(Event& evt,
  1081.                                          u16 flags, f32 deltaWheel,
  1082.                                          f32 deltaX, f32 deltaY)
  1083. {
  1084.   QueryPerformanceCounter((LARGE_INTEGER*)&evt.common.timestamp);
  1085.  
  1086.  
  1087.  
  1088.   evt.mouse.button = mbutton_states.value;
  1089.  
  1090.   send_raw_mbutton_press(evt, flags, RI_MOUSE_BUTTON_1_DOWN, MBUTTON_LEFT  );
  1091.   send_raw_mbutton_press(evt, flags, RI_MOUSE_BUTTON_2_DOWN, MBUTTON_MIDDLE);
  1092.   send_raw_mbutton_press(evt, flags, RI_MOUSE_BUTTON_3_DOWN, MBUTTON_RIGHT );
  1093.   send_raw_mbutton_press(evt, flags, RI_MOUSE_BUTTON_4_DOWN, MBUTTON_X1    );
  1094.   send_raw_mbutton_press(evt, flags, RI_MOUSE_BUTTON_5_DOWN, MBUTTON_X2    );
  1095.  
  1096.   evt.mouse.pressed = evt.mouse.button!=0;
  1097.  
  1098.  
  1099.  
  1100.   if(flags&RI_MOUSE_WHEEL){
  1101.     evt.type = EVENT_MOUSE_VWHEEL;
  1102.     evt.mouse.dy = deltaWheel;
  1103.     _add_event_func: add_event(evt);
  1104.  
  1105.   } else if(flags&RI_MOUSE_HWHEEL){
  1106.     evt.type = EVENT_MOUSE_HWHEEL;
  1107.     evt.mouse.dx = deltaWheel;
  1108.     goto _add_event_func;
  1109.  
  1110.   }
  1111.  
  1112.  
  1113.  
  1114.   if(deltaX != 0.0f  ||  deltaY != 0.0f){
  1115.     evt.type = EVENT_MOUSE_MOVED;
  1116.     evt.mouse.dx = deltaX;
  1117.     evt.mouse.dy = deltaY;
  1118.     add_event(evt);
  1119.  
  1120.   }
  1121.  
  1122. }
  1123.  
  1124.  
  1125.  
  1126. #endif /* _WIN32__WINDOWPROC_HPP */
  1127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement