32 Commits

Author SHA1 Message Date
bc263cfcb9 uusin 2025-07-31 20:15:39 +03:00
efac210beb poistettu valot 2025-07-31 18:16:10 +03:00
b1f6fab663 fix 2025-07-31 18:03:01 +03:00
aa949ba2a7 uus fft 2025-07-31 16:27:44 +03:00
35c09187a4 turhien tiedostojen poisto 2025-07-31 14:16:29 +03:00
2c03c51193 hohkaminen alhaalta 2025-07-29 20:57:34 +03:00
700d7caf6d shaderiin muutoksia 2025-07-29 19:14:56 +03:00
c6cccbcb0e biisin säätöä 2025-07-29 12:52:35 +03:00
35c08c5e80 säätöä 2025-07-28 16:39:34 +03:00
c11d86922c pientä fixailua 2025-07-28 14:33:47 +03:00
e092075c8b uudet hexat integroitu teemun shaderiin 2025-07-28 02:10:39 +03:00
99af2bbf5c nuotti-triggeri ja useampi tekstuuri käytössä 2025-07-27 22:49:50 +03:00
77e5f0fc70 scaledFFT 2025-07-24 23:50:49 +03:00
62e58d0e1f valot menee heksakoodin mukaan 2025-07-24 23:13:03 +03:00
d33042e30a syncit ei toimi 2025-07-23 22:57:27 +03:00
f460f71ab4 Merge branch 'teemun_uusi_efekti' into teemun_shaderi 2025-07-23 22:31:01 +03:00
3f3b84b15c jotain pientä aloitettu 2025-07-23 22:29:22 +03:00
b86794f9b2 Merge branch 'teemun_uusi_efekti' of https://gitea.xn--jrvisalo-0za.fi/markus/4k_synthwave into teemun_uusi_efekti 2025-07-22 23:20:21 +03:00
3110e64236 tän pitäisi tehdä shapeja 2025-07-22 23:20:03 +03:00
be7398cc91 synccejä lisätty 2025-07-22 22:59:30 +03:00
09efaee330 tän pitäisi tehdä shapeja 2025-07-22 22:22:35 +03:00
5e431e5a85 shader things 2025-07-15 23:05:45 +03:00
3cba52f4ae Turhaksi jäänyt if ehto pois. 2025-07-15 17:23:03 +03:00
34230e18e5 Exponential smoothing FFT:n arvoille. Rauhoittaa piikkien pomppimista. 2025-07-15 17:15:49 +03:00
cc6619f9a0 Lisää Petrin siivotun shaderin
FFT ohjaa hexojen korkeutta
Ylimääräiset tavarat siivottu random.frag tiedostoon
syncs[0] aika sekunteina
2025-07-15 14:20:38 +03:00
3fcd960c9c Enable crinkler 2025-07-15 00:32:15 +03:00
96de65cde0 Add fft 2025-07-14 22:52:15 +03:00
f1343ea200 exit app when song ends 2025-06-24 19:05:01 +03:00
cfd6c97f32 direct sound ja parempi syncca 2025-06-24 17:26:50 +03:00
134a85111e shader sync toimii 2025-06-24 15:54:17 +03:00
47cb2c965f add sointu, add song, update shader_minifier 2025-06-23 20:49:20 +03:00
076ee0be68 leviathan-2.0 2025-06-15 10:24:37 +03:00
31 changed files with 17334 additions and 1 deletions

295
.gitignore vendored Normal file
View File

@ -0,0 +1,295 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# Omat
*.inl
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Typescript v1 declaration files
typings/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# Ignore output directories
out/*.exe
out.html

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Roope Mäkinen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,2 +1,72 @@
# 4k_synthwave
# Leviathan 2.0
Leviathan is a simple "framework" for developing small (around 1-8 kilobyte) [Demoscene](https://en.wikipedia.org/wiki/Demoscene) productions. It is primarily developed for creating the [Prismbeings](https://www.pouet.net/groups.php?which=12646) 4k Intros. "Intro" is parlance for a size-wise small Demo.
## "Features"
* Kept as simple as possible, made for productivity.
* No external dependencies, instantly ready for development.
* Readymade configurations for different use cases.
* Automated shader minification upon compilation.
* Simple unintrusive editor mode with seeking and hot reloading.
* Easy to customize for your needs.
## Compatibility
Current version intended to be used with Visual Studio 2017 (any version). Make sure you have a version with the latest Windows SDK installed (at least version 10.0.17134.0), or use version 8.1. With some extra configuration 2015 and 2013 should work as well. Leviathan is is very Windows-specific and isn't really sensibly portable anywhere else.
### Components
Leviathan requires these componens to be installed with the Visual Studio configuration. Run the Visual Studio Installer to check you have at least these installed:
* **VC++ 2017 version 15.9 v14.16 latest v141 tools**, or VC++ 2015.3 v14.00 (v140)
* **Windows 10 SDK** (any version should be fine, Leviathan currently defaults to 10.0.17134.0, change as needed) or Windows 8.1 SDK
* Windows Universal CRT SDK
* Windows Universal C Runtime
## Configurations
This section describes the different build configurations available from Visual Studio IDE
### Heavy Release
Uses heavier Crinkler settings to squeeze out maximum compression (note though that the /VERYSLOW flag could sometimes backfire and produce a larger executable). Also doesn't do shader minification since it assumes the user is performing hand minifications to the .inl source, which would be overwritten by the Shader Minifier.
### Release
Generally recommended for producing a final executable to be released. Uses moderate Crinkler settings.
### Snapshot
Use for general development. Only minimal crinklering but nothing extra included. Useful still for keeping track of relative size changes. This configuration overwrites Release configuration binaries, but doesn't generate and overwrite crinkler report.
### Debug
Deprecated, might work but currently not really useful and not updated. Editor covers everything in this configuration.
### Editor
Creates a bigger exe similar to Debug, but with keyboard controls for pausing and seeking around temporally. Requires a pre-rendered copy of the audio track used (well, not a must but...). Overwrites Debug configuration binaries.
## Build Flags
This section describes the preprocessor definitions available for various features and size optimizations.
### OPENGL_DEBUG
Checks for shader compilation errors on initialization. Also enables to use the CHECK_ERRORS macro on debug.h. You want to leave this disabled in the final release obviously.
### FULLSCREEN
Changes the display mode to fullscreen instead of a static window. You want to use this in your final release but probably not while developing and debugging. Disabling this saves around 20 bytes.
### DESPERATE
Enabling this disables message handling, which isn't strictly necessary but makes running the intro much more reliable and compatible. Enabling this saves around 20 bytes.
### BREAK_COMPATIBILITY
Enabling this uses a pixel format descriptor that uses parameters that are mostly zeroes. This improves the compressability at the cost of violating the API specifications. You might be able to run your intro currently, but might break in the future or on other peoples' configurations right now. Enabling this saves around 5 bytes.
### POST_PASS
Enables using the OpenGL backbuffer as a framebuffer and texture to perform simple post processing or other functionality.
### USE_MIPMAPS
Generates mipmaps for the backbuffer texture.
### USE_AUDIO
Disabling this doesn't include or init 4klang at all.
### NO_UNIFORMS
Enables using the gl_Color vertex attribute to pass variables to the shader instead of the usual uniform uploading. This saves one function import and around 10 bytes.
## Contributing
Fork your own and submit a pull request, ideas always welcome. Please don't add any additional dependencies unless it's a single-file-header library or something similar, and non-GPL licensed. Inclusion of CMake or other such tools is also not considered.
## TODO
* Automatically render and dump audio in Editor mode if no .wav already exists.
* Support for more softsynths?
* Editor mode overlays (non-interactive seekbar, etc.).
* More functionality to add further render passes easily.
* Continue Structuring the code better so not everything is inlined in the main loop.
* Write out a version in assembly to use in the Release configuration.
## Acknowledgements
* Rimina for initial motivation and OpenGL debug functions.
* LJ for giving suggestions for some nice hacks.
* Fizzer for help with implementing some of said hacks.
* iq for the original 4k intro framework.
* Mentor and Blueberry for Crinkler.
* LLB for Shader Minifier.
* Numerous people for various resources and information: auld, ps, cce, msqrt, ferris, yzi, las to name a few.

55
crinkler-license.txt Normal file
View File

@ -0,0 +1,55 @@
Crinkler - compressing linker for Windows
Copyright 2005-2019 Aske Simon Christensen and Rune L. H. Stubbe.
DISTRIBUTION
Crinkler is freeware. You may distribute it freely, as long as the
Crinkler executable and all accompanying documentation files are kept
together and intact. You may not distribute modified versions or any
kind of derived work based on Crinkler or its documentation.
USE AND AUTHOR RIGHTS
The output of Crinkler (executable files, HTML compression reports
and other textual output) is to be considered the original works of
you as a user of Crinkler. You may use Crinkler and its output for
any legal purpose with the following restrictions:
- You may not use Crinkler or its output for any commercial purpose.
- You may not use Crinkler or its output in any setting where security
is essential.
- You may not use Crinkler or its output for any safety critical
purpose.
- You may not use Crinkler or its output in the production of any
virus, worm, trojan, spyware or other malicious software.
NO WARRANTY
Crinkler comes with no warranties of any kind. Crinkler is
experimental software that relies on many undocumented features of the
Windows PE loader. It has been created with the sole purpose of
producing tiny executable files that may or may not work as intended
on current and/or future versions of Windows.
LICENSE OF DISTORM
Crinkler uses the BSD-licensed diStorm disassembler library for
producing disassembly output of the compressed code. The license for
diStorm requires that the license below is included with derivative
works. The license below applies only to diStorm and not to Crinkler
as a whole.
:[diStorm64}:
The ultimate disassembler library.
Copyright (c) 2003,2004,2005,2006,2007,2008, Gil Dabah
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name of the diStorm nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

1229
crinkler-manual.txt Normal file

File diff suppressed because it is too large Load Diff

644
leviathan.vcxproj Normal file
View File

@ -0,0 +1,644 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Editor|Win32">
<Configuration>Editor</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Heavy Release|Win32">
<Configuration>Heavy Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Snapshot|Win32">
<Configuration>Snapshot</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}</ProjectGuid>
<ProjectName>Leviathan 2.0</ProjectName>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
<Import Project="$(VCTargetsPath)\BuildCustomizations\masm.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>12.0.30501.0</_ProjectFileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>out\</OutDir>
<IntDir>bin\debug\</IntDir>
<LinkIncremental>
</LinkIncremental>
<ExecutablePath>$(SolutionDir);$(ExecutablePath)</ExecutablePath>
<TargetName>leviathan-debug</TargetName>
<GenerateManifest>false</GenerateManifest>
<IgnoreImportLibrary>true</IgnoreImportLibrary>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">
<OutDir>out\</OutDir>
<IntDir>bin\debug\</IntDir>
<LinkIncremental>false</LinkIncremental>
<ExecutablePath>$(SolutionDir);$(ExecutablePath)</ExecutablePath>
<TargetName>leviathan-debug</TargetName>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>out\</OutDir>
<IntDir>bin\release\</IntDir>
<LinkIncremental>
</LinkIncremental>
<GenerateManifest>
</GenerateManifest>
<ExecutablePath>$(SolutionDir);$(ExecutablePath)</ExecutablePath>
<TargetName>leviathan-release</TargetName>
<IgnoreImportLibrary>false</IgnoreImportLibrary>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">
<OutDir>out\</OutDir>
<IntDir>bin\release\</IntDir>
<LinkIncremental>
</LinkIncremental>
<GenerateManifest>
</GenerateManifest>
<ExecutablePath>$(SolutionDir);$(ExecutablePath)</ExecutablePath>
<TargetName>leviathan-release</TargetName>
<PreBuildEventUseInBuild>false</PreBuildEventUseInBuild>
<IgnoreImportLibrary>true</IgnoreImportLibrary>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">
<OutDir>out\</OutDir>
<IntDir>bin\release\</IntDir>
<LinkIncremental>
</LinkIncremental>
<GenerateManifest>
</GenerateManifest>
<ExecutablePath>$(SolutionDir);$(ExecutablePath)</ExecutablePath>
<TargetName>leviathan-snapshot</TargetName>
<IgnoreImportLibrary>true</IgnoreImportLibrary>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Midl>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MkTypLibCompatible>true</MkTypLibCompatible>
<SuppressStartupBanner>true</SuppressStartupBanner>
<TargetEnvironment>Win32</TargetEnvironment>
<TypeLibraryName>.\bin/Debug/Leviathan.tlb</TypeLibraryName>
<HeaderFileName>
</HeaderFileName>
</Midl>
<ClCompile>
<Optimization>MinSpace</Optimization>
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;WINDOWS;DEBUG;SIMD;A32BITS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeaderOutputFile>
</PrecompiledHeaderOutputFile>
<AssemblerListingLocation>bin\debug\</AssemblerListingLocation>
<ObjectFileName>bin\debug\</ObjectFileName>
<ProgramDataBaseFileName>bin\debug\</ProgramDataBaseFileName>
<BrowseInformation>false</BrowseInformation>
<WarningLevel>Level3</WarningLevel>
<TreatWarningAsError>false</TreatWarningAsError>
<SuppressStartupBanner>true</SuppressStartupBanner>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>CompileAsCpp</CompileAs>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<IntrinsicFunctions>true</IntrinsicFunctions>
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers>
<ExceptionHandling>Sync</ExceptionHandling>
<BufferSecurityCheck>false</BufferSecurityCheck>
<CallingConvention>StdCall</CallingConvention>
<OmitDefaultLibName>true</OmitDefaultLibName>
<LanguageStandard>
</LanguageStandard>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
<FloatingPointModel>Fast</FloatingPointModel>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>opengl32.lib;dsound.lib;src/sointu/song.obj;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>out\leviathan-debug.exe</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
<SubSystem>Windows</SubSystem>
<EntryPointSymbol>entrypoint</EntryPointSymbol>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>bin\debug\$(TargetName).pdb</ProgramDatabaseFile>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention />
<TargetMachine>MachineX86</TargetMachine>
<EntryPointSymbol>entrypoint</EntryPointSymbol>
<AssemblyDebug>true</AssemblyDebug>
<ProgramDatabaseFile>bin\release\$(TargetName).pdb</ProgramDatabaseFile>
<ProfileGuidedDatabase>bin\debug\$(TargetName).pgd</ProfileGuidedDatabase>
<ManifestFile />
<ImageHasSafeExceptionHandlers />
<EnableUAC />
<LinkErrorReporting />
<TypeLibraryResourceID />
</Link>
<Bscmake>
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>.\bin/Release/Leviathan.bsc</OutputFile>
</Bscmake>
<ProjectReference>
<LinkLibraryDependencies>false</LinkLibraryDependencies>
</ProjectReference>
<PreBuildEvent>
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
<Message>Minify user-supplied shader files.</Message>
</PreBuildEvent>
<Bscmake>
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>$(OutDir)Leviathan.bsc</OutputFile>
</Bscmake>
<ProjectReference>
<LinkLibraryDependencies>false</LinkLibraryDependencies>
</ProjectReference>
<PreBuildEvent>
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag
shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
<Message>Minify user-supplied shader files.</Message>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">
<Midl>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MkTypLibCompatible>true</MkTypLibCompatible>
<SuppressStartupBanner>true</SuppressStartupBanner>
<TargetEnvironment>Win32</TargetEnvironment>
<TypeLibraryName>.\bin/Debug/Leviathan.tlb</TypeLibraryName>
<HeaderFileName>
</HeaderFileName>
</Midl>
<ClCompile>
<Optimization>MinSpace</Optimization>
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>EDITOR_CONTROLS;_DEBUG;WINDOWS;DEBUG;SIMD;A32BITS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeaderOutputFile>
</PrecompiledHeaderOutputFile>
<AssemblerListingLocation>bin\debug\</AssemblerListingLocation>
<ObjectFileName>bin\debug\</ObjectFileName>
<ProgramDataBaseFileName>bin\debug\</ProgramDataBaseFileName>
<BrowseInformation>false</BrowseInformation>
<WarningLevel>Level3</WarningLevel>
<TreatWarningAsError>false</TreatWarningAsError>
<SuppressStartupBanner>true</SuppressStartupBanner>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>CompileAsCpp</CompileAs>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<IntrinsicFunctions>true</IntrinsicFunctions>
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers>
<ExceptionHandling>Sync</ExceptionHandling>
<BufferSecurityCheck>false</BufferSecurityCheck>
<CallingConvention>StdCall</CallingConvention>
<OmitDefaultLibName>false</OmitDefaultLibName>
<LanguageStandard>
</LanguageStandard>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>dsound.lib;opengl32.lib;src/sointu/song.obj;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>out/leviathan-debug.exe</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>bin\debug\$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Console</SubSystem>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
<EntryPointSymbol>
</EntryPointSymbol>
<AssemblyDebug>true</AssemblyDebug>
<ProfileGuidedDatabase>bin\debug\$(TargetName).pgd</ProfileGuidedDatabase>
<IgnoreAllDefaultLibraries>
</IgnoreAllDefaultLibraries>
<ManifestFile />
<ImageHasSafeExceptionHandlers>
</ImageHasSafeExceptionHandlers>
</Link>
<Bscmake>
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>$(OutDir)Leviathan.bsc</OutputFile>
</Bscmake>
<ProjectReference>
<LinkLibraryDependencies>false</LinkLibraryDependencies>
</ProjectReference>
<PreBuildEvent>
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag
shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
<Message>Minify user-supplied shader files.</Message>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Midl>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MkTypLibCompatible>true</MkTypLibCompatible>
<SuppressStartupBanner>true</SuppressStartupBanner>
<TargetEnvironment>Win32</TargetEnvironment>
<TypeLibraryName>.\bin/Release/Leviathan.tlb</TypeLibraryName>
<HeaderFileName />
</Midl>
<ClCompile>
<Optimization>MinSpace</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<IntrinsicFunctions>true</IntrinsicFunctions>
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WINDOWS;A32BITS;SIMD;NDEBUG;_CRT_SECURE_NO_WARNINGS;WINDOWS_IGNORE_PACKING_MISMATCH;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>false</StringPooling>
<ExceptionHandling>false</ExceptionHandling>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<StructMemberAlignment>1Byte</StructMemberAlignment>
<BufferSecurityCheck>false</BufferSecurityCheck>
<FloatingPointModel>Fast</FloatingPointModel>
<PrecompiledHeaderOutputFile>bin\Release\Leviathan.pch</PrecompiledHeaderOutputFile>
<AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
<AssemblerListingLocation>bin\release\</AssemblerListingLocation>
<ObjectFileName>bin\release\</ObjectFileName>
<ProgramDataBaseFileName>bin\release\</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
<TreatWarningAsError>false</TreatWarningAsError>
<SuppressStartupBanner>true</SuppressStartupBanner>
<CallingConvention>StdCall</CallingConvention>
<CompileAs>CompileAsCpp</CompileAs>
<OmitFramePointers>true</OmitFramePointers>
<WholeProgramOptimization>false</WholeProgramOptimization>
<SmallerTypeCheck>false</SmallerTypeCheck>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
<OmitDefaultLibName>true</OmitDefaultLibName>
<DisableLanguageExtensions>false</DisableLanguageExtensions>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<LanguageStandard>
</LanguageStandard>
<FloatingPointExceptions>false</FloatingPointExceptions>
<AdditionalOptions>/GR- /EHa- %(AdditionalOptions)</AdditionalOptions>
<ForceConformanceInForLoopScope />
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalOptions>/CRINKLER /RANGE:opengl32 /HASHTRIES:500 /COMPMODE:SLOW /ORDERTRIES:9000 /REPORT:out.html /PROGRESSGUI /HASHSIZE:1000 /UNSAFEIMPORT /UNALIGNCODE /SATURATE /NOINITIALIZERS /TRANSFORM:CALLS /TRUNCATEFLOATS:32 %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>opengl32.lib;dsound.lib;src/sointu/song.obj;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>out\leviathan-release.exe</OutputFile>
<SuppressStartupBanner>
</SuppressStartupBanner>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
<SubSystem>Windows</SubSystem>
<EntryPointSymbol>entrypoint</EntryPointSymbol>
<BaseAddress />
<RandomizedBaseAddress>
</RandomizedBaseAddress>
<DataExecutionPrevention />
<TargetMachine>
</TargetMachine>
<GenerateDebugInformation>
</GenerateDebugInformation>
<AssemblyDebug>
</AssemblyDebug>
<ProgramDatabaseFile>bin\release\$(TargetName).pdb</ProgramDatabaseFile>
<ProfileGuidedDatabase>
</ProfileGuidedDatabase>
<ManifestFile />
<ImageHasSafeExceptionHandlers />
<EnableUAC />
<LinkErrorReporting />
<TypeLibraryResourceID />
</Link>
<Bscmake>
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>.\bin/Release/Leviathan.bsc</OutputFile>
</Bscmake>
<ProjectReference>
<LinkLibraryDependencies>false</LinkLibraryDependencies>
</ProjectReference>
<PreBuildEvent>
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag
shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
<Message>Minify user-supplied shader files.</Message>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">
<Midl>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MkTypLibCompatible>true</MkTypLibCompatible>
<SuppressStartupBanner>true</SuppressStartupBanner>
<TargetEnvironment>Win32</TargetEnvironment>
<TypeLibraryName>.\bin/Release/Leviathan.tlb</TypeLibraryName>
<HeaderFileName>
</HeaderFileName>
</Midl>
<ClCompile>
<AdditionalOptions>/GR- /EHa- %(AdditionalOptions)</AdditionalOptions>
<Optimization>MinSpace</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<IntrinsicFunctions>true</IntrinsicFunctions>
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WINDOWS;A32BITS;SIMD;NDEBUG;_CRT_SECURE_NO_WARNINGS;WINDOWS_IGNORE_PACKING_MISMATCH;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>false</StringPooling>
<ExceptionHandling>false</ExceptionHandling>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<StructMemberAlignment>1Byte</StructMemberAlignment>
<BufferSecurityCheck>false</BufferSecurityCheck>
<FloatingPointModel>Fast</FloatingPointModel>
<PrecompiledHeaderOutputFile>bin\Release\Leviathan.pch</PrecompiledHeaderOutputFile>
<AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
<AssemblerListingLocation>bin\release\</AssemblerListingLocation>
<ObjectFileName>bin\release\</ObjectFileName>
<ProgramDataBaseFileName>bin\release\</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
<TreatWarningAsError>false</TreatWarningAsError>
<SuppressStartupBanner>true</SuppressStartupBanner>
<CallingConvention>StdCall</CallingConvention>
<CompileAs>CompileAsCpp</CompileAs>
<OmitFramePointers>true</OmitFramePointers>
<WholeProgramOptimization>false</WholeProgramOptimization>
<SmallerTypeCheck>false</SmallerTypeCheck>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
<OmitDefaultLibName>true</OmitDefaultLibName>
<DisableLanguageExtensions>false</DisableLanguageExtensions>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<LanguageStandard>
</LanguageStandard>
<FloatingPointExceptions>false</FloatingPointExceptions>
<ForceConformanceInForLoopScope />
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalOptions>/CRINKLER /RANGE:opengl32 /HASHTRIES:1000 /COMPMODE:VERYSLOW /ORDERTRIES:30000 /REPORT:out.html /PROGRESSGUI /HASHSIZE:1000 /UNSAFEIMPORT /UNALIGNCODE /SATURATE /NOINITIALIZERS /TRANSFORM:CALLS %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>opengl32.lib;dsound.lib;src/sointu/song.obj;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>out\leviathan-release.exe</OutputFile>
<SuppressStartupBanner>
</SuppressStartupBanner>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
<SubSystem>Windows</SubSystem>
<EntryPointSymbol>entrypoint</EntryPointSymbol>
<BaseAddress>
</BaseAddress>
<RandomizedBaseAddress>
</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>
</TargetMachine>
<GenerateDebugInformation>
</GenerateDebugInformation>
<AssemblyDebug>
</AssemblyDebug>
<ProgramDatabaseFile>bin\release\$(TargetName).pdb</ProgramDatabaseFile>
<ProfileGuidedDatabase>
</ProfileGuidedDatabase>
<ManifestFile />
<ImageHasSafeExceptionHandlers />
<EnableUAC />
<LinkErrorReporting />
<TypeLibraryResourceID />
</Link>
<Bscmake>
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>.\bin/Release/Leviathan.bsc</OutputFile>
</Bscmake>
<ProjectReference>
<LinkLibraryDependencies>false</LinkLibraryDependencies>
</ProjectReference>
<PreBuildEvent>
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
<Message>Minify user-supplied shader files.</Message>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">
<Midl>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MkTypLibCompatible>true</MkTypLibCompatible>
<SuppressStartupBanner>true</SuppressStartupBanner>
<TargetEnvironment>Win32</TargetEnvironment>
<TypeLibraryName>.\bin/Release/Leviathan.tlb</TypeLibraryName>
<HeaderFileName>
</HeaderFileName>
</Midl>
<ClCompile>
<Optimization>MinSpace</Optimization>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
<IntrinsicFunctions>true</IntrinsicFunctions>
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WINDOWS;A32BITS;SIMD;NDEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>false</StringPooling>
<ExceptionHandling>false</ExceptionHandling>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<StructMemberAlignment>1Byte</StructMemberAlignment>
<BufferSecurityCheck>false</BufferSecurityCheck>
<FloatingPointModel>Fast</FloatingPointModel>
<PrecompiledHeaderOutputFile>bin\Release\Leviathan.pch</PrecompiledHeaderOutputFile>
<AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
<AssemblerListingLocation>bin\release\</AssemblerListingLocation>
<ObjectFileName>bin\release\</ObjectFileName>
<ProgramDataBaseFileName>bin\release\</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel>
<TreatWarningAsError>false</TreatWarningAsError>
<SuppressStartupBanner>true</SuppressStartupBanner>
<CallingConvention>StdCall</CallingConvention>
<CompileAs>CompileAsCpp</CompileAs>
<OmitFramePointers>true</OmitFramePointers>
<WholeProgramOptimization>false</WholeProgramOptimization>
<SmallerTypeCheck>false</SmallerTypeCheck>
<BasicRuntimeChecks>
</BasicRuntimeChecks>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
<OmitDefaultLibName>true</OmitDefaultLibName>
<DisableLanguageExtensions>false</DisableLanguageExtensions>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<LanguageStandard>
</LanguageStandard>
<SDLCheck>
</SDLCheck>
<CompileAsWinRT>false</CompileAsWinRT>
<AdditionalOptions>/GR- /EHa- %(AdditionalOptions)</AdditionalOptions>
<FloatingPointExceptions>false</FloatingPointExceptions>
<ForceConformanceInForLoopScope />
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalOptions>/CRINKLER /RANGE:opengl32 /HASHTRIES:100 /COMPMODE:INSTANT /ORDERTRIES:2000 /PROGRESSGUI /HASHSIZE:100 /UNSAFEIMPORT /UNALIGNCODE /SATURATE /NOINITIALIZERS /TRANSFORM:CALLS %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>opengl32.lib;dsound.lib;src/sointu/song.obj;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>out\leviathan-snapshot.exe</OutputFile>
<SuppressStartupBanner>
</SuppressStartupBanner>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
<SubSystem>Windows</SubSystem>
<EntryPointSymbol>entrypoint</EntryPointSymbol>
<BaseAddress>
</BaseAddress>
<RandomizedBaseAddress>
</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>
</TargetMachine>
<GenerateDebugInformation>
</GenerateDebugInformation>
<AssemblyDebug>
</AssemblyDebug>
<ProgramDatabaseFile>bin\release\$(TargetName).pdb</ProgramDatabaseFile>
<ProfileGuidedDatabase>
</ProfileGuidedDatabase>
<LinkTimeCodeGeneration>
</LinkTimeCodeGeneration>
<EnableUAC />
<LinkErrorReporting />
<ManifestFile />
<ImageHasSafeExceptionHandlers />
<TypeLibraryResourceID />
</Link>
<Bscmake>
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>.\bin/Release/Leviathan.bsc</OutputFile>
</Bscmake>
<ProjectReference>
<LinkLibraryDependencies>false</LinkLibraryDependencies>
</ProjectReference>
<PreBuildEvent>
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
<Message>Minify user-supplied shader files.</Message>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="src\editor.h">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClInclude>
<ClInclude Include="src\debug.h">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">false</ExcludedFromBuild>
</ClInclude>
<ClInclude Include="src\definitions.h" />
<ClInclude Include="src\fft.h" />
<ClInclude Include="src\fp.h" />
<ClInclude Include="src\glext.h" />
<ClInclude Include="src\sointu\song.h" />
<ClInclude Include="src\song.h">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">true</ExcludedFromBuild>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\editor.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="src\fft.cpp" />
<ClCompile Include="src\main.cpp" />
<ClCompile Include="src\song.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="src\shaders\fragment.frag">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">true</ExcludedFromBuild>
</None>
<None Include="src\shaders\fragment.inl" />
<None Include="src\shaders\post.frag">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">true</ExcludedFromBuild>
</None>
<None Include="src\shaders\post.inl" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>

45
leviathan.vcxproj.filters Normal file
View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="src\main.cpp" />
<ClCompile Include="src\song.cpp" />
<ClCompile Include="src\editor.cpp" />
<ClCompile Include="src\fft.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\debug.h" />
<ClInclude Include="src\definitions.h" />
<ClInclude Include="src\glext.h">
<Filter>ext</Filter>
</ClInclude>
<ClInclude Include="src\fp.h">
<Filter>ext</Filter>
</ClInclude>
<ClInclude Include="src\song.h" />
<ClInclude Include="src\editor.h" />
<ClInclude Include="src\sointu\song.h" />
<ClInclude Include="src\fft.h" />
</ItemGroup>
<ItemGroup>
<None Include="src\shaders\post.inl">
<Filter>shaders</Filter>
</None>
<None Include="src\shaders\fragment.inl">
<Filter>shaders</Filter>
</None>
<None Include="src\shaders\fragment.frag">
<Filter>shaders</Filter>
</None>
<None Include="src\shaders\post.frag">
<Filter>shaders</Filter>
</None>
</ItemGroup>
<ItemGroup>
<Filter Include="ext">
<UniqueIdentifier>{3ade9a72-96b0-4936-93c4-4926808a1ab2}</UniqueIdentifier>
</Filter>
<Filter Include="shaders">
<UniqueIdentifier>{84f225d6-acf8-4151-aab3-e246410cdeba}</UniqueIdentifier>
</Filter>
</ItemGroup>
</Project>

BIN
link.exe Normal file

Binary file not shown.

BIN
nasm.exe Normal file

Binary file not shown.

BIN
out/audio.wav Normal file

Binary file not shown.

5
out/editor.txt Normal file
View File

@ -0,0 +1,5 @@
place your pre-rendered audio for the editor here
it is by default loaded from file 'audio.wav'
you can download an example from
http://noby.untergrund.net/misc/audio.wav

34
pbr-leviathan-2.0.sln Normal file
View File

@ -0,0 +1,34 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36212.18 d17.14
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Leviathan 2.0", "leviathan.vcxproj", "{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Editor|Win32 = Editor|Win32
Heavy Release|Win32 = Heavy Release|Win32
Release|Win32 = Release|Win32
Snapshot|Win32 = Snapshot|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Debug|Win32.ActiveCfg = Debug|Win32
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Debug|Win32.Build.0 = Debug|Win32
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Editor|Win32.ActiveCfg = Editor|Win32
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Editor|Win32.Build.0 = Editor|Win32
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Heavy Release|Win32.ActiveCfg = Heavy Release|Win32
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Heavy Release|Win32.Build.0 = Heavy Release|Win32
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Release|Win32.ActiveCfg = Release|Win32
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Release|Win32.Build.0 = Release|Win32
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Snapshot|Win32.ActiveCfg = Snapshot|Win32
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Snapshot|Win32.Build.0 = Snapshot|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BFFCE7AC-AF44-47A1-9B82-AB82AB604DD0}
EndGlobalSection
EndGlobal

7
prepare_music.bat Normal file
View File

@ -0,0 +1,7 @@
sointu-compile -o . -arch=386 song.yml
nasm -f win32 song.asm
del song.inc
del song.asm
move song.obj src\sointu\
move song.h src\sointu\

BIN
shader_minifier.exe Normal file

Binary file not shown.

BIN
sointu-compile.exe Normal file

Binary file not shown.

409
song.yml Normal file
View File

@ -0,0 +1,409 @@
bpm: 138
rowsperbeat: 4
score:
tracks:
- numvoices: 1
order: [-1, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 2, -1, 1, -1, 4, -1, 1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, -1, -1, 2, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, 2, -1, 3, 5, 2, 6, 0, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 0, -1, 1, -1, -1]
patterns: [[33, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 28, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1]]
- numvoices: 1
order: [-1, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 2, -1, 1, -1, 4, -1, 1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, -1, -1, 2, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 0, -1, -1, -1, 5, -1, 5, -1, 6, 7, 5, 8, 9, -1, -1, -1, 9, -1, 1, -1, 9, -1, 1, -1, 0, -1, 1, -1, -1]
patterns: [[45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [38, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 52, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, 1, 1, 1, 1], [57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
- numvoices: 1
order: [-1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 4, -1, 1, -1, 3, -1, 1, -1, 5, -1, 1, -1, 6, 7, 6, 7, 6, 7, 6, 8, 6, 7, 6, 7, 6, 7, 6, 7, 9, 10, 9, 10, 9, 10, 9, 10, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 5, -1, 3, -1, 6, 7, 6, 7, 11, 12, 9, 10, 6, 7, 6, 13, 6, 7, 6, 7, 9, 10, 9, 14, 15, 16, 9, 17, 6, 6, 6, 6, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1, -1]
patterns: [[57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 67, 0, 69, 0], [57, 0, 57, 0, 57, 0, 57, 0, 64, 1, 62, 1, 60, 1, 55, 1], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 63, 0, 65, 0], [55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0], [55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 65, 0, 67, 0], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 69, 0, 57, 0], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 65, 0], [50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0], [50, 0, 50, 0, 50, 0, 50, 0, 52, 0, 52, 0, 52, 0, 52, 0], [53, 0, 53, 0, 53, 0, 53, 0, 55, 0, 55, 0, 55, 0, 55, 0]]
- numvoices: 1
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
patterns: [[60, 1, 1, 1, 1, 1, 1, 1, 60, 1, 1, 1, 1, 1, 1, 1], [60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 60, 1, 1, 1, 60, 1], [60, 1, 1, 1, 60, 1, 1, 1, 60, 1, 1, 1, 60, 1, 1, 1]]
- numvoices: 1
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
patterns: [[1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1, 72, 1, 1, 1], [1, 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1]]
- numvoices: 1
order: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, -1, 4, -1, -1]
patterns: [[88, 0, 83, 0, 84, 0, 81, 0, 88, 0, 83, 0, 84, 0, 81, 0], [91, 0, 83, 0, 84, 0, 81, 0, 91, 0, 83, 0, 84, 0, 81, 0], [89, 0, 83, 0, 84, 0, 81, 0, 89, 0, 83, 0, 84, 0, 81, 0], [45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
- numvoices: 1
order: [-1, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 2, -1, 1, -1, 4, -1, 1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, 1, -1, 0, -1, -1, -1, 2, -1, -1, -1, 2, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, -1, -1, -1, -1, -1]
patterns: [[45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [38, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
- numvoices: 1
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, -1, 2, 3, 4, 5, -1, 0, 6, -1, -1, 0, 6, -1, 7, 0, -1, -1, -1, 8, -1, -1, 9, -1, -1, -1, -1, 10, 7, 11, 12, 0, -1, -1, 13, 10, 7, 11, 7, 8, -1, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
patterns: [[83, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 84, 1, 81, 1], [1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 74, 1, 76, 1, 1, 1], [71, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1], [69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 84, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 86, 1, 1, 1, 1, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [88, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1]]
- numvoices: 4
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
patterns: [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 81, 83, 84, 86], [88, 83, 84, 81, 88, 83, 84, 81, 88, 83, 84, 81, 88, 83, 84, 81], [91, 83, 84, 81, 91, 83, 84, 81, 91, 83, 84, 81, 91, 83, 84, 81], [93, 83, 84, 81, 93, 83, 84, 81, 93, 83, 84, 81, 93, 83, 84, 81], [89, 81, 83, 84, 86, 88, 89, 91, 89, 81, 83, 84, 83, 84, 86, 88], [89, 79, 81, 83, 81, 83, 84, 86, 84, 86, 88, 89, 88, 84, 86, 83], [91, 88, 89, 86, 88, 84, 86, 83, 84, 81, 83, 79, 81, 77, 79, 76], [77, 74, 76, 72, 74, 71, 72, 69, 71, 67, 69, 65, 67, 69, 71, 74], [77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 76, 1, 77, 76], [74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 69, 71, 72, 76], [84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 79, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
rowsperpattern: 16
length: 108
patch:
- name: 80slead.instr
numvoices: 2
units:
- type: oscillator
id: 1089
parameters: {color: 128, detune: 80, gain: 128, lfo: 0, phase: 90, shape: 64, stereo: 0, transpose: 76, type: 1, unison: 3}
- type: oscillator
id: 1090
parameters: {color: 128, detune: 64, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 0, unison: 2}
- type: addp
id: 1091
parameters: {stereo: 0}
- type: envelope
id: 1092
parameters: {attack: 55, decay: 66, gain: 90, release: 54, stereo: 0, sustain: 81}
- type: mulp
id: 1098
parameters: {stereo: 0}
- type: sync
id: 1172
parameters: {}
- type: pan
id: 1096
parameters: {panning: 62, stereo: 0}
- type: filter
id: 1108
parameters: {bandpass: 1, frequency: 80, highpass: -1, lowpass: 1, resonance: 128, stereo: 1}
- type: gain
id: 1119
parameters: {gain: 64, stereo: 1}
- type: outaux
id: 1097
parameters: {auxgain: 40, outgain: 40, stereo: 1}
- name: 80sbass.instr
numvoices: 1
units:
- type: oscillator
id: 3
parameters: {color: 0, detune: 64, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 1, transpose: 64, type: 1, unison: 0}
- type: oscillator
id: 4
parameters: {color: 0, detune: 74, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 1, transpose: 52, type: 1, unison: 2}
- type: addp
id: 1084
parameters: {stereo: 1}
- type: envelope
id: 1085
parameters: {attack: 19, decay: 70, gain: 100, release: 68, stereo: 1, sustain: 28}
- type: send
id: 1088
parameters: {amount: 80, port: 0, sendpop: 0, stereo: 1, target: 1087, voice: 0}
- type: mulp
id: 1086
parameters: {stereo: 1}
- type: filter
id: 1087
parameters: {bandpass: 0, frequency: 45, highpass: 1, lowpass: 1, resonance: 46, stereo: 1}
- type: distort
id: 1107
parameters: {drive: 92, stereo: 1}
- type: pan
id: 284
parameters: {panning: 64, stereo: 1}
- type: gain
id: 1121
parameters: {gain: 100, stereo: 1}
- type: sync
id: 1173
parameters: {}
- type: outaux
id: 15
parameters: {auxgain: 32, outgain: 56, stereo: 1}
- name: kick.instr
comment: 'Suggested note: C-3'
numvoices: 1
units:
- type: envelope
id: 261
parameters: {attack: 0, decay: 50, gain: 128, release: 0, stereo: 0, sustain: 0}
- type: noise
id: 269
parameters: {gain: 128, shape: 86, stereo: 0}
- type: send
id: 268
parameters: {amount: 96, port: 0, sendpop: 1, stereo: 0, target: 262, voice: 0}
- type: oscillator
id: 262
parameters: {color: 128, detune: 64, gain: 128, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 0, unison: 0}
- type: filter
id: 281
parameters: {bandpass: -1, frequency: 97, highpass: -1, lowpass: 0, resonance: 87, stereo: 0}
- type: mulp
id: 263
parameters: {stereo: 0}
- type: envelope
id: 280
parameters: {attack: 0, decay: 63, gain: 80, release: 64, stereo: 0, sustain: 0}
- type: send
id: 1110
parameters: {amount: 75, port: 0, sendpop: 1, stereo: 0, target: 277, voice: 0}
- type: noise
id: 275
parameters: {gain: 72, shape: 24, stereo: 0}
- type: send
id: 276
parameters: {amount: 84, port: 0, sendpop: 1, stereo: 0, target: 277, voice: 0}
- type: envelope
id: 274
parameters: {attack: 27, decay: 73, gain: 128, release: 0, stereo: 0, sustain: 0}
- type: send
id: 1118
parameters: {amount: 0, port: 0, sendpop: 0, stereo: 0, target: 1119, voice: 0}
- type: send
id: 1147
parameters: {amount: 0, port: 0, sendpop: 0, stereo: 0, target: 1121, voice: 0}
- type: oscillator
id: 277
parameters: {color: 128, detune: 64, gain: 128, phase: 0, shape: 64, stereo: 0, transpose: 45, type: 0}
- type: mulp
id: 279
parameters: {stereo: 0}
- type: addp
id: 271
parameters: {stereo: 0}
- type: pan
id: 294
parameters: {panning: 64, stereo: 0}
- type: filter
id: 1149
parameters: {bandpass: 0, frequency: 11, highpass: -1, lowpass: 1, resonance: 104, stereo: 1}
- type: sync
id: 1180
parameters: {}
- type: outaux
id: 266
parameters: {auxgain: 0, outgain: 50, stereo: 1}
- name: snare.instr
comment: 'Suggested range: E-4'
numvoices: 1
units:
- type: envelope
id: 217
parameters: {attack: 0, decay: 64, gain: 80, release: 0, stereo: 0, sustain: 0}
- type: oscillator
id: 218
parameters: {color: 128, detune: 64, gain: 95, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 58, type: 0, unison: 0}
- type: mulp
id: 221
parameters: {stereo: 0}
- type: envelope
id: 222
parameters: {attack: 0, decay: 72, gain: 64, release: 0, stereo: 0, sustain: 0}
- type: noise
id: 223
parameters: {gain: 37, shape: 14, stereo: 0}
- type: mulp
id: 224
parameters: {stereo: 0}
- type: filter
id: 201
parameters: {bandpass: 0, frequency: 78, highpass: -1, lowpass: 1, resonance: 127, stereo: 0}
- type: filter
id: 225
parameters: {bandpass: 0, frequency: 122, highpass: 0, lowpass: 1, resonance: 112, stereo: 0}
- type: addp
id: 226
parameters: {stereo: 0}
- type: distort
id: 338
parameters: {drive: 99, stereo: 0}
- type: pan
id: 231
parameters: {panning: 65, stereo: 0}
- type: outaux
id: 232
parameters: {auxgain: 40, outgain: 82, stereo: 1}
comment: OUTPUT
- type: envelope
id: 233
parameters: {attack: 37, decay: 47, gain: 128, release: 0, stereo: 0, sustain: 0}
- type: send
id: 234
parameters: {amount: 69, port: 0, sendpop: 1, target: 218}
- type: envelope
id: 235
parameters: {attack: 53, decay: 58, gain: 128, release: 0, stereo: 0, sustain: 0}
- type: send
id: 236
parameters: {amount: 0, port: 0, sendpop: 1, target: 201}
- type: envelope
id: 237
parameters: {attack: 53, decay: 73, gain: 128, release: 0, stereo: 0, sustain: 0}
- type: send
id: 238
parameters: {amount: 32, port: 0, sendpop: 1, target: 202}
- name: SuperSaw 4.instr
comment: Automate filter frequency for the classic trance sound
numvoices: 2
units:
- type: envelope
id: 1109
parameters: {attack: 32, decay: 0, gain: 64, release: 64, stereo: 0, sustain: 85}
- type: oscillator
id: 1099
parameters: {color: 0, detune: 96, gain: 64, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
- type: oscillator
id: 12
parameters: {color: 0, detune: 80, gain: 64, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
- type: addp
id: 13
parameters: {stereo: 0}
- type: mulp
id: 16
parameters: {stereo: 0}
- type: envelope
id: 17
parameters: {attack: 32, decay: 67, gain: 64, release: 64, stereo: 0, sustain: 99}
- type: oscillator
id: 1156
parameters: {color: 0, detune: 44, gain: 64, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
- type: oscillator
id: 1157
parameters: {color: 0, detune: 35, gain: 64, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
- type: addp
id: 1158
parameters: {stereo: 0}
- type: mulp
id: 23
parameters: {stereo: 0}
- type: pan
id: 1182
parameters: {panning: 72, stereo: 1}
- type: delay
id: 29
parameters: {damp: 0, dry: 72, feedback: 24, notetracking: 2, pregain: 72, stereo: 1}
varargs: [32, 36]
- type: outaux
id: 1160
parameters: {auxgain: 32, outgain: 72, stereo: 1}
- type: loadnote
id: 1174
parameters: {stereo: 0}
- type: sync
id: 1175
parameters: {}
- type: pop
id: 1176
parameters: {stereo: 0}
- name: pad.instr
numvoices: 1
units:
- type: envelope
id: 1161
parameters: {attack: 72, decay: 96, gain: 128, release: 88, stereo: 0, sustain: 96}
- type: send
id: 2
parameters: {amount: 64, port: 4, sendpop: 0, target: 1161}
- type: oscillator
id: 1162
parameters: {color: 80, detune: 60, gain: 128, lfo: 0, phase: 32, shape: 64, stereo: 0, transpose: 64, type: 2}
- type: oscillator
id: 1163
parameters: {color: 96, detune: 72, gain: 128, lfo: 0, phase: 32, shape: 64, stereo: 0, transpose: 64, type: 1}
- type: oscillator
id: 5
parameters: {color: 128, detune: 64, gain: 128, lfo: 1, phase: 0, shape: 90, stereo: 0, transpose: 32, type: 0}
- type: send
id: 1164
parameters: {amount: 68, port: 1, sendpop: 0, target: 1162}
- type: send
id: 78
parameters: {amount: 61, port: 1, sendpop: 1, target: 1163}
- type: addp
id: 80
parameters: {stereo: 0}
- type: mulp
id: 10
parameters: {stereo: 0}
- type: filter
id: 11
parameters: {bandpass: 0, frequency: 26, highpass: -1, lowpass: 1, resonance: 128, stereo: 0}
- type: filter
id: 1165
parameters: {bandpass: 0, frequency: 64, highpass: 0, lowpass: 1, resonance: 64, stereo: 0}
- type: distort
id: 1128
parameters: {drive: 102, stereo: 0}
- type: pan
id: 1129
parameters: {panning: 64, stereo: 0}
- type: delay
id: 1130
parameters: {damp: 64, dry: 128, feedback: 96, notetracking: 2, pregain: 90, stereo: 1}
varargs: [24, 48]
- type: sync
id: 1181
parameters: {}
- type: outaux
id: 1131
parameters: {auxgain: 32, outgain: 14, stereo: 1}
- name: HappyLead.instr
numvoices: 4
units:
- type: oscillator
id: 164
parameters: {color: 128, detune: 67, gain: 72, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 76, type: 1, unison: 2}
- type: oscillator
id: 165
parameters: {color: 128, detune: 73, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
- type: addp
id: 166
parameters: {stereo: 0}
- type: envelope
id: 163
parameters: {attack: 24, decay: 64, gain: 72, release: 64, stereo: 0, sustain: 92}
- type: mulp
id: 167
parameters: {stereo: 0}
- type: pan
id: 168
parameters: {panning: 64, stereo: 0}
- type: delay
id: 169
parameters: {damp: 0, dry: 70, feedback: 15, notetracking: 0, pregain: 60, stereo: 1}
varargs: [12550, 24402, 21265, 32419]
- type: outaux
id: 172
parameters: {auxgain: 32, outgain: 48, stereo: 1}
- type: loadnote
id: 1177
parameters: {stereo: 0}
- type: sync
id: 1178
parameters: {}
- type: pop
id: 1179
parameters: {stereo: 0}
- name: Global
numvoices: 1
units:
- type: in
id: 7
parameters: {channel: 2, stereo: 1}
comment: Aux 1 (reverb)
- type: delay
id: 8
parameters: {damp: 28, dry: 0, feedback: 122, notetracking: 0, pregain: 40, stereo: 1}
varargs: [1116, 1188, 1276, 1356, 1422, 1492, 1556, 1618, 1140, 1212, 1300, 1380, 1446, 1516, 1580, 1642]
- type: out
id: 1169
parameters: {gain: 96, stereo: 1}
comment: Reverb amount to master
- type: in
id: 1170
parameters: {channel: 0, stereo: 1}
comment: Input (Master)
- type: filter
id: 1171
parameters: {bandpass: 0, frequency: 128, highpass: 0, lowpass: 1, resonance: 128, stereo: 1}
comment: Limit highs
- type: filter
id: 1166
parameters: {bandpass: 0, frequency: 8, highpass: 1, lowpass: 0, resonance: 128, stereo: 1}
comment: Low cut
- type: compressor
id: 1167
parameters: {attack: 0, invgain: 90, ratio: 128, release: 42, stereo: 1, threshold: 90}
comment: Clipper (change threshold and invgain to match loudness)
- type: mulp
id: 1168
parameters: {stereo: 1}
- type: out
id: 9
parameters: {gain: 112, stereo: 1}
comment: Master Out

48
src/debug.h Normal file
View File

@ -0,0 +1,48 @@
// This header contains some useful functions for debugging OpenGL.
// Remember to disable them when building your final releases.
#include <windows.h>
#include <GL/gl.h>
#include "glext.h"
#define STRINGIFY2(x) #x // Thanks sooda!
#define STRINGIFY(x) STRINGIFY2(x)
#define CHECK_ERRORS() assertGlError(STRINGIFY(__LINE__))
static GLchar* getErrorString(GLenum errorCode)
{
if (errorCode == GL_NO_ERROR) {
return (GLchar*) "No error";
}
else if (errorCode == GL_INVALID_VALUE) {
return (GLchar*) "Invalid value";
}
else if (errorCode == GL_INVALID_ENUM) {
return (GLchar*) "Invalid enum";
}
else if (errorCode == GL_INVALID_OPERATION) {
return (GLchar*) "Invalid operation";
}
else if (errorCode == GL_STACK_OVERFLOW) {
return (GLchar*) "Stack overflow";
}
else if (errorCode == GL_STACK_UNDERFLOW) {
return (GLchar*) "Stack underflow";
}
else if (errorCode == GL_OUT_OF_MEMORY) {
return (GLchar*) "Out of memory";
}
return (GLchar*) "Unknown";
}
static void assertGlError(const char* error_message)
{
const GLenum ErrorValue = glGetError();
if (ErrorValue == GL_NO_ERROR) return;
const char* APPEND_DETAIL_STRING = ": %s\n";
const size_t APPEND_LENGTH = strlen(APPEND_DETAIL_STRING) + 1;
const size_t message_length = strlen(error_message);
MessageBox(NULL, error_message, getErrorString(ErrorValue), 0x00000000L);
ExitProcess(0);
}

99
src/definitions.h Normal file
View File

@ -0,0 +1,99 @@
// This header contains necessary structures for setting up correct screen modes,
// pixel formats, audio formats, and so on.
// minify windows.h
#define WIN32_LEAN_AND_MEAN
#define WIN32_EXTRA_LEAN
#define VC_LEANMEAN
#define VC_EXTRALEAN
#pragma pack(push, 8)
#include <windows.h>
#pragma pack(pop)
#include <GL/gl.h>
// global resolution
#define XRES 1920
#define YRES 1080
// declare this symbol if your code uses floating point types
// extern "C" int _fltused;
#pragma data_seg(".pixelfmt")
static const PIXELFORMATDESCRIPTOR pfd = {
#if BREAK_COMPATIBILITY
#if POST_PASS
0, 0, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,
0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0
#else
0, 0, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0
#endif
#else
sizeof(pfd), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,
32, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0
#endif
};
#pragma data_seg(".screensettings")
static DEVMODE screenSettings = {
{0}, 0, 0, sizeof(screenSettings), 0, DM_PELSWIDTH|DM_PELSHEIGHT,
{0}, 0, 0, 0, 0, 0, {0}, 0, 0, XRES, YRES, 0, 0,
#if(WINVER >= 0x0400)
0, 0, 0, 0, 0, 0,
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
0, 0
#endif
#endif
};
#if USE_AUDIO
// this file is auto generated by sointu
#include "sointu/song.h"
#ifndef DSBCAPS_TRUEPLAYPOSITION // Not defined in MinGW dsound headers, so let's add it
#define DSBCAPS_TRUEPLAYPOSITION 0x00080000
#endif
#include <mmreg.h>
#include <dsound.h>
SUsample sound_buffer[SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT];
WAVEFORMATEX wave_format = {
#ifdef SU_SAMPLE_FLOAT
WAVE_FORMAT_IEEE_FLOAT,
#else
WAVE_FORMAT_PCM,
#endif
SU_CHANNEL_COUNT,
SU_SAMPLE_RATE,
SU_SAMPLE_RATE * SU_SAMPLE_SIZE * SU_CHANNEL_COUNT,
SU_SAMPLE_SIZE * SU_CHANNEL_COUNT,
SU_SAMPLE_SIZE * 8,
0
};
#pragma data_seg(".descfmt")
DSBUFFERDESC buffer_description = {
sizeof(DSBUFFERDESC),
DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_TRUEPLAYPOSITION,
SU_LENGTH_IN_SAMPLES * SU_SAMPLE_SIZE * SU_CHANNEL_COUNT,
0,
&wave_format,
0
};
#pragma bss_seg(".syncbuf")
extern "C" {
int _fltused = 1;
float syncBuf[SU_SYNCBUFFER_LENGTH+1];
}
#endif
// currently unused definitions
#ifdef EDITOR_CONTROLS
#define FAIL_KILL false
#define PID_QUALIFIER
#else
#define FAIL_KILL true
#define PID_QUALIFIER const
#endif

185
src/editor.cpp Normal file
View File

@ -0,0 +1,185 @@
#include "editor.h"
#include "song.h"
#include "stdio.h"
#include "windows.h"
#include "GL/gl.h"
#include "glext.h"
using namespace Leviathan;
#define USE_MESSAGEBOX 0
Editor::Editor() : lastFrameStart(0), lastFrameStop(0), trackPosition(0.0), trackEnd(0.0), state(Playing)
{
printf("Editor opened...\n");
}
void Editor::beginFrame(const unsigned long time)
{
lastFrameStart = time;
}
void Editor::endFrame(const unsigned long time)
{
lastFrameStop = time;
}
void Editor::printFrameStatistics()
{
const int frameTime = lastFrameStop - lastFrameStart;
// calculate average fps over 'windowSize' of frames
float fps = 0.0f;
for (int i = 0; i < windowSize - 1; ++i)
{
timeHistory[i] = timeHistory[i + 1];
fps += 1.0f / static_cast<float>(timeHistory[i]);
}
timeHistory[windowSize - 1] = frameTime;
fps += 1.0f / static_cast<float>(frameTime);
fps *= 1000.0f / static_cast<float>(windowSize);
printf("%s: %0.2i:%0.2i (%i%%), frame duration: %i ms (running fps average: %2.2f) \r",
state == Playing ? "Playing" : " Paused",
// assuming y'all won't be making intros more than an hour long
int(trackPosition/60.0), int(trackPosition) % 60, int(100.0f*trackPosition/trackEnd),
frameTime, fps);
}
double Editor::handleEvents(Leviathan::Song* track, double position)
{
if (GetAsyncKeyState(VK_MENU))
{
double seek = 0.0;
if (GetAsyncKeyState(VK_DOWN))
{
state = Paused;
track->pause();
}
if (GetAsyncKeyState(VK_UP))
{
state = Playing;
track->play();
}
if (GetAsyncKeyState(VK_RIGHT) && !GetAsyncKeyState(VK_SHIFT)) seek += 1.0;
if (GetAsyncKeyState(VK_LEFT) && !GetAsyncKeyState(VK_SHIFT)) seek -= 1.0;
if (GetAsyncKeyState(VK_RIGHT) && GetAsyncKeyState(VK_SHIFT)) seek += 0.1;
if (GetAsyncKeyState(VK_LEFT) && GetAsyncKeyState(VK_SHIFT)) seek -= 0.1;
if (position + seek != position)
{
position += seek;
track->seek(position);
}
}
if (GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState('S'))
shaderUpdatePending = true;
trackPosition = position;
trackEnd = track->getLength();
return position;
}
void Editor::updateShaders(int* mainShaderPID, int* postShaderPID, bool force_update)
{
if (shaderUpdatePending || force_update)
{
// make sure the file has finished writing to disk
if (timeGetTime() - previousUpdateTime > 200)
{
// only way i can think of to clear the line without "status line" residue
printf("Refreshing shaders... \n");
Sleep(100);
int newPID = reloadShaderSource("../src/shaders/fragment.frag");
if (newPID > 0)
*mainShaderPID = newPID;
newPID = reloadShaderSource("../src/shaders/post.frag");
if (newPID > 0)
*postShaderPID = newPID;
}
previousUpdateTime = timeGetTime();
shaderUpdatePending = false;
}
}
int Editor::reloadShaderSource(const char* filename)
{
long inputSize = 0;
// we're of course opening a text file, but should be opened in binary ('b')
// longer shaders are known to cause problems by producing garbage input when read
FILE* file = fopen(filename, "rb");
if (file)
{
fseek(file, 0, SEEK_END);
inputSize = ftell(file);
rewind(file);
char* shaderString = static_cast<char*>(calloc(inputSize + 1, sizeof(char)));
fread(shaderString, sizeof(char), inputSize, file);
fclose(file);
// just to be sure...
shaderString[inputSize] = '\0';
if (!compileAndDebugShader(shaderString, filename, false))
{
free(shaderString);
// return an invalid PID value if compilation fails
return -1;
}
int pid = ((PFNGLCREATESHADERPROGRAMVPROC)wglGetProcAddress("glCreateShaderProgramv"))(GL_FRAGMENT_SHADER, 1, &shaderString);
free(shaderString);
printf("Loaded shader from \"%s\"\n", filename);
return pid;
}
else
{
printf("Input shader file at \"%s\" not found, shader not reloaded\n", filename);
return -1;
}
}
bool Editor::compileAndDebugShader(const char* shader, const char* filename, bool kill_on_failure)
{
// try and compile the shader
int result = 0;
const int debugid = ((PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"))(GL_FRAGMENT_SHADER);
((PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource"))(debugid, 1, &shader, 0);
((PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader"))(debugid);
// get compile result
((PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv"))(debugid, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE)
{
// display compile log on failure
static char errorBuffer[shaderErrorBufferLength];
((PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog"))(debugid, shaderErrorBufferLength-1, NULL, static_cast<char*>(errorBuffer));
#if USE_MESSAGEBOX
MessageBox(NULL, errorBuffer, "", 0x00000000L);
#endif
printf("Compilation errors in %s:\n\n %s\n", filename, errorBuffer);
if (kill_on_failure)
{
ExitProcess(0);
}
else
{
return false;
}
}
else
{
((PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader"))(debugid);
return true;
}
}

46
src/editor.h Normal file
View File

@ -0,0 +1,46 @@
namespace Leviathan
{
// forward declaration
class Song;
}
namespace Leviathan
{
// simpler wrapper class for the editor functionality
class Editor
{
public:
Editor();
void beginFrame(const unsigned long time);
void endFrame(const unsigned long time);
void printFrameStatistics();
double handleEvents(Song* track, double position);
void updateShaders(int* mainShaderPID, int* postShaderPID, bool force_update = false);
private:
int reloadShaderSource(const char* filename);
bool compileAndDebugShader(const char* shader, const char* filename, bool kill_on_failure = true);
enum PlayState {Playing, Paused};
PlayState state;
unsigned long lastFrameStart;
unsigned long lastFrameStop;
static const int shaderErrorBufferLength = 4096;
static const int windowSize = 10;
int timeHistory[windowSize] = {};
bool shaderUpdatePending = false;
int previousUpdateTime;
double trackPosition;
double trackEnd;
};
}

28
src/fft.cpp Normal file
View File

@ -0,0 +1,28 @@
#include "fft.h"
#include <math.h>
constexpr float PI = 3.14159;
// In-place FFT on array of Complex numbers
void fft(Complex* x, int N, Complex* buffer) {
if (N <= 1) return;
Complex* even = buffer;
Complex* odd = buffer + N / 2;
for (int i = 0; i < N / 2; ++i) {
even[i] = x[i * 2];
odd[i] = x[i * 2 + 1];
}
fft(even, N / 2, buffer + N); // deeper even
fft(odd, N / 2, buffer + N + N / 2); // deeper odd
for (int k = 0; k < N / 2; ++k) {
double angle = -2 * PI * k / N;
Complex twiddle(cos(angle), sin(angle));
Complex t = twiddle * odd[k];
x[k] = even[k] + t;
x[k + N / 2] = even[k] - t;
}
}

18
src/fft.h Normal file
View File

@ -0,0 +1,18 @@
#pragma once
#include <stdlib.h>
#include <math.h>
#define FFT_SIZE 2048
// Simple complex number struct
struct Complex {
float re, im;
Complex(float r = 0, float i = 0) : re(r), im(i) {}
Complex operator+(const Complex& o) const { return { re + o.re, im + o.im }; }
Complex operator-(const Complex& o) const { return { re - o.re, im - o.im }; }
Complex operator*(const Complex& o) const {
return { re * o.re - im * o.im, re * o.im + im * o.re };
}
};
void fft(Complex* x, int N, Complex* buffer);

209
src/fp.h Normal file
View File

@ -0,0 +1,209 @@
// This header is by iq of RGBA and includes some float constants.
// I've never used these myself but I guess they're useful???
#ifndef _FPCONSTANTS_H_
#define _FPCONSTANTS_H_
#define p0d00 0.0000000000f // 0.00f 0x00000000
#define p0d01 0.0100097656f // 0.01f 0x3c240000
#define p0d02 0.0200195313f // 0.02f 0x3ca40000
#define p0d03 0.0300292969f // 0.03f 0x3cf60000
#define p0d04 0.0400390625f // 0.04f 0x3d240000
#define p0d05 0.0500488281f // 0.05f 0x3d4d0000
#define p0d06 0.0600585938f // 0.06f 0x3d760000
#define p0d07 0.0698242188f // 0.07f 0x3d8f0000
#define p0d08 0.0800781250f // 0.08f 0x3da40000
#define p0d09 0.0898437500f // 0.09f 0x3db80000
#define p0d10 0.1000976563f // 0.10f 0x3dcd0000
#define p0d11 0.1098632813f // 0.11f 0x3de10000
#define p0d12 0.1201171875f // 0.12f 0x3df60000
#define p0d13 0.1298828125f // 0.13f 0x3e050000
#define p0d14 0.1396484375f // 0.14f 0x3e0f0000
#define p0d15 0.1503906250f // 0.15f 0x3e1a0000
#define p0d16 0.1601562500f // 0.16f 0x3e240000
#define p0d17 0.1699218750f // 0.17f 0x3e2e0000
#define p0d18 0.1796875000f // 0.18f 0x3e380000
#define p0d19 0.1904296875f // 0.19f 0x3e430000
#define p0d20 0.2001953125f // 0.20f 0x3e4d0000
#define p0d21 0.2099609375f // 0.21f 0x3e570000
#define p0d22 0.2197265625f // 0.22f 0x3e610000
#define p0d23 0.2304687500f // 0.23f 0x3e6c0000
#define p0d24 0.2402343750f // 0.24f 0x3e760000
#define p0d25 0.2500000000f // 0.25f 0x3e800000
#define p0d26 0.2597656250f // 0.26f 0x3e850000
#define p0d27 0.2695312500f // 0.27f 0x3e8a0000
#define p0d28 0.2792968750f // 0.28f 0x3e8f0000
#define p0d29 0.2890625000f // 0.29f 0x3e940000
#define p0d30 0.3007812500f // 0.30f 0x3e9a0000
#define p0d31 0.3105468750f // 0.31f 0x3e9f0000
#define p0d32 0.3203125000f // 0.32f 0x3ea40000
#define p0d33 0.3300781250f // 0.33f 0x3ea90000
#define p0d34 0.3398437500f // 0.34f 0x3eae0000
#define p0d35 0.3496093750f // 0.35f 0x3eb30000
#define p0d36 0.3593750000f // 0.36f 0x3eb80000
#define p0d37 0.3691406250f // 0.37f 0x3ebd0000
#define p0d38 0.3808593750f // 0.38f 0x3ec30000
#define p0d39 0.3906250000f // 0.39f 0x3ec80000
#define p0d40 0.4003906250f // 0.40f 0x3ecd0000
#define p0d41 0.4101562500f // 0.41f 0x3ed20000
#define p0d42 0.4199218750f // 0.42f 0x3ed70000
#define p0d43 0.4296875000f // 0.43f 0x3edc0000
#define p0d44 0.4394531250f // 0.44f 0x3ee10000
#define p0d45 0.4492187500f // 0.45f 0x3ee60000
#define p0d46 0.4609375000f // 0.46f 0x3eec0000
#define p0d47 0.4707031250f // 0.47f 0x3ef10000
#define p0d48 0.4804687500f // 0.48f 0x3ef60000
#define p0d49 0.4902343750f // 0.49f 0x3efb0000
#define p0d50 0.5000000000f // 0.50f 0x3f000000
#define p0d51 0.5117187500f // 0.51f 0x3f030000
#define p0d52 0.5195312500f // 0.52f 0x3f050000
#define p0d53 0.5312500000f // 0.53f 0x3f080000
#define p0d54 0.5390625000f // 0.54f 0x3f0a0000
#define p0d55 0.5507812500f // 0.55f 0x3f0d0000
#define p0d56 0.5585937500f // 0.56f 0x3f0f0000
#define p0d57 0.5703125000f // 0.57f 0x3f120000
#define p0d58 0.5781250000f // 0.58f 0x3f140000
#define p0d59 0.5898437500f // 0.59f 0x3f170000
#define p0d60 0.6015625000f // 0.60f 0x3f1a0000
#define p0d61 0.6093750000f // 0.61f 0x3f1c0000
#define p0d62 0.6210937500f // 0.62f 0x3f1f0000
#define p0d63 0.6289062500f // 0.63f 0x3f210000
#define p0d64 0.6406250000f // 0.64f 0x3f240000
#define p0d65 0.6484375000f // 0.65f 0x3f260000
#define p0d66 0.6601562500f // 0.66f 0x3f290000
#define p0d67 0.6718750000f // 0.67f 0x3f2c0000
#define p0d68 0.6796875000f // 0.68f 0x3f2e0000
#define p0d69 0.6914062500f // 0.69f 0x3f310000
#define p0d70 0.6992187500f // 0.70f 0x3f330000
#define p0d71 0.7109375000f // 0.71f 0x3f360000
#define p0d72 0.7187500000f // 0.72f 0x3f380000
#define p0d73 0.7304687500f // 0.73f 0x3f3b0000
#define p0d74 0.7382812500f // 0.74f 0x3f3d0000
#define p0d75 0.7500000000f // 0.75f 0x3f400000
#define p0d76 0.7617187500f // 0.76f 0x3f430000
#define p0d77 0.7695312500f // 0.77f 0x3f450000
#define p0d78 0.7812500000f // 0.78f 0x3f480000
#define p0d79 0.7890625000f // 0.79f 0x3f4a0000
#define p0d80 0.8007812500f // 0.80f 0x3f4d0000
#define p0d81 0.8085937500f // 0.81f 0x3f4f0000
#define p0d82 0.8203125000f // 0.82f 0x3f520000
#define p0d83 0.8281250000f // 0.83f 0x3f540000
#define p0d84 0.8398437500f // 0.84f 0x3f570000
#define p0d85 0.8515625000f // 0.85f 0x3f5a0000
#define p0d86 0.8593750000f // 0.86f 0x3f5c0000
#define p0d87 0.8710937500f // 0.87f 0x3f5f0000
#define p0d88 0.8789062500f // 0.88f 0x3f610000
#define p0d89 0.8906250000f // 0.89f 0x3f640000
#define p0d90 0.8984375000f // 0.90f 0x3f660000
#define p0d91 0.9101562500f // 0.91f 0x3f690000
#define p0d92 0.9218750000f // 0.92f 0x3f6c0000
#define p0d93 0.9296875000f // 0.93f 0x3f6e0000
#define p0d94 0.9414062500f // 0.94f 0x3f710000
#define p0d95 0.9492187500f // 0.95f 0x3f730000
#define p0d96 0.9609375000f // 0.96f 0x3f760000
#define p0d97 0.9687500000f // 0.97f 0x3f780000
#define p0d98 0.9804687500f // 0.98f 0x3f7b0000
#define p0d99 0.9882812500f // 0.99f 0x3f7d0000
#define p1d00 1.0000000000f // 1.00f 0x3f800000
#define p1d01 1.0078125000f // 1.01f 0x3f810000
#define p1d02 1.0234375000f // 1.02f 0x3f830000
#define p1d03 1.0312500000f // 1.03f 0x3f840000
#define p1d04 1.0390625000f // 1.04f 0x3f850000
#define p1d05 1.0468750000f // 1.05f 0x3f860000
#define p1d06 1.0625000000f // 1.06f 0x3f880000
#define p1d07 1.0703125000f // 1.07f 0x3f890000
#define p1d08 1.0781250000f // 1.08f 0x3f8a0000
#define p1d09 1.0937500000f // 1.09f 0x3f8c0000
#define p1d10 1.1015625000f // 1.10f 0x3f8d0000
#define p1d11 1.1093750000f // 1.11f 0x3f8e0000
#define p1d12 1.1171875000f // 1.12f 0x3f8f0000
#define p1d13 1.1328125000f // 1.13f 0x3f910000
#define p1d14 1.1406250000f // 1.14f 0x3f920000
#define p1d15 1.1484375000f // 1.15f 0x3f930000
#define p1d16 1.1562500000f // 1.16f 0x3f940000
#define p1d17 1.1718750000f // 1.17f 0x3f960000
#define p1d18 1.1796875000f // 1.18f 0x3f970000
#define p1d19 1.1875000000f // 1.19f 0x3f980000
#define p1d20 1.2031250000f // 1.20f 0x3f9a0000
#define p1d21 1.2109375000f // 1.21f 0x3f9b0000
#define p1d22 1.2187500000f // 1.22f 0x3f9c0000
#define p1d23 1.2265625000f // 1.23f 0x3f9d0000
#define p1d24 1.2421875000f // 1.24f 0x3f9f0000
#define p1d25 1.2500000000f // 1.25f 0x3fa00000
#define p1d26 1.2578125000f // 1.26f 0x3fa10000
#define p1d27 1.2734375000f // 1.27f 0x3fa30000
#define p1d28 1.2812500000f // 1.28f 0x3fa40000
#define p1d29 1.2890625000f // 1.29f 0x3fa50000
#define p1d30 1.2968750000f // 1.30f 0x3fa60000
#define p1d31 1.3125000000f // 1.31f 0x3fa80000
#define p1d32 1.3203125000f // 1.32f 0x3fa90000
#define p1d33 1.3281250000f // 1.33f 0x3faa0000
#define p1d34 1.3437500000f // 1.34f 0x3fac0000
#define p1d35 1.3515625000f // 1.35f 0x3fad0000
#define p1d36 1.3593750000f // 1.36f 0x3fae0000
#define p1d37 1.3671875000f // 1.37f 0x3faf0000
#define p1d38 1.3828125000f // 1.38f 0x3fb10000
#define p1d39 1.3906250000f // 1.39f 0x3fb20000
#define p1d40 1.3984375000f // 1.40f 0x3fb30000
#define p1d41 1.4062500000f // 1.41f 0x3fb40000
#define p1d42 1.4218750000f // 1.42f 0x3fb60000
#define p1d43 1.4296875000f // 1.43f 0x3fb70000
#define p1d44 1.4375000000f // 1.44f 0x3fb80000
#define p1d45 1.4531250000f // 1.45f 0x3fba0000
#define p1d46 1.4609375000f // 1.46f 0x3fbb0000
#define p1d47 1.4687500000f // 1.47f 0x3fbc0000
#define p1d48 1.4765625000f // 1.48f 0x3fbd0000
#define p1d49 1.4921875000f // 1.49f 0x3fbf0000
#define p1d50 1.5000000000f // 1.50f 0x3fc00000
#define p1d51 1.5078125000f // 1.51f 0x3fc10000
#define p1d52 1.5234375000f // 1.52f 0x3fc30000
#define p1d53 1.5312500000f // 1.53f 0x3fc40000
#define p1d54 1.5390625000f // 1.54f 0x3fc50000
#define p1d55 1.5468750000f // 1.55f 0x3fc60000
#define p1d56 1.5625000000f // 1.56f 0x3fc80000
#define p1d57 1.5703125000f // 1.57f 0x3fc90000
#define p1d58 1.5781250000f // 1.58f 0x3fca0000
#define p1d59 1.5937500000f // 1.59f 0x3fcc0000
#define p1d60 1.6015625000f // 1.60f 0x3fcd0000
#define p1d61 1.6093750000f // 1.61f 0x3fce0000
#define p1d62 1.6171875000f // 1.62f 0x3fcf0000
#define p1d63 1.6328125000f // 1.63f 0x3fd10000
#define p1d64 1.6406250000f // 1.64f 0x3fd20000
#define p1d65 1.6484375000f // 1.65f 0x3fd30000
#define p1d66 1.6562500000f // 1.66f 0x3fd40000
#define p1d67 1.6718750000f // 1.67f 0x3fd60000
#define p1d68 1.6796875000f // 1.68f 0x3fd70000
#define p1d69 1.6875000000f // 1.69f 0x3fd80000
#define p1d70 1.7031250000f // 1.70f 0x3fda0000
#define p1d71 1.7109375000f // 1.71f 0x3fdb0000
#define p1d72 1.7187500000f // 1.72f 0x3fdc0000
#define p1d73 1.7265625000f // 1.73f 0x3fdd0000
#define p1d74 1.7421875000f // 1.74f 0x3fdf0000
#define p1d75 1.7500000000f // 1.75f 0x3fe00000
#define p1d76 1.7578125000f // 1.76f 0x3fe10000
#define p1d77 1.7734375000f // 1.77f 0x3fe30000
#define p1d78 1.7812500000f // 1.78f 0x3fe40000
#define p1d79 1.7890625000f // 1.79f 0x3fe50000
#define p1d80 1.7968750000f // 1.80f 0x3fe60000
#define p1d81 1.8125000000f // 1.81f 0x3fe80000
#define p1d82 1.8203125000f // 1.82f 0x3fe90000
#define p1d83 1.8281250000f // 1.83f 0x3fea0000
#define p1d84 1.8437500000f // 1.84f 0x3fec0000
#define p1d85 1.8515625000f // 1.85f 0x3fed0000
#define p1d86 1.8593750000f // 1.86f 0x3fee0000
#define p1d87 1.8671875000f // 1.87f 0x3fef0000
#define p1d88 1.8828125000f // 1.88f 0x3ff10000
#define p1d89 1.8906250000f // 1.89f 0x3ff20000
#define p1d90 1.8984375000f // 1.90f 0x3ff30000
#define p1d91 1.9062500000f // 1.91f 0x3ff40000
#define p1d92 1.9218750000f // 1.92f 0x3ff60000
#define p1d93 1.9296875000f // 1.93f 0x3ff70000
#define p1d94 1.9375000000f // 1.94f 0x3ff80000
#define p1d95 1.9531250000f // 1.95f 0x3ffa0000
#define p1d96 1.9609375000f // 1.96f 0x3ffb0000
#define p1d97 1.9687500000f // 1.97f 0x3ffc0000
#define p1d98 1.9765625000f // 1.98f 0x3ffd0000
#define p1d99 1.9921875000f // 1.99f 0x3fff0000
#define p2d00 2.0000000000f
#define p2d10 2.0937500000f
#endif

12416
src/glext.h Normal file

File diff suppressed because it is too large Load Diff

257
src/main.cpp Normal file
View File

@ -0,0 +1,257 @@
// custom build and feature flags
#ifdef DEBUG
#define OPENGL_DEBUG 0
#define FULLSCREEN 0
#define DESPERATE 0
#define BREAK_COMPATIBILITY 0
#else
#define OPENGL_DEBUG 0
#define FULLSCREEN 0
#define DESPERATE 0
#define BREAK_COMPATIBILITY 0
#endif
#define POST_PASS 0
#define USE_MIPMAPS 1
#define USE_AUDIO 1
#define NO_UNIFORMS 0
#include "definitions.h"
#if OPENGL_DEBUG
#include "debug.h"
#endif
#include "glext.h"
#include "fft.h"
#pragma data_seg(".shader")
#include "shaders/fragment.inl"
#if POST_PASS
#pragma data_seg(".shader")
#include "shaders/post.inl"
#endif
#pragma data_seg(".pids")
// static allocation saves a few bytes
static int pidMain;
static int pidPost;
// static HDC hDC;
#ifndef EDITOR_CONTROLS
#pragma code_seg(".main")
// FFT buffers
static Complex signal[FFT_SIZE];
static Complex buffer[3 * FFT_SIZE];
static float fft_uniform[FFT_SIZE / 4];
void entrypoint(void)
#else
#include "editor.h"
int __cdecl main(int argc, char* argv[])
#endif
{
// initialize window
#if FULLSCREEN
ChangeDisplaySettings(&screenSettings, CDS_FULLSCREEN);
ShowCursor(0);
HWND window = CreateWindow((LPCSTR)0xC018, 0, WS_POPUP | WS_VISIBLE | WS_MAXIMIZE, 0, 0, 0, 0, 0, 0, 0, 0);
const HDC hDC = GetDC(window);
#else
#ifdef EDITOR_CONTROLS
HWND window = CreateWindow("static", 0, WS_POPUP | WS_VISIBLE, 0, 0, XRES, YRES, 0, 0, 0, 0);
HDC hDC = GetDC(window);
#else
// you can create a pseudo fullscreen window by similarly enabling the WS_MAXIMIZE flag as above
// in which case you can replace the resolution parameters with 0s and save a couple bytes
// this only works if the resolution is set to the display device's native resolution
HWND window = CreateWindow((LPCSTR)0xC018, 0, WS_POPUP | WS_VISIBLE, 0, 0, XRES, YRES, 0, 0, 0, 0);
HDC hDC = GetDC(window);
#endif
#endif
// initalize opengl context
SetPixelFormat(hDC, ChoosePixelFormat(hDC, &pfd), &pfd);
wglMakeCurrent(hDC, wglCreateContext(hDC));
// create and compile shader programs
pidMain = ((PFNGLCREATESHADERPROGRAMVPROC)wglGetProcAddress("glCreateShaderProgramv"))(GL_FRAGMENT_SHADER, 1, &fragment_frag);
#if POST_PASS
pidPost = ((PFNGLCREATESHADERPROGRAMVPROC)wglGetProcAddress("glCreateShaderProgramv"))(GL_FRAGMENT_SHADER, 1, &post_frag);
#endif
#ifdef SU_LOAD_GMDLS
su_load_gmdls();
#endif // SU_LOAD_GMDLS
// initialize sound
#ifndef EDITOR_CONTROLS
#if USE_AUDIO
LPDIRECTSOUND direct_sound;
LPDIRECTSOUNDBUFFER direct_sound_buffer;
DirectSoundCreate(0, &direct_sound, 0);
IDirectSound_SetCooperativeLevel(direct_sound, window, DSSCL_PRIORITY);
IDirectSound_CreateSoundBuffer(direct_sound, &buffer_description, &direct_sound_buffer, NULL);
LPVOID p1;
DWORD l1;
IDirectSoundBuffer_Lock(direct_sound_buffer, 0, SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE, &p1, &l1, NULL, NULL, 0);
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)su_render_song, p1, 0, 0);
#endif
#else
Leviathan::Editor editor = Leviathan::Editor();
editor.updateShaders(&pidMain, &pidPost, true);
// absolute path always works here
// relative path works only when not ran from visual studio directly
Leviathan::Song track(L"audio.wav");
track.play();
double position = 0.0;
#endif
static float syncs[1 + SU_NUMSYNCS];
long playCursor = 0;
long lastPlayCursor = -1;
volatile float maximum = 0.0; // Helper variable to calculate maximum fft output for normalization
// Unlock buffer for next use
IDirectSoundBuffer_Unlock(direct_sound_buffer, p1, SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE, NULL, NULL);
// Play sound
direct_sound_buffer->Play(0, 0, 0);
struct Vec3 {
float x, y, z;
};
PFNGLUNIFORM1FVPROC glUniform1fvProc = ((PFNGLUNIFORM1FVPROC)wglGetProcAddress("glUniform1fv"));
PFNGLACTIVETEXTUREPROC glActiveTexture = ((PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture"));
PFNGLUNIFORM1IPROC glUniform1i = ((PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"));
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = ((PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation"));
const ULONGLONG targetIntervalMs = 1000 / 60; // For 60 FPS FFT updates
do
{
static ULONGLONG lastFFTTime = 0;
ULONGLONG currentTime = GetTickCount64();
direct_sound_buffer->GetCurrentPosition((DWORD*)&playCursor, NULL);
#if !(DESPERATE)
// do minimal message handling so windows doesn't kill your application
// not always strictly necessary but increases compatibility and reliability a lot
// normally you'd pass an msg struct as the first argument but it's just an
// output parameter and the implementation presumably does a NULL check
PeekMessage(0, 0, 0, 0, PM_REMOVE);
#endif
// render with the primary shader
((PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"))(pidMain);
#ifndef EDITOR_CONTROLS
// if you don't have an audio system figure some other way to pass time to your shader
#if USE_AUDIO
// it is possible to upload your vars as vertex color attribute (gl_Color) to save one function import
#if NO_UNIFORMS
glColor3ui(MMTime.u.sample, 0, 0);
#else
// remember to divide your shader time variable with the SAMPLE_RATE (44100 with 4klang)
//((PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"))(0, MMTime.u.sample);
#endif
#endif
#else
position = track.getTime();
((PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"))(0, (static_cast<int>(position*44100.0)));
#endif
if (currentTime - lastFFTTime >= targetIntervalMs) {
lastFFTTime = currentTime;
/******************
* FFT
*******************/
LPVOID audio_ptr = NULL;
DWORD audio_size = 0;
// Read audio
HRESULT hr = IDirectSoundBuffer_Lock(direct_sound_buffer, 0, FFT_SIZE * sizeof(SUsample), &audio_ptr, &audio_size, NULL, NULL, DSBLOCK_FROMWRITECURSOR);
if (SUCCEEDED(hr) && audio_ptr) {
if (playCursor < ((SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE) - (FFT_SIZE * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE)))
{
SUsample* samples = (SUsample*)audio_ptr;
for (int i = 0; i < FFT_SIZE; ++i) {
signal[i] = Complex((float)samples[i], 0.0);
}
}
IDirectSoundBuffer_Unlock(direct_sound_buffer, audio_ptr, audio_size, NULL, 0);
}
// Calculate FFT
fft(signal, FFT_SIZE, buffer);
// Normalize output
for (int i = 0; i < (FFT_SIZE / 4); i++)
{
float gain = 0.05f;
float alpha = 0.10f; // "Hidastaa" FFT:n piikkejä
float threshhold = 0.00015f; // Alin arvo mik<69> p<><70>stet<65><74>n shaderille (v<>hent<6E><74> "noisea")
// float magnitude = sqrt(signal[i].re * signal[i].re + signal[i].im * signal[i].im); // signal strength
float magnitude = (float)signal[i].re;
float x_t = (magnitude < threshhold) ? 0.f : magnitude * gain;
// Exponential smoothing kaava
// s(t) = alpha*x(t)+(1-alpha)*s(t-1)
fft_uniform[i] = alpha * (x_t)+(1 - alpha) * fft_uniform[i];
}
}
syncs[0] = (float)playCursor / (SU_SAMPLE_RATE * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE); // Aika sekunteina.
for (int i = 0; i < SU_NUMSYNCS; ++i)
{
syncs[i + 1] = syncBuf[(playCursor / (2 * sizeof(SUsample)) >> 8) * SU_NUMSYNCS + i];
}
glUniform1fvProc(0, SU_NUMSYNCS + 1, syncs);
glUniform1fvProc(20, FFT_SIZE / 4, fft_uniform);
glRects(-1, -1, 1, 1);
// render "post process" using the opengl backbuffer
#if POST_PASS
glBindTexture(GL_TEXTURE_2D, 1);
#if USE_MIPMAPS
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, XRES, YRES, 0);
((PFNGLGENERATEMIPMAPPROC)wglGetProcAddress("glGenerateMipmap"))(GL_TEXTURE_2D);
#else
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, XRES, YRES, 0);
#endif
((PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture"))(GL_TEXTURE0);
((PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"))(pidPost);
((PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"))(0, 0);
glRects(-1, -1, 1, 1);
#endif
SwapBuffers(hDC);
// handle functionality of the editor
#ifdef EDITOR_CONTROLS
editor.endFrame(timeGetTime());
position = editor.handleEvents(&track, position);
editor.printFrameStatistics();
editor.updateShaders(&pidMain, &pidPost);
#endif
if (playCursor < lastPlayCursor) {
break;
}
lastPlayCursor = playCursor;
} while(!GetAsyncKeyState(VK_ESCAPE));
ExitProcess(0);
}

341
src/shaders/fragment.frag Normal file
View File

@ -0,0 +1,341 @@
#version 460
precision mediump float;
out vec4 o;
const float PI = 3.14159265;
const float TAU = (2. * PI);
const float PHI = sqrt(5.) * 0.5 + 0.5;
layout(location = 0) uniform float syncs[11];
layout(location = 20) uniform float fft_output[512]; // FFT_SIZE / 4
// float u_time = syncs[0];
vec3 palette(float t) {
vec3 a = vec3(0.46, 0.2, 0.94);
vec3 b = vec3(0.66, 0.64, 0.77);
vec3 c = vec3(0.91, 0.62, 0.97);
vec3 d = vec3(0.26, 0.2, 0.84);
return a + b * cos(6.28318 * (c * t + d));
}
vec2 getUV() {
const vec2 scale = vec2(0.00104166667, 0.00185185185);
return gl_FragCoord.xy * scale - 1.0;
}
mat2 rot2D(float angle) {
float s = sin(angle);
float c = cos(angle);
return mat2(c, -s, s, c);
}
float noise(in vec2 xy, in float seed) {
return fract(tan(distance(xy * PHI, xy) * seed) * xy.x);
}
/////////////////
// GEOMETRY //
/////////////////
float fHexagonCircumcircle(vec3 p, vec2 h) {
vec3 q = abs(p);
return max(q.y - h.y, max(q.x * sqrt(3.) * 0.5 + q.z * 0.5, q.z) - h.x);
}
// Return local coordinates inside hex AND axial ID
struct HexData {
vec3 local; // Local position inside hex
vec2 axial; // Axial ID (q, r)
};
HexData hexTile(vec3 p, float radius) {
float q = (sqrt(3.0) / 3.0 * p.x - 1.0 / 3.0 * p.z) / radius;
float r = (2.0 / 3.0 * p.z) / radius;
float rq = round(q);
float rr = round(r);
float rs = round(-q - r);
float dq = abs(rq - q);
float dr = abs(rr - r);
float ds = abs(rs + q + r);
if(dq > dr && dq > ds)
rq = -rr - rs;
else if(dr > ds)
rr = -rq - rs;
float hx = radius * sqrt(3.0) * (rq + rr * 0.5);
float hz = radius * 1.5 * rr;
HexData outData;
outData.local = p - vec3(hx, 0.0, hz);
outData.axial = vec2(rq, rr); // Hex ID
return outData;
}
float hexDistance(vec2 axial) {
float q = axial.x;
float r = axial.y;
float s = -q - r;
return max(abs(q), max(abs(r), abs(s)));
}
float sdSphere(vec3 p, float r) {
return length(p) - r;
}
float hexPylon(vec3 p, vec2 h) {
//vec3 p = vec3(p.x, p.z, p2.y);
vec3 b = vec3(h.x, h.y, h.x);
// Hexagon.
p.xz = abs(p.xz);
p.xz = vec2(p.x * .866025 + p.z * .5, p.z);
// The ".015" is a subtle rounding factor. Zero gives sharp edges,
// and larger numbers give a more rounded look.
return length(max(abs(p) - b + .15, 0.)) - .15;
}
//////////////
// SCENE //
//////////////
// instructions -> opU( { float to union with } , vec2( {put shape here}, {put material here} ) )
vec2 opU(vec2 d1, vec2 d2) {
return (d1.x < d2.x) ? d1 : d2;
}
float noyce(vec2 axial) {
if(mod(floor(syncs[0]), 2.) == 0.) {
return mix(noise(axial, 0.1), noise(axial, 0.2), sin(syncs[0] * 2.));
}
return mix(noise(axial, 0.2), noise(axial, 0.1), sin(syncs[0] * 2.));
}
vec2 mapScene(in vec3 p) {
float res = p.y;
float mat = 0.;
float hexRadius = 0.83;
vec3 hexpos = vec3(p.x, p.y - 2.5, p.z);
HexData hex = hexTile(hexpos, 1.1);
float distFromCenter = hexDistance(hex.axial);
int fftIndex = int(clamp(distFromCenter + 1.0, 0.0, 511.0));
float fftVal = fft_output[fftIndex];
float noise = noyce(hex.axial);
// float hexHeight = 1.0 + fftVal * 5.0 + noise;
float hexHeight = 1.0 + noise;
// Rotate individual hex tiles if needed
vec3 r = hex.local;
// r.yz *= rot2D(PI * 0.5);
r.xz *= rot2D(0.5);
//float d1 = hexPylon(vec3(r.x, (r.y + hexHeight / 2), r.z), vec2(hexRadius, hexHeight / 2));
float d1 = hexPylon(vec3(r.x, r.y, r.z), vec2(hexRadius, hexHeight));
res = (d1 < res) ? d1 : res;
return vec2(res, mat);
}
////////////////
// RAYCAST //
////////////////
vec3 castRay(vec3 ro, vec3 rd, inout vec3 pos) {
float mat = 0.;
float hit = 0.;
float t = 0.;
vec2 res;
// Raymarching
for(int i = 0; i < 20; i++) {
pos = ro + rd * t;
res = mapScene(pos); // Get distance to objects, x = dist, y = material
mat = res.y;
t += res.x; // "march" the ray
// if(abs(t) < tolerance * (t * 0.0125 + 1.0)) {
if(abs(res.x) < 0.0001) {
hit = 1.;
break;
}
if(t > 200)
break;
}
return vec3(t, mat, hit);
}
////////////////
// SHADING //
////////////////
float softshadow(in vec3 ro, in vec3 rd, float mint, float maxt, float w) {
float res = 1.0;
float t = mint;
for(int i = 0; i < 6; i++) {
if(t > maxt)
break;
float h = mapScene(ro + t * rd).x;
res = min(res, h / (w * t));
t += clamp(h, 0.1, 0.80);
if(res < -1.0)
break;
}
res = max(res, -1.0);
return 0.25 * (1.0 + res) * (1.0 + res) * (2.0 - res);
}
vec3 calcNormal(vec3 pos) {
vec2 e = vec2(.01, 0.);
vec3 n = vec3(mapScene(pos + e.xyy).x - mapScene(pos - e.xyy).x, mapScene(pos + e.yxy).x - mapScene(pos - e.yxy).x, mapScene(pos + e.yyx).x - mapScene(pos - e.yyx).x);
return normalize(n);
}
vec3 addPointLight(vec3 lightPos, vec3 lightColor, float intensity, vec3 worldPos, vec3 viewDir, vec3 normal, float roughness) {
// Light vector from surface to light
vec3 lightDir = lightPos - worldPos;
float lightDistance = length(lightDir);
lightDir = normalize(lightDir);
// Attenuation (quadratic falloff)
float attenuation = intensity / (1.0 + 0.09 * lightDistance + 0.032 * lightDistance * lightDistance);
// Diffuse lighting (Lambert)
float NdotL = max(dot(normal, lightDir), 0.0);
vec3 diffuse = lightColor * NdotL * attenuation;
// Specular lighting (Blinn-Phong)
vec3 halfDir = normalize(lightDir + (-viewDir));
float NdotH = max(dot(normal, halfDir), 0.0);
float shininess = mix(128.0, 8.0, roughness); // Convert roughness to shininess
vec3 specular = lightColor * pow(NdotH, shininess) * attenuation;
// Fresnel effect
vec3 F0 = vec3(0.04); // Base reflectance for dielectrics
vec3 fresnel = F0 + (1.0 - F0) * pow(clamp(1.0 - max(dot(halfDir, lightDir), 0.0), 0.0, 1.0), 5.0);
// Soft shadows
float shadow = softshadow(worldPos + normal * 0.01, lightDir, 0.02, lightDistance, 4.0);
// Combine diffuse and specular with shadow
return (diffuse + specular * fresnel) * shadow;
}
vec3 applyFog(vec3 col, float t, vec3 rd, vec3 lightDir, float fogAmount) {
float syncsBass = clamp((syncs[1] + syncs[2] + syncs[3]), 0., 1.);
float fogAmount2 = 1.0 - exp(-t * fogAmount);
float sunAmount = max(dot(rd, lightDir), 1.0);
// highlight color
vec3 fogColor = mix(vec3(0.2706, 0.2706, 0.2863), vec3(0.2314, 0.2314, 0.2314), // Main color
pow(sunAmount, syncsBass * 1.0));
return mix(col, fogColor, fogAmount2);
}
vec3 shading(vec3 p, vec3 n, vec3 dir, float material) {
float shininess = 0.0;
vec3 outMaterial = vec3(0.);
if(material == 0.) {
outMaterial = palette(p.y * 0.1);
if(syncs[0] > 5.) {
outMaterial = vec3(0.5);
}
outMaterial = mix(palette(p.y * 0.1), vec3(0.5), abs(sin(syncs[0] * 0.2)));
shininess = 0.6;
}
if(material == 1.) {
outMaterial = vec3(0.5);
shininess = 0.6;
}
vec3 lights = vec3(0.);
lights += addPointLight(vec3(0., 20.0, 10.), vec3(0.77, 0.26, 0.73), 15.0, p, dir, n, shininess);
lights += addPointLight(vec3(-10., 20.0, -10.), vec3(0.18, 0.61, 0.86), 15., p, dir, n, shininess);
vec3 lightDir = vec3(0., 2., 3);
float ind = clamp(dot(n, normalize(lightDir * vec3(.0, 1.0, -2.0))), 0.0, 1.0);
lights += vec3(0.08, 0.62, 0.75) * ind * 0.8;
outMaterial *= max(vec3(0.), lights); // output with lights;
return outMaterial;
}
vec3 postProcess(vec3 col) {
// Contrast
float contrast = 0.75;
col = mix(col, smoothstep(0.0, 1.0, col), contrast);
// Colour mapping
// col *= vec3(1.0, 1.0, 1.0);
// Gamma
col = pow(col, vec3(0.4545)); // gamma 2.2
// fade in at the beginning
//col*=vec3(clamp((u_time-1.8)*0.5,0., 1.));
// fade out at the end
// col*=vec3(clamp((120.-u_time)*.35, 0., 1.));
return col;
}
//////////////////
// RENDERING //
//////////////////
vec3 getCameraRayDir(vec2 uv, vec3 camPos, vec3 camTarget, float fov) {
vec3 f = normalize(camTarget - camPos), r = normalize(cross(vec3(0, 1, 0), f)), u = cross(f, r), c = f * fov, i = c + uv.x * r + uv.y * u, d = normalize(i);
return d;
}
vec3 render(vec2 uv) {
vec3 camPos = vec3(-20.0 + sin(syncs[0] * 0.25) * 5, abs(sin(syncs[0] * 0.25) * 10) + 25.0, -20.0);
vec3 camTarget = vec3(0.0, 0.0, 0.0); // Adjust target as needed
float fov = 1.0;
vec3 rayDir = getCameraRayDir(uv, camPos, camTarget, fov);
vec3 col = vec3(0.); // background color
vec3 hitPos = vec3(0);
vec3 t = castRay(camPos, rayDir, hitPos);
if(t.x > 0.0) {
vec3 nor = calcNormal(hitPos);
col = shading(hitPos, nor, rayDir, t.y);
}
//glow from the bottom
vec3 bGlowColor = palette(syncs[0] * .075); // color change
float bGlowDistance = 0.3;
vec3 p = camPos + t.x * rayDir;
vec3 bGlowLevel = bGlowColor * exp(-(p.y + 0.0) / bGlowDistance) * 9900.;
col += bGlowLevel;
col = clamp(mix(bGlowLevel, col, t.z), 0.0, 1.0);
// distance fog + bass thunder
float fogAmount = 0.01;
col = col * exp(-t.x * fogAmount) + applyFog(col, t.x, rayDir, vec3(0., -0.5, 1.8), fogAmount) * (1.0 - exp(-t.x * fogAmount));
return col;
}
void main() {
vec3 finalColor = render(getUV());
finalColor = postProcess(finalColor);
o = vec4(finalColor, 1.);
}

18
src/shaders/post.frag Normal file
View File

@ -0,0 +1,18 @@
// A simple chromatic aberration example
// Mipmap fake glossy thing!
#version 130
uniform sampler2D o;
out vec4 i;
float hash(float c){return fract(sin(dot(c, 12.9898)) * 43758.5453);}
void main(){
i = vec4(0);
for(int t = 0; t < 25; t++){
vec2 uv = gl_FragCoord.xy*2./vec2(1920,1080);
float s1 = hash(float(t+dot(uv,uv)));
float s2 = hash(float(1-t+dot(uv,uv)));
vec2 f = 0.01*(-1.0+2.0*vec2(s1,s2));
i += vec4(textureLod(o, uv, (0.3+0.7*s1)*texture(o, (1.0+1.0*f)*uv).a*8).rgb,1);
}
i /= vec4(25);
}

654
src/shaders/random.frag Normal file
View File

@ -0,0 +1,654 @@
////////////////////////////////////////////////////////////////
//
// HG_SDF
//
// GLSL LIBRARY FOR BUILDING SIGNED DISTANCE BOUNDS
//
// version 2021-07-28
//
// Check https://mercury.sexy/hg_sdf for updates
// and usage examples. Send feedback to spheretracing@mercury.sexy.
//
// Brought to you by MERCURY https://mercury.sexy/
//
//
//
// Released dual-licensed under
// Creative Commons Attribution-NonCommercial (CC BY-NC)
// or
// MIT License
// at your choice.
//
// SPDX-License-Identifier: MIT OR CC-BY-NC-4.0
//
// /////
////////////////////////////////////////////////////////////////
//
// HELPER FUNCTIONS/MACROS
//
////////////////////////////////////////////////////////////////
const float PI = 3.14159265;
const float TAU = (2. * PI);
const float PHI = sqrt(5.) * 0.5 + 0.5;
vec3 applyFog(vec3 col, float t, vec3 rd, vec3 lightDir, float b) {
float fogAmount = 1.0 - exp(-t * b);
float sunAmount = max(dot(rd, lightDir), 0.);
vec3 fogColor = mix(vec3(0.1529, 0.1137, 0.2), // blue
vec3(0.2588, 0.1765, 0.3529), // yellow
pow(sunAmount, 1.0));
return mix(col, fogColor, fogAmount);
}
mat2 scale(vec2 scale) {
return mat2(1. / scale.x, 0.0, 0.0, 1. / scale.y);
}
// Sign function that doesn't return 0
float sgn(float x) {
return (x < 0.) ? -1. : 1.;
}
vec2 sgn(vec2 v) {
return vec2((v.x < 0.) ? -1. : 1., (v.y < 0.) ? -1. : 1.);
}
float square(float x) {
return x * x;
}
vec2 square(vec2 x) {
return x * x;
}
vec3 square(vec3 x) {
return x * x;
}
float lengthSqr(vec3 x) {
return dot(x, x);
}
// Maximum/minumum elements of a vector
float vmax(vec2 v) {
return max(v.x, v.y);
}
float vmax(vec3 v) {
return max(max(v.x, v.y), v.z);
}
float vmax(vec4 v) {
return max(max(v.x, v.y), max(v.z, v.w));
}
float vmin(vec2 v) {
return min(v.x, v.y);
}
float vmin(vec3 v) {
return min(min(v.x, v.y), v.z);
}
float vmin(vec4 v) {
return min(min(v.x, v.y), min(v.z, v.w));
}
// Hexagonal prism, circumcircle variant
float fHexagonCircumcircle(vec3 p, vec2 h) {
vec3 q = abs(p);
return max(q.y - h.y, max(q.x * sqrt(3.) * 0.5 + q.z * 0.5, q.z) - h.x);
//this is mathematically equivalent to this line, but less efficient:
//return max(q.y - h.y, max(dot(vec2(cos(PI/3), sin(PI/3)), q.zx), q.z) - h.x);
}
////////////////////////////////////////////////////////////////
//
// PRIMITIVE DISTANCE FUNCTIONS
//
////////////////////////////////////////////////////////////////
//
// Conventions:
//
// Everything that is a distance function is called fSomething.
// The first argument is always a point in 2 or 3-space called <p>.
// Unless otherwise noted, (if the object has an intrinsic "up"
// side or direction) the y axis is "up" and the object is
// centered at the origin.
//
////////////////////////////////////////////////////////////////
float fSphere(vec3 p, float r) {
return length(p) - r;
}
// Plane with normal n (n is normalized) at some distance from the origin
float fPlane(vec3 p, vec3 n, float distanceFromOrigin) {
return dot(p, n) + distanceFromOrigin;
}
// Cheap Box: distance to corners is overestimated
float fBoxCheap(vec3 p, vec3 b) { //cheap box
return vmax(abs(p) - b);
}
// Box: correct distance to corners
float fBox(vec3 p, vec3 b) {
vec3 d = abs(p) - b;
return length(max(d, vec3(0))) + vmax(min(d, vec3(0)));
}
// Same as above, but in two dimensions (an endless box)
float fBox2Cheap(vec2 p, vec2 b) {
return vmax(abs(p) - b);
}
float fBox2(vec2 p, vec2 b) {
vec2 d = abs(p) - b;
return length(max(d, vec2(0.))) + vmax(min(d, vec2(0.)));
}
// Endless "corner"
float fCorner(vec2 p) {
return length(max(p, vec2(0.))) + vmax(min(p, vec2(0.)));
}
// Cylinder standing upright on the xz plane
float fCylinder(vec3 p, float r, float height) {
float d = length(p.xz) - r;
d = max(d, abs(p.y) - height);
return d;
}
// Capsule: A Cylinder with round caps on both sides
float fCapsule(vec3 p, float r, float c) {
return mix(length(p.xz) - r, length(vec3(p.x, abs(p.y) - c, p.z)) - r, step(c, abs(p.y)));
}
// Distance to line segment between <a> and <b>, used for fCapsule() version 2below
float fLineSegment(vec3 p, vec3 a, vec3 b) {
vec3 ab = b - a;
float t = clamp(dot(p - a, ab) / dot(ab, ab), 0., 1.);
return length((ab * t + a) - p);
}
// Capsule version 2: between two end points <a> and <b> with radius r
float fCapsule(vec3 p, vec3 a, vec3 b, float r) {
return fLineSegment(p, a, b) - r;
}
// Torus in the XZ-plane
float fTorus(vec3 p, float smallRadius, float largeRadius) {
return length(vec2(length(p.xz) - largeRadius, p.y)) - smallRadius;
}
// A circle line. Can also be used to make a torus by subtracting the smaller radius of the torus.
float fCircle(vec3 p, float r) {
float l = length(p.xz) - r;
return length(vec2(p.y, l));
}
// A circular disc with no thickness (i.e. a cylinder with no height).
// Subtract some value to make a flat disc with rounded edge.
float fDisc(vec3 p, float r) {
float l = length(p.xz) - r;
return l < 0. ? abs(p.y) : length(vec2(p.y, l));
}
// Hexagonal prism, incircle variant
float fHexagonIncircle(vec3 p, vec2 h) {
return fHexagonCircumcircle(p, vec2(h.x * sqrt(3.) * 0.5, h.y));
}
// Cone with correct distances to tip and base circle. Y is up, 0 is in the middle of the base.
float fCone(vec3 p, float radius, float height) {
vec2 q = vec2(length(p.xz), p.y);
vec2 tip = q - vec2(0, height);
vec2 mantleDir = normalize(vec2(height, radius));
float mantle = dot(tip, mantleDir);
float d = max(mantle, -q.y);
float projected = dot(tip, vec2(mantleDir.y, -mantleDir.x));
// distance to tip
if((q.y > height) && (projected < 0.)) {
d = max(d, length(tip));
}
// distance to base ring
if((q.x > radius) && (projected > length(vec2(height, radius)))) {
d = max(d, length(q - vec2(radius, 0)));
}
return d;
}
////////////////////////////////////////////////////////////////
//
// DOMAIN MANIPULATION OPERATORS
//
////////////////////////////////////////////////////////////////
//
// Conventions:
//
// Everything that modifies the domain is named pSomething.
//
// Many operate only on a subset of the three dimensions. For those,
// you must choose the dimensions that you want manipulated
// by supplying e.g. <p.x> or <p.zx>
//
// <inout p> is always the first argument and modified in place.
//
// Many of the operators partition space into cells. An identifier
// or cell index is returned, if possible. This return value is
// intended to be optionally used e.g. as a random seed to change
// parameters of the distance functions inside the cells.
//
// Unless stated otherwise, for cell index 0, <p> is unchanged and cells
// are centered on the origin so objects don't have to be moved to fit.
//
//
////////////////////////////////////////////////////////////////
// Rotate around a coordinate axis (i.e. in a plane perpendicular to that axis) by angle <a>.
// Read like this: R(p.xz, a) rotates "x towards z".
// This is fast if <a> is a compile-time constant and slower (but still practical) if not.
void pR(inout vec2 p, float a) {
p = cos(a) * p + sin(a) * vec2(p.y, -p.x);
}
// Shortcut for 45-degrees rotation
void pR45(inout vec2 p) {
p = (p + vec2(p.y, -p.x)) * sqrt(0.5);
}
// Repeat space along one axis. Use like this to repeat along the x axis:
// <float cell = pMod1(p.x,5);> - using the return value is optional.
float pMod1(inout float p, float size) {
float halfsize = size * 0.5;
float c = floor((p + halfsize) / size);
p = mod(p + halfsize, size) - halfsize;
return c;
}
// Same, but mirror every second cell so they match at the boundaries
float pModMirror1(inout float p, float size) {
float halfsize = size * 0.5;
float c = floor((p + halfsize) / size);
p = mod(p + halfsize, size) - halfsize;
p *= mod(c, 2.0) * 2. - 1.;
return c;
}
// Repeat the domain only in positive direction. Everything in the negative half-space is unchanged.
float pModSingle1(inout float p, float size) {
float halfsize = size * 0.5;
float c = floor((p + halfsize) / size);
if(p >= 0.)
p = mod(p + halfsize, size) - halfsize;
return c;
}
// Repeat only a few times: from indices <start> to <stop> (similar to above, but more flexible)
float pModInterval1(inout float p, float size, float start, float stop) {
float halfsize = size * 0.5;
float c = floor((p + halfsize) / size);
p = mod(p + halfsize, size) - halfsize;
if(c > stop) { //yes, this might not be the best thing numerically.
p += size * (c - stop);
c = stop;
}
if(c < start) {
p += size * (c - start);
c = start;
}
return c;
}
// Repeat around the origin by a fixed angle.
// For easier use, num of repetitions is use to specify the angle.
float pModPolar(inout vec2 p, float repetitions) {
float angle = 2. * PI / repetitions;
float a = atan(p.y, p.x) + angle / 2.;
float r = length(p);
float c = floor(a / angle);
a = mod(a, angle) - angle / 2.;
p = vec2(cos(a), sin(a)) * r;
// For an odd number of repetitions, fix cell index of the cell in -x direction
// (cell index would be e.g. -5 and 5 in the two halves of the cell):
if(abs(c) >= (repetitions / 2.))
c = abs(c);
return c;
}
// Repeat in two dimensions
vec2 pMod2(inout vec2 p, vec2 size) {
vec2 c = floor((p + size * 0.5) / size);
p = mod(p + size * 0.5, size) - size * 0.5;
return c;
}
// Same, but mirror every second cell so all boundaries match
vec2 pModMirror2(inout vec2 p, vec2 size) {
vec2 halfsize = size * 0.5;
vec2 c = floor((p + halfsize) / size);
p = mod(p + halfsize, size) - halfsize;
p *= mod(c, vec2(2.)) * 2. - vec2(1);
return c;
}
// Same, but mirror every second cell at the diagonal as well
vec2 pModGrid2(inout vec2 p, vec2 size) {
vec2 c = floor((p + size * 0.5) / size);
p = mod(p + size * 0.5, size) - size * 0.5;
p *= mod(c, vec2(2.)) * 2. - vec2(1.);
p -= size / 2.;
if(p.x > p.y)
p.xy = p.yx;
return floor(c / 2.);
}
// Repeat in three dimensions
vec3 pMod3(inout vec3 p, vec3 size) {
vec3 c = floor((p + size * 0.5) / size);
p = mod(p + size * 0.5, size) - size * 0.5;
return c;
}
// Mirror at an axis-aligned plane which is at a specified distance <dist> from the origin.
float pMirror(inout float p, float dist) {
float s = sgn(p);
p = abs(p) - dist;
return s;
}
// Mirror in both dimensions and at the diagonal, yielding one eighth of the space.
// translate by dist before mirroring.
vec2 pMirrorOctant(inout vec2 p, vec2 dist) {
vec2 s = sgn(p);
pMirror(p.x, dist.x);
pMirror(p.y, dist.y);
if(p.y > p.x)
p.xy = p.yx;
return s;
}
// Reflect space at a plane
float pReflect(inout vec3 p, vec3 planeNormal, float offset) {
float t = dot(p, planeNormal) + offset;
if(t < 0.) {
p = p - (2. * t) * planeNormal;
}
return sgn(t);
}
////////////////////////////////////////////////////////////////
//
// OBJECT COMBINATION OPERATORS
//
////////////////////////////////////////////////////////////////
//
// We usually need the following boolean operators to combine two objects:
// Union: OR(a,b)
// Intersection: AND(a,b)
// Difference: AND(a,!b)
// (a and b being the distances to the objects).
//
// The trivial implementations are min(a,b) for union, max(a,b) for intersection
// and max(a,-b) for difference. To combine objects in more interesting ways to
// produce rounded edges, chamfers, stairs, etc. instead of plain sharp edges we
// can use combination operators. It is common to use some kind of "smooth minimum"
// instead of min(), but we don't like that because it does not preserve Lipschitz
// continuity in many cases.
//
// Naming convention: since they return a distance, they are called fOpSomething.
// The different flavours usually implement all the boolean operators above
// and are called fOpUnionRound, fOpIntersectionRound, etc.
//
// The basic idea: Assume the object surfaces intersect at a right angle. The two
// distances <a> and <b> constitute a new local two-dimensional coordinate system
// with the actual intersection as the origin. In this coordinate system, we can
// evaluate any 2D distance function we want in order to shape the edge.
//
// The operators below are just those that we found useful or interesting and should
// be seen as examples. There are infinitely more possible operators.
//
// They are designed to actually produce correct distances or distance bounds, unlike
// popular "smooth minimum" operators, on the condition that the gradients of the two
// SDFs are at right angles. When they are off by more than 30 degrees or so, the
// Lipschitz condition will no longer hold (i.e. you might get artifacts). The worst
// case is parallel surfaces that are close to each other.
//
// Most have a float argument <r> to specify the radius of the feature they represent.
// This should be much smaller than the object size.
//
// Some of them have checks like "if ((-a < r) && (-b < r))" that restrict
// their influence (and computation cost) to a certain area. You might
// want to lift that restriction or enforce it. We have left it as comments
// in some cases.
//
// usage example:
//
// float fTwoBoxes(vec3 p) {
// float box0 = fBox(p, vec3(1));
// float box1 = fBox(p-vec3(1), vec3(1));
// return fOpUnionChamfer(box0, box1, 0.2);
// }
//
////////////////////////////////////////////////////////////////
// The "Chamfer" flavour makes a 45-degree chamfered edge (the diagonal of a square of size <r>):
float fOpUnionChamfer(float a, float b, float r) {
return min(min(a, b), (a - r + b) * sqrt(0.5));
}
// Intersection has to deal with what is normally the inside of the resulting object
// when using union, which we normally don't care about too much. Thus, intersection
// implementations sometimes differ from union implementations.
float fOpIntersectionChamfer(float a, float b, float r) {
return max(max(a, b), (a + r + b) * sqrt(0.5));
}
// Difference can be built from Intersection or Union:
float fOpDifferenceChamfer(float a, float b, float r) {
return fOpIntersectionChamfer(a, -b, r);
}
// The "Round" variant uses a quarter-circle to join the two objects smoothly:
float fOpUnionRound(float a, float b, float r) {
vec2 u = max(vec2(r - a, r - b), vec2(0));
return max(r, min(a, b)) - length(u);
}
float fOpIntersectionRound(float a, float b, float r) {
vec2 u = max(vec2(r + a, r + b), vec2(0));
return min(-r, max(a, b)) + length(u);
}
float fOpDifferenceRound(float a, float b, float r) {
return fOpIntersectionRound(a, -b, r);
}
// The "Columns" flavour makes n-1 circular columns at a 45 degree angle:
float fOpUnionColumns(float a, float b, float r, float n) {
if((a < r) && (b < r)) {
vec2 p = vec2(a, b);
float columnradius = r * sqrt(2.) / ((n - 1.) * 2. + sqrt(2.));
pR45(p);
p.x -= sqrt(2.) / 2. * r;
p.x += columnradius * sqrt(2.);
if(mod(n, 2.) == 1.) {
p.y += columnradius;
}
// At this point, we have turned 45 degrees and moved at a point on the
// diagonal that we want to place the columns on.
// Now, repeat the domain along this direction and place a circle.
pMod1(p.y, columnradius * 2.);
float result = length(p) - columnradius;
result = min(result, p.x);
result = min(result, a);
return min(result, b);
} else {
return min(a, b);
}
}
float fOpDifferenceColumns(float a, float b, float r, float n) {
a = -a;
float m = min(a, b);
//avoid the expensive computation where not needed (produces discontinuity though)
if((a < r) && (b < r)) {
vec2 p = vec2(a, b);
float columnradius = r * sqrt(2.) / n / 2.0;
columnradius = r * sqrt(2.) / ((n - 1.) * 2. + sqrt(2.));
pR45(p);
p.y += columnradius;
p.x -= sqrt(2.) / 2. * r;
p.x += -columnradius * sqrt(2.) / 2.;
if(mod(n, 2.) == 1.) {
p.y += columnradius;
}
pMod1(p.y, columnradius * 2.);
float result = -length(p) + columnradius;
result = max(result, p.x);
result = min(result, a);
return -min(result, b);
} else {
return -m;
}
}
float fOpIntersectionColumns(float a, float b, float r, float n) {
return fOpDifferenceColumns(a, -b, r, n);
}
// The "Stairs" flavour produces n-1 steps of a staircase:
// much less stupid version by paniq
float fOpUnionStairs(float a, float b, float r, float n) {
float s = r / n;
float u = b - r;
return min(min(a, b), 0.5 * (u + a + abs((mod(u - a + s, 2. * s)) - s)));
}
// We can just call Union since stairs are symmetric.
float fOpIntersectionStairs(float a, float b, float r, float n) {
return -fOpUnionStairs(-a, -b, r, n);
}
float fOpDifferenceStairs(float a, float b, float r, float n) {
return -fOpUnionStairs(-a, b, r, n);
}
// Similar to fOpUnionRound, but more lipschitz-y at acute angles
// (and less so at 90 degrees). Useful when fudging around too much
// by MediaMolecule, from Alex Evans' siggraph slides
float fOpUnionSoft(float a, float b, float r) {
float e = max(r - abs(a - b), 0.);
return min(a, b) - e * e * 0.25 / r;
}
// produces a cylindical pipe that runs along the intersection.
// No objects remain, only the pipe. This is not a boolean operator.
float fOpPipe(float a, float b, float r) {
return length(vec2(a, b)) - r;
}
// first object gets a v-shaped engraving where it intersect the second
float fOpEngrave(float a, float b, float r) {
return max(a, (a + r - abs(b)) * sqrt(0.5));
}
// first object gets a capenter-style groove cut out
float fOpGroove(float a, float b, float ra, float rb) {
return max(a, min(a + ra, rb - abs(b)));
}
// first object gets a capenter-style tongue attached
float fOpTongue(float a, float b, float ra, float rb) {
return min(a, max(a - ra, abs(b) - rb));
}
//#endSection End of library
// https://stackoverflow.com/questions/4200224/random-noise-functions-for-glsl
// golden_noise
float noise(in vec2 xy, in float seed) {
return fract(tan(distance(xy * PHI, xy) * seed) * xy.x);
}
vec3 rnd23(vec2 p) {
vec3 p3 = fract(p.xyx * vec3(.1031, .1030, .0973));
p3 += dot(p3, p3.yxz + 33.33);
return fract((p3.xxy + p3.yzz) * p3.zyx);
}
mat2 Rot(float a) {
float s = sin(a), c = cos(a);
return mat2(c, -s, s, c);
}
float opExtrusion(in vec3 p, in float sdf, in float h) {
vec2 w = vec2(sdf, abs(p.z) - h);
return min(max(w.x, w.y), 0.0) + length(max(w, 0.0));
}
float sdCog2d(vec2 pos) {
float r = length(pos) * 2.;
float a = atan(pos.y, pos.x);
float f = 1. - smoothstep(-0.2, .8, sin(a * 12.)) * 0.14;
f = smoothstep(f, f + 2., r);
return f;
}
float sdCog(vec3 pos, float angle) {
pos.xy *= Rot(angle);
float d1 = opExtrusion(pos, sdCog2d(pos.xy), 0.05);
float d2 = fCapsule(pos, vec3(0., 0.0, 0.), vec3(0., 0., 1.), 0.2);
return 0.8 * fOpDifferenceRound(d1, d2, 0.05) - 0.003;
}
float sdCapsule(vec3 p, vec3 a, vec3 b, float r) {
vec3 pa = p - a, ba = b - a;
float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
return length(pa - ba * h) - r;
}
float sdCylinder(vec3 p, vec3 a, vec3 b, float r) {
vec3 ba = b - a;
vec3 pa = p - a;
float baba = dot(ba, ba);
float paba = dot(pa, ba);
float x = length(pa * baba - ba * paba) - r * baba;
float y = abs(paba - baba * 0.5) - baba * 0.5;
float x2 = x * x;
float y2 = y * y * baba;
float d = (max(x, y) < 0.0) ? -min(x2, y2) : (((x > 0.0) ? x2 : 0.0) + ((y > 0.0) ? y2 : 0.0));
return sign(d) * sqrt(abs(d)) / baba;
}
float sdPlane(vec3 p, vec4 n) {
// n must be normalized
return dot(p, n.xyz) + n.w;
}
// Add this function before mapScene
float rippleEffect(vec3 p, vec3 center, float time) {
float dist = length(p.xz - center.xz);
float wave = sin(dist * 2.0 - time * 8.0) * exp(-dist * 0.3);
return wave * 0.5; // Adjust amplitude as needed
}
/*// Hexagonal prism, circumcircle variant
float fHexagonCircumcircle(vec3 p, vec2 h) {
vec3 q = abs(p);
return max(q.y - h.y, max(q.x * sqrt(3.) * 0.5 + q.z * 0.5, q.z) - h.x);
//this is mathematically equivalent to this line, but less efficient:
//return max(q.y - h.y, max(dot(vec2(cos(PI/3), sin(PI/3)), q.zx), q.z) - h.x);
}*/

46
src/sointu/song.h Normal file
View File

@ -0,0 +1,46 @@
// auto-generated by Sointu, editing not recommended
#ifndef SU_RENDER_H
#define SU_RENDER_H
#define SU_CHANNEL_COUNT 2
#define SU_LENGTH_IN_SAMPLES 8282304
#define SU_BUFFER_LENGTH (SU_LENGTH_IN_SAMPLES*SU_CHANNEL_COUNT)
#define SU_SAMPLE_RATE 44100
#define SU_BPM 138
#define SU_ROWS_PER_BEAT 4
#define SU_ROWS_PER_PATTERN 16
#define SU_LENGTH_IN_PATTERNS 108
#define SU_LENGTH_IN_ROWS (SU_LENGTH_IN_PATTERNS*SU_PATTERN_SIZE)
#define SU_SAMPLES_PER_ROW (SU_SAMPLE_RATE*60/(SU_BPM*SU_ROWS_PER_BEAT))
#define SU_NUMSYNCS 11
#define SU_SYNCBUFFER_LENGTH ((SU_LENGTH_IN_SAMPLES+255)>>8)*SU_NUMSYNCS
#include <stdint.h>
#if UINTPTR_MAX == 0xffffffff
#if defined(__clang__) || defined(__GNUC__)
#define SU_CALLCONV __attribute__ ((stdcall))
#elif defined(_WIN32)
#define SU_CALLCONV __stdcall
#endif
#else
#define SU_CALLCONV
#endif
typedef float SUsample;
#define SU_SAMPLE_RANGE 1.0
#define SU_SAMPLE_FLOAT
#define SU_SAMPLE_SIZE 4
#ifdef __cplusplus
extern "C" {
#endif
#define SU_SYNC
void SU_CALLCONV su_render_song(SUsample *buffer);
#ifdef __cplusplus
}
#endif
#endif

115
src/song.cpp Normal file
View File

@ -0,0 +1,115 @@
#include <string>
#include "song.h"
#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "ComCtl32.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "strmbase.lib")
using namespace Leviathan;
Song::Song()
{
}
Song::Song(LPCWSTR path) : playing(false)
{
__int64 trackLength;
IGraphBuilder * graph;
CoInitialize(0);
CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC, IID_IGraphBuilder, (void**)&graph);
graph->QueryInterface(IID_IMediaControl, (void**)&mediaControl);
graph->QueryInterface(IID_IMediaSeeking, (void**)&mediaSeeking);
graph->QueryInterface(IID_IBasicAudio, (void**)&audioControl);
audioControl->put_Volume(long(-90000));
HRESULT hr = graph->RenderFile(path, 0);
if (hr == S_OK)
printf("Audio file opened successfully\n");
else
printf("Failed to open audio file\n");
graph->Release();
mediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
mediaSeeking->GetDuration(&trackLength);
length = (long double)(trackLength) / (long double)10000000.0;
__int64 position = 0;
mediaSeeking->SetPositions(&position, AM_SEEKING_AbsolutePositioning, &position, AM_SEEKING_NoPositioning);
pause();
}
Song::~Song()
{
audioControl->Release();
mediaControl->Release();
mediaSeeking->Release();
}
int Song::play()
{
mediaControl->Run();
playing = true;
return 0;
}
int Song::pause()
{
mediaControl->Stop();
playing = false;
return 0;
}
int Song::toggle()
{
playing = !playing;
if (playing)
play();
else
pause();
return 0;
}
bool Song::is_playing()
{
OAFilterState state;
mediaControl->GetState(INFINITE, &state);
__int64 trackLength, position;
mediaSeeking->GetDuration(&trackLength);
mediaSeeking->GetCurrentPosition(&position);
return position<trackLength;
}
int Song::seek(long double position)
{
if (position>length)
position = length;
if (position<.0)
position = .0;
__int64 seekPosition = __int64(10000000.0*position);
if (playing)
mediaControl->Stop();
mediaSeeking->SetPositions(&seekPosition, AM_SEEKING_AbsolutePositioning, &seekPosition, AM_SEEKING_NoPositioning);
if (playing)
mediaControl->Run();
return 0;
}
long double Song::getTime()
{
__int64 position;
mediaSeeking->GetCurrentPosition(&position);
return (long double)(position) / (long double)10000000.0;
}
long double Song::getLength()
{
return length;
}

39
src/song.h Normal file
View File

@ -0,0 +1,39 @@
#pragma once
#pragma warning(disable:995)
#include <dshow.h>
#pragma warning(default:995)
namespace Leviathan
{
class Song
{
public:
Song();
Song(LPCWSTR path);
~Song();
int play();
int pause();
int toggle();
bool is_playing();
int seek(long double position);
long double getTime();
long double getLength();
private:
long double length;
bool playing;
IMediaControl * mediaControl;
IMediaSeeking * mediaSeeking;
IBasicAudio * audioControl;
};
}