raylib basic folders structure and some files... ;)
							
								
								
									
										22
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,22 +0,0 @@ | ||||
| # Auto detect text files and perform LF normalization | ||||
| * text=auto | ||||
|  | ||||
| # Custom for Visual Studio | ||||
| *.cs     diff=csharp | ||||
| *.sln    merge=union | ||||
| *.csproj merge=union | ||||
| *.vbproj merge=union | ||||
| *.fsproj merge=union | ||||
| *.dbproj merge=union | ||||
|  | ||||
| # Standard to msysgit | ||||
| *.doc	 diff=astextplain | ||||
| *.DOC	 diff=astextplain | ||||
| *.docx diff=astextplain | ||||
| *.DOCX diff=astextplain | ||||
| *.dot  diff=astextplain | ||||
| *.DOT  diff=astextplain | ||||
| *.pdf  diff=astextplain | ||||
| *.PDF	 diff=astextplain | ||||
| *.rtf	 diff=astextplain | ||||
| *.RTF	 diff=astextplain | ||||
							
								
								
									
										269
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,215 +1,66 @@ | ||||
| ################# | ||||
| ## Eclipse | ||||
| ################# | ||||
| # Ignore generated files | ||||
| # ... | ||||
|  | ||||
| *.pydevproject | ||||
| .project | ||||
| .metadata | ||||
| bin/ | ||||
| tmp/ | ||||
| *.tmp | ||||
| *.bak | ||||
| *.swp | ||||
| *~.nib | ||||
| local.properties | ||||
| .classpath | ||||
| .settings/ | ||||
| .loadpath | ||||
| # Ignore compiled binaries | ||||
| src/core.o | ||||
| src/shapes.o | ||||
| src/textures.o | ||||
| src/text.o | ||||
| src/models.o | ||||
| src/audio.o | ||||
| src/vector3.o | ||||
| src/stb_image.o | ||||
| src/*.exe | ||||
| examples/*.o | ||||
| examples/*.exe | ||||
|  | ||||
| # External tool builders | ||||
| .externalToolBuilders/ | ||||
|  | ||||
| # Locally stored "Eclipse launch configurations" | ||||
| *.launch | ||||
|  | ||||
| # CDT-specific | ||||
| .cproject | ||||
|  | ||||
| # PDT-specific | ||||
| .buildpath | ||||
|  | ||||
|  | ||||
| ################# | ||||
| ## Visual Studio | ||||
| ################# | ||||
|  | ||||
| ## Ignore Visual Studio temporary files, build results, and | ||||
| ## files generated by popular Visual Studio add-ons. | ||||
|  | ||||
| # User-specific files | ||||
| *.suo | ||||
| *.user | ||||
| *.sln.docstates | ||||
|  | ||||
| # Build results | ||||
|  | ||||
| [Dd]ebug/ | ||||
| [Rr]elease/ | ||||
| x64/ | ||||
| build/ | ||||
| [Bb]in/ | ||||
| [Oo]bj/ | ||||
|  | ||||
| # MSTest test Results | ||||
| [Tt]est[Rr]esult*/ | ||||
| [Bb]uild[Ll]og.* | ||||
|  | ||||
| *_i.c | ||||
| *_p.c | ||||
| *.ilk | ||||
| *.meta | ||||
| *.obj | ||||
| *.pch | ||||
| *.pdb | ||||
| *.pgc | ||||
| *.pgd | ||||
| *.rsp | ||||
| *.sbr | ||||
| *.tlb | ||||
| *.tli | ||||
| *.tlh | ||||
| *.tmp | ||||
| *.tmp_proj | ||||
| *.log | ||||
| *.vspscc | ||||
| *.vssscc | ||||
| .builds | ||||
| *.pidb | ||||
| *.log | ||||
| *.scc | ||||
|  | ||||
| # Visual C++ cache files | ||||
| ipch/ | ||||
| *.aps | ||||
| *.ncb | ||||
| *.opensdf | ||||
| *.sdf | ||||
| *.cachefile | ||||
|  | ||||
| # Visual Studio profiler | ||||
| *.psess | ||||
| *.vsp | ||||
| *.vspx | ||||
|  | ||||
| # Guidance Automation Toolkit | ||||
| *.gpState | ||||
|  | ||||
| # ReSharper is a .NET coding add-in | ||||
| _ReSharper*/ | ||||
| *.[Rr]e[Ss]harper | ||||
|  | ||||
| # TeamCity is a build add-in | ||||
| _TeamCity* | ||||
|  | ||||
| # DotCover is a Code Coverage Tool | ||||
| *.dotCover | ||||
|  | ||||
| # NCrunch | ||||
| *.ncrunch* | ||||
| .*crunch*.local.xml | ||||
|  | ||||
| # 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 | ||||
| *.Publish.xml | ||||
| *.pubxml | ||||
|  | ||||
| # NuGet Packages Directory | ||||
| ## TODO: If you have NuGet Package Restore enabled, uncomment the next line | ||||
| #packages/ | ||||
|  | ||||
| # Windows Azure Build Output | ||||
| csx | ||||
| *.build.csdef | ||||
|  | ||||
| # Windows Store app package directory | ||||
| AppPackages/ | ||||
|  | ||||
| # Others | ||||
| sql/ | ||||
| *.Cache | ||||
| ClientBin/ | ||||
| [Ss]tyle[Cc]op.* | ||||
| ~$* | ||||
| *~ | ||||
| *.dbmdl | ||||
| *.[Pp]ublish.xml | ||||
| *.pfx | ||||
| *.publishsettings | ||||
|  | ||||
| # 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 | ||||
| App_Data/*.mdf | ||||
| App_Data/*.ldf | ||||
|  | ||||
| ############# | ||||
| ## Windows detritus | ||||
| ############# | ||||
|  | ||||
| # Windows image file caches | ||||
| # Ignore thumbnails created by windows | ||||
| Thumbs.db | ||||
| ehthumbs.db | ||||
|  | ||||
| # Folder config file | ||||
| Desktop.ini | ||||
| # Ignore files build by Visual Studio | ||||
| *.obj | ||||
| *.exe | ||||
| *.pdb | ||||
| *.aps | ||||
| *.vcproj.*.user | ||||
| *.vcxproj* | ||||
| *.sln | ||||
| *.vspscc | ||||
| *_i.c | ||||
| *.i | ||||
| *.icf | ||||
| *_p.c | ||||
| *.ncb | ||||
| *.suo | ||||
| *.tlb | ||||
| *.tlh | ||||
| *.bak | ||||
| *.cache | ||||
| *.ilk | ||||
| *.log | ||||
| [Bb]in | ||||
| [Dd]ebug/ | ||||
| [Dd]ebug.win32/ | ||||
| *.sbr | ||||
| *.sdf | ||||
| obj/ | ||||
| [Rr]elease/ | ||||
| [Rr]elease.win32/ | ||||
| _ReSharper*/ | ||||
| [Tt]est[Rr]esult* | ||||
| ipch/ | ||||
| *.opensdf | ||||
|  | ||||
| # Recycle Bin used on file shares | ||||
| $RECYCLE.BIN/ | ||||
|  | ||||
| # Mac crap | ||||
| # Ignore files build by xcode | ||||
| *.mode*v* | ||||
| *.pbxuser | ||||
| *.xcbkptlist | ||||
| *.xcscheme | ||||
| *.xcworkspacedata | ||||
| *.xcuserstate | ||||
| *.xccheckout | ||||
| xcschememanagement.plist | ||||
| .DS_Store | ||||
|  | ||||
|  | ||||
| ############# | ||||
| ## Python | ||||
| ############# | ||||
|  | ||||
| *.py[co] | ||||
|  | ||||
| # Packages | ||||
| *.egg | ||||
| *.egg-info | ||||
| dist/ | ||||
| build/ | ||||
| eggs/ | ||||
| parts/ | ||||
| var/ | ||||
| sdist/ | ||||
| develop-eggs/ | ||||
| .installed.cfg | ||||
|  | ||||
| # Installer logs | ||||
| pip-log.txt | ||||
|  | ||||
| # Unit test / coverage reports | ||||
| .coverage | ||||
| .tox | ||||
|  | ||||
| #Translations | ||||
| *.mo | ||||
|  | ||||
| #Mr Developer | ||||
| .mr.developer.cfg | ||||
| ._.* | ||||
| xcuserdata/ | ||||
| DerivedData/ | ||||
							
								
								
									
										17
									
								
								CHANGELOG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,17 @@ | ||||
| changelog | ||||
| --------- | ||||
|  | ||||
| Current:	raylib 1.0 (November 2013) | ||||
|  | ||||
|  | ||||
| ------------------------------------------- | ||||
| Release: 	raylib 1.0.0 (18 November 2013) | ||||
| ------------------------------------------- | ||||
| * Initial version | ||||
| * 6 Modules provided: | ||||
| 	- core:     basic window/context creation functions, input management, timming functions | ||||
| 	- shapes:   basic shapes drawing functions | ||||
| 	- textures: image data loading and conversion to OpenGL textures | ||||
| 	- text:     text drawing, sprite fonts loading, default font loading | ||||
| 	- models:   basic 3d shapes drawing, OBJ models loading and drawing | ||||
| 	- audio:	audio device initialization, WAV files loading and playing | ||||
							
								
								
									
										39
									
								
								HELPME
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,39 @@ | ||||
| help me! | ||||
| ======== | ||||
|  | ||||
| I’m working hard on raylib but my resources are quite limited. If you enjoy raylib and want to help / contribute in some way,  | ||||
| please, [let me know][raysan5]. | ||||
|  | ||||
| The following help is highly appreciated: | ||||
|  | ||||
| 	- C programming - Can you write / review / test / improve the code?  | ||||
| 	- Translators / Localizators - Can you translate raylib to another language? | ||||
| 	- Documentation / Tutorials / Example writters - Can you write some tutorial / example? | ||||
| 	- Web Development (I need a lot of help with this...) - Can you help with the web? | ||||
| 	- Porting to Linux and OSX - Can you compile and test raylib on another OS? | ||||
| 	- Testers of current features and multiple systems - Can you find some bug on raylib? | ||||
|  | ||||
| If you can not help on any of the above points but you still want to contribute in some way... please, consider helping  | ||||
| with a small donation (just some euros...). It will really motivate to continue improving this project (and pay some bills… or some coffee). | ||||
|  | ||||
| [Donation Page] (www.raylib.com/helpme.htm) | ||||
|  | ||||
| raylib philosophy | ||||
| ------------------ | ||||
|  | ||||
|    * raylib is a tool to LEARN videogames programming, every single function in raylib should be a tutorial on itself. | ||||
|    * raylib is SIMPLE and EASY-TO-USE, I tried to keep it compact with a small set of functions, if a function is too complex or  | ||||
| 	 has not a clear usefulness, better not to include it. | ||||
|    * raylib is open source and free; educators and institutions can use this tool to TEACH videogames programming completely by free.  | ||||
|    * raylib is, hopefully, collaborative; contribution of tutorials / code-examples / bugs-solving / code-comments are highly appreciated. | ||||
|    * raylib's license (and its external libs respective licenses) allow using it for commercial products. | ||||
|  | ||||
| contact | ||||
| ------- | ||||
|  | ||||
|    * Webpage: [http://www.raylib.com](http://www.raylib.com) | ||||
|    * Twitter: [http://www.twitter.com/raysan5](http://www.twitter.com/raysan5) | ||||
|    * Facebook: [http://www.facebook.com/raylibgames](http://www.facebook.com/raylibgames) | ||||
|  | ||||
|     | ||||
| [raysan5]: mailto:raysan@raysanweb.com "Ramon Santamaria - Ray San" | ||||
							
								
								
									
										30
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,30 @@ | ||||
| license | ||||
| ======= | ||||
|  | ||||
| source code | ||||
| ----------- | ||||
|  | ||||
| raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified,  | ||||
| BSD-like license that allows static linking with closed source software: | ||||
| 	 | ||||
| Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
|  | ||||
| This software is provided "as-is", without any express or implied warranty. In no event  | ||||
| will the authors be held liable for any damages arising from the use of this software. | ||||
|  | ||||
| Permission is granted to anyone to use this software for any purpose, including commercial  | ||||
| applications, and to alter it and redistribute it freely, subject to the following restrictions: | ||||
|  | ||||
|   1. The origin of this software must not be misrepresented; you must not claim that you  | ||||
|   wrote the original software. If you use this software in a product, an acknowledgment  | ||||
|   in the product documentation would be appreciated but is not required. | ||||
|  | ||||
|   2. Altered source versions must be plainly marked as such, and must not be misrepresented | ||||
|   as being the original software. | ||||
|  | ||||
|   3. This notice may not be removed or altered from any source distribution. | ||||
|  | ||||
| fonts | ||||
| ------ | ||||
|  | ||||
| ...soon... | ||||
							
								
								
									
										115
									
								
								README
									
									
									
									
									
								
							
							
						
						| @@ -1,2 +1,115 @@ | ||||
|  | ||||
| It's empy here... | ||||
| <img src="http://www.raylib.com/favicon.ico" width=256> | ||||
|  | ||||
| raylib | ||||
| ======= | ||||
|  | ||||
| about | ||||
| ----- | ||||
|  | ||||
| raylib is a simple and easy-to-use library to learn C videogames programming. | ||||
|  | ||||
| raylib is highly inspired by Borland BGI graphics lib (more specifically WinBGI) and by XNA framework.  | ||||
| Allegro and SDL have also been analyzed for reference. | ||||
|  | ||||
| Want to see how easy is making games with raylib? Jump to [code examples!] (http://www.raylib.com/examples.htm) | ||||
|  | ||||
| history | ||||
| ------- | ||||
|  | ||||
| I've developed videogames for some years and last year I had to taught videogames development  | ||||
| to young people with artistic profile, most of them had never written a single line of code. | ||||
|  | ||||
| I started with C language basis and, after searching for the most simple and easy-to-use library to teach  | ||||
| videogames programming, I found WinBGI; it was great and it worked very well with students, in just a  | ||||
| couple of weeks that people that had never written a single line of code were able to program (and understand)  | ||||
| a simple PONG and some of them even a BREAKOUT! | ||||
|  | ||||
| But WinBGI was not the clearer and most organized lib. There were a lot of things I found useless and  | ||||
| confusing and some function names were not clear enough for most of the students; not to mention points  | ||||
| like no transparencies support or no hardware acceleration.  | ||||
|  | ||||
| So, I decided to create my own lib, hardware accelerated, clear function names, quite organized, well structured,  | ||||
| plain C coding and, the most important, primarily intended to LEARN videogames programming. | ||||
|  | ||||
| I've coded quite a lot in C# and XNA and I really love it (in fact, my students learn C# with XNA after C),  | ||||
| so, I decided to use C# language notation and XNA naming conventions. That way, students can jump from  | ||||
| raylib to XNA (or MonoGame) extremely easily. | ||||
|  | ||||
| raylib started as a weekend project and after three months of hard work, here it is the first version.  | ||||
|  | ||||
| Enjoy it. | ||||
|  | ||||
| features | ||||
| -------- | ||||
|  | ||||
|    * Written in plain C code (C99) | ||||
|    * Uses C# PascalCase/camelCase notation | ||||
|    * Hardware accelerated using OpenGL 1.1 | ||||
|    * Transparencies support (RGBA Colors) | ||||
|    * Custom color palette for better use on white background | ||||
|    * Basic 3D Support (camera, basic models, OBJ models, etc) | ||||
|    * Powerful Text module with SpriteFonts support | ||||
|  | ||||
| raylib uses on its core module the outstanding [GLFW3] (http://glfw.org/) library. The best option by far I found for  | ||||
| window/context and input management (clean, focused, great license, well documented, modern, ...).  | ||||
|  | ||||
| raylib is licensed under a zlib/libpng license like GLFW3. View [LICENSE] (link to license file). | ||||
|  | ||||
| tool requirements | ||||
| ------------------ | ||||
|  | ||||
| raylib has been developed using exclusively two tools:  | ||||
|  | ||||
|    * Notepad++ (text editor) - [http://notepad-plus-plus.org/](http://notepad-plus-plus.org/) | ||||
|    * MinGW (GCC compiler) - [http://www.mingw.org/](http://www.mingw.org/) | ||||
|     | ||||
| Those are the tools I recommended to develop with raylib, actually, my students develop using this tools.  | ||||
| I believe those are the best tools to train spartan-programmers. | ||||
|  | ||||
| Someone could argue about debugging. raylib is a library intended for learning and I think C it's a clear enough language | ||||
| to allow writing small-mid size programs with a printf-based debugging. All raylib examples have also been written this way. | ||||
|  | ||||
| building | ||||
| -------- | ||||
|  | ||||
| raylib could be build with the following command lines (Using GCC compiler): | ||||
|  | ||||
| 	cd raylib/src | ||||
| 	gcc -c core.c -std=c99 -Wall | ||||
| 	gcc -c shapes.c -std=c99 -Wall | ||||
| 	gcc -c textures.c -std=c99 -Wall | ||||
| 	gcc -c stb_image.c -std=c99 -Wall | ||||
| 	gcc -c text.c -std=c99 -Wall | ||||
| 	gcc -c models.c -std=c99 -Wall | ||||
| 	gcc -c vector3.c -std=c99 -Wall | ||||
| 	gcc -c audio.c -std=c99 -Wall | ||||
| 	ar rcs raylib.a core.o shapes.o textures.o stb_image.o text.o models.o vector3.o audio.o | ||||
|  | ||||
| To compile examples, make sure raylib.h is placed in include path and libraries raylib (libraylib.a) and glfw3 (libglfw3.a)  | ||||
| are placed in the libraries path. It's also recommended to link with file icon.o for fancy raylib icon usage. | ||||
|  | ||||
| 	cd raylib/src/examples | ||||
| 	gcc -o test_code.exe test_code.c icon.o -lraylib -lglfw3 -lopengl32 -lgdi32 -std=c99 -Wl,--subsystem,windows | ||||
|  | ||||
| contact | ||||
| ------- | ||||
|  | ||||
|    * Webpage: [http://www.raylib.com](http://www.raylib.com) | ||||
|    * Twitter: [http://www.twitter.com/raysan5](http://www.twitter.com/raysan5) | ||||
|    * Facebook: [http://www.facebook.com/raylibgames](http://www.facebook.com/raylibgames) | ||||
|  | ||||
| If you are using raylib and you enjoy it, please, [let me know][raysan5]. | ||||
|  | ||||
| If you feel you can help, then, [helpme!] (http://www.raylib.com/helpme.htm) | ||||
|  | ||||
| acknowledgments | ||||
| --------------- | ||||
|  | ||||
| The following people have contributed in some way to make raylib project a reality. Big thanks to them! | ||||
|  | ||||
|  - Zopokx | ||||
|  - Elendow | ||||
|  | ||||
| 	 | ||||
| [raysan5]: mailto:raysan@raysanweb.com "Ramon Santamaria - Ray San" | ||||
							
								
								
									
										22
									
								
								ROADMAP
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,22 @@ | ||||
| roadmap | ||||
| ======= | ||||
|  | ||||
| First version of raylib is quite complete and functional but there is still a lot of things I would like to improve. | ||||
| Here it is a list of features I would like to add and functions to improve. | ||||
|  | ||||
| Around the source code there are some TODO points with pending revisions/bugs and ere it is a list of features I would like to add. | ||||
|  | ||||
| raylib v1.x | ||||
|  | ||||
|    - Review Billboard Drawing functions | ||||
|    - Review Heightmap Loading and Drawing functions | ||||
|    - Lighting support (only 3d mode) - CreateLight() | ||||
|    - Simple Collision Detection functions - CheckCollisionRects(), CheckCollisionCircles() | ||||
|    - Default scene Camera controls (zoom, pan, rotate)    | ||||
|    - Basic Procedural Texture / Image generation (Gradient, Checked, Spot, Noise, Cellular) | ||||
|    - Software mipmapping generation and POT conversion (custom implementation) | ||||
|    - Comments / Functions translation (?) | ||||
|     | ||||
| Any feature missing? Do you have a request? [Let me know!][raysan5] | ||||
|  | ||||
| [raysan5]: mailto:raysan@raysanweb.com "Ramon Santamaria - Ray San" | ||||
							
								
								
									
										50
									
								
								examples/ex01_basic_window.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,50 @@ | ||||
| /******************************************************************************************* | ||||
| * | ||||
| *	raylib example 01 - Basic Window | ||||
| * | ||||
| *	This example has been created using raylib 1.0 (www.raylib.com) | ||||
| *	raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| * | ||||
| ********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| int main() | ||||
| { | ||||
| 	int screenWidth = 800; | ||||
| 	int screenHeight = 450; | ||||
| 	 | ||||
| 	// Initialization | ||||
| 	//--------------------------------------------------------- | ||||
| 	InitWindow(screenWidth, screenHeight, "raylib example 01a - basic window");		// Window and context initialization | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     // Main game loop | ||||
|     while (!WindowShouldClose())	// Detect window close button or ESC key | ||||
|     { | ||||
| 		// Update | ||||
| 		//----------------------------------------------------- | ||||
| 		// TODO: Update your variables here | ||||
| 		//----------------------------------------------------- | ||||
| 		 | ||||
| 		// Draw | ||||
| 		//----------------------------------------------------- | ||||
| 		BeginDrawing(); | ||||
| 		 | ||||
| 			ClearBackground(RAYWHITE); | ||||
| 			 | ||||
| 			DrawText("Congrats! You created your first window!", 190, 200, 20, 1, LIGHTGRAY); | ||||
| 		 | ||||
|         EndDrawing(); | ||||
| 		//----------------------------------------------------- | ||||
|     } | ||||
|  | ||||
| 	// De-Initialization | ||||
| 	//--------------------------------------------------------- | ||||
|     CloseWindow();		// Close window and OpenGL context | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								examples/ex01_basic_window.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 10 KiB | 
							
								
								
									
										54
									
								
								examples/ex02a_logo_raylib.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,54 @@ | ||||
| /******************************************************************************************* | ||||
| * | ||||
| *	raylib example 02a - Draw raylib logo  | ||||
| * | ||||
| *	This example has been created using raylib 1.0 (www.raylib.com) | ||||
| *	raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| * | ||||
| ********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| int main() | ||||
| { | ||||
| 	int screenWidth = 800; | ||||
| 	int screenHeight = 450; | ||||
| 	 | ||||
| 	// Initialization | ||||
| 	//--------------------------------------------------------- | ||||
| 	InitWindow(screenWidth, screenHeight, "raylib example 02a - raylib logo");	// Window and context initialization | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     // Main game loop | ||||
|     while (!WindowShouldClose())	// Detect window close button or ESC key | ||||
|     { | ||||
| 		// Update | ||||
| 		//----------------------------------------------------- | ||||
| 		// TODO: Update your variables here | ||||
| 		//----------------------------------------------------- | ||||
| 		 | ||||
| 		// Draw | ||||
| 		//----------------------------------------------------- | ||||
| 		BeginDrawing(); | ||||
| 		 | ||||
| 			ClearBackground(RAYWHITE); | ||||
| 			 | ||||
| 			DrawRectangle(screenWidth/2 - 128, screenHeight/2 - 128, 256, 256, BLACK); | ||||
| 			DrawRectangle(screenWidth/2 - 112, screenHeight/2 - 112, 224, 224, RAYWHITE); | ||||
| 			DrawText("raylib", 356, 273, 50, 1, BLACK); | ||||
| 			 | ||||
| 			DrawText("this is NOT a texture!", 350, 370, 10, 1, GRAY); | ||||
| 		 | ||||
|         EndDrawing(); | ||||
| 		//----------------------------------------------------- | ||||
|     } | ||||
|  | ||||
| 	// De-Initialization | ||||
| 	//--------------------------------------------------------- | ||||
|     CloseWindow();		// Close window and OpenGL context | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								examples/ex02a_logo_raylib.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 12 KiB | 
							
								
								
									
										73
									
								
								examples/ex02b_shapes.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,73 @@ | ||||
| /******************************************************************************************* | ||||
| * | ||||
| *	raylib example 02b - Draw basic shapes 2d (rectangle, circle, line...) | ||||
| * | ||||
| *	This example has been created using raylib 1.0 (www.raylib.com) | ||||
| *	raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| * | ||||
| ********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| int main() | ||||
| { | ||||
| 	int screenWidth = 800; | ||||
| 	int screenHeight = 450; | ||||
| 	 | ||||
| 	// Initialization | ||||
| 	//--------------------------------------------------------- | ||||
| 	InitWindow(screenWidth, screenHeight, "raylib example 02b - basic shapes drawing");	// Window and context initialization | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     // Main game loop | ||||
|     while (!WindowShouldClose())	// Detect window close button or ESC key | ||||
|     { | ||||
| 		// Update | ||||
| 		//----------------------------------------------------- | ||||
| 		// TODO: Update your variables here | ||||
| 		//----------------------------------------------------- | ||||
| 		 | ||||
| 		// Draw | ||||
| 		//----------------------------------------------------- | ||||
| 		BeginDrawing(); | ||||
| 		 | ||||
| 			ClearBackground(RAYWHITE); | ||||
| 			 | ||||
| 			// TODO: draw some shapes... with names... :P | ||||
| /*			 | ||||
| 			void DrawPixel(int posX, int posY, Color color);													// Draw a pixel | ||||
| 			void DrawPixelV(Vector2 position, Color color);														// Draw a pixel (Vector version) | ||||
| 			void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color);					// Draw a line | ||||
| 			void DrawLineV(Vector2 startPos, Vector2 endPos, Color color);										// Draw a line (Vector version) | ||||
| 			void DrawCircle(int centerX, int centerY, float radius, Color color);								// Draw a color-filled circle | ||||
| 			void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2);		// Draw a gradient-filled circle | ||||
| 			void DrawCircleV(Vector2 center, float radius, Color color);										// Draw a color-filled circle (Vector version) | ||||
| 			void DrawCircleLines(int centerX, int centerY, float radius, Color color);							// Draw circle outline | ||||
| 			void DrawRectangle(int posX, int posY, int width, int height, Color color);							// Draw a color-filled rectangle | ||||
| 			void DrawRectangleRec(Rectangle rec, Color color);													// Draw a color-filled rectangle | ||||
| 			void DrawRectangleGradient(int posX, int posY, int width, int height, Color color1, Color color2);	// Draw a gradient-filled rectangle | ||||
| 			void DrawRectangleV(Vector2 position, Vector2 size, Color color);									// Draw a color-filled rectangle (Vector version) | ||||
| 			void DrawRectangleLines(int posX, int posY, int width, int height, Color color);					// Draw rectangle outline | ||||
| 			void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color);									// Draw a color-filled triangle | ||||
| 			void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color);							// Draw triangle outline | ||||
| 			void DrawPoly(Vector2 *points, int numPoints, Color color);											// Draw a closed polygon defined by points | ||||
| 			void DrawPolyLine(Vector2 *points, int numPoints, Color color);										// Draw polygon lines | ||||
| */			 | ||||
| 			DrawRectangle(screenWidth/4 - 50, screenHeight/2 - 100, 100, 100, GOLD); | ||||
| 			DrawCircle(3*screenWidth/4, screenHeight/2 - 50, 50, MAROON); | ||||
| 			 | ||||
| 			DrawText("_____", 320, 280, 50, 1, BLACK); | ||||
| 		 | ||||
|         EndDrawing(); | ||||
| 		//----------------------------------------------------- | ||||
|     } | ||||
|  | ||||
| 	// De-Initialization | ||||
| 	//--------------------------------------------------------- | ||||
|     CloseWindow();		// Close window and OpenGL context | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										95
									
								
								examples/ex02c_color_palette.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,95 @@ | ||||
| /******************************************************************************************* | ||||
| * | ||||
| *	raylib example 02c - Draw raylib custom color palette | ||||
| * | ||||
| *	This example has been created using raylib 1.0 (www.raylib.com) | ||||
| *	raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| * | ||||
| ********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| int main() | ||||
| { | ||||
| 	int screenWidth = 800; | ||||
| 	int screenHeight = 450; | ||||
| 	 | ||||
| 	// Initialization | ||||
| 	//--------------------------------------------------------- | ||||
| 	InitWindow(screenWidth, screenHeight, "raylib example 02c - raylib color palette");	// Window and context initialization | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     // Main game loop | ||||
|     while (!WindowShouldClose())	// Detect window close button or ESC key | ||||
|     { | ||||
| 		// Update | ||||
| 		//----------------------------------------------------- | ||||
| 		// TODO: Update your variables here | ||||
| 		//----------------------------------------------------- | ||||
| 		 | ||||
| 		// Draw | ||||
| 		//----------------------------------------------------- | ||||
| 		BeginDrawing(); | ||||
| 		 | ||||
| 			ClearBackground(RAYWHITE); | ||||
| 			 | ||||
| 			DrawText("raylib color palette", 28, 42, 20, 2, BLACK); | ||||
| 			 | ||||
| 			DrawRectangle(26, 80, 100, 100, DARKGRAY); | ||||
| 			DrawRectangle(26, 188, 100, 100, GRAY); | ||||
| 			DrawRectangle(26, 296, 100, 100, LIGHTGRAY); | ||||
| 			DrawRectangle(134, 80, 100, 100, MAROON); | ||||
| 			DrawRectangle(134, 188, 100, 100, RED); | ||||
| 			DrawRectangle(134, 296, 100, 100, PINK); | ||||
| 			DrawRectangle(242, 80, 100, 100, ORANGE); | ||||
| 			DrawRectangle(242, 188, 100, 100, GOLD); | ||||
| 			DrawRectangle(242, 296, 100, 100, YELLOW); | ||||
| 			DrawRectangle(350, 80, 100, 100, DARKGREEN); | ||||
| 			DrawRectangle(350, 188, 100, 100, LIME); | ||||
| 			DrawRectangle(350, 296, 100, 100, GREEN); | ||||
| 			DrawRectangle(458, 80, 100, 100, DARKBLUE); | ||||
| 			DrawRectangle(458, 188, 100, 100, BLUE); | ||||
| 			DrawRectangle(458, 296, 100, 100, SKYBLUE); | ||||
| 			DrawRectangle(566, 80, 100, 100, DARKPURPLE); | ||||
| 			DrawRectangle(566, 188, 100, 100, VIOLET); | ||||
| 			DrawRectangle(566, 296, 100, 100, PURPLE); | ||||
| 			DrawRectangle(674, 80, 100, 100, DARKBROWN); | ||||
| 			DrawRectangle(674, 188, 100, 100, BROWN); | ||||
| 			DrawRectangle(674, 296, 100, 100, BEIGE); | ||||
|  | ||||
| 			 | ||||
| 			DrawText("DARKGRAY", 57, 166, 10, 2, BLACK); | ||||
| 			DrawText("GRAY", 89, 274, 10, 2, BLACK); | ||||
| 			DrawText("LIGHTGRAY", 51, 382, 10, 2, BLACK); | ||||
| 			DrawText("MAROON", 180, 166, 10, 2, BLACK); | ||||
| 			DrawText("RED", 207, 274, 10, 2, BLACK); | ||||
| 			DrawText("PINK", 200, 382, 10, 2, BLACK); | ||||
| 			DrawText("ORANGE", 290, 166, 10, 2, BLACK); | ||||
| 			DrawText("GOLD", 306, 274, 10, 2, BLACK); | ||||
| 			DrawText("YELLOW", 290, 382, 10, 2, BLACK); | ||||
| 			DrawText("DARKGREEN", 374, 166, 10, 2, BLACK); | ||||
| 			DrawText("LIME", 417, 274, 10, 2, BLACK); | ||||
| 			DrawText("GREEN", 407, 382, 10, 2, BLACK); | ||||
| 			DrawText("DARKBLUE", 491, 166, 10, 2, BLACK); | ||||
| 			DrawText("BLUE", 523, 274, 10, 2, BLACK); | ||||
| 			DrawText("SKYBLUE", 499, 382, 10, 2, BLACK); | ||||
| 			DrawText("DARKPURPLE", 582, 166, 10, 2, BLACK); | ||||
| 			DrawText("VIOLET", 617, 274, 10, 2, BLACK); | ||||
| 			DrawText("PURPLE", 615, 382, 10, 2, BLACK); | ||||
| 			DrawText("DARKBROWN", 695, 166, 10, 2, BLACK); | ||||
| 			DrawText("BROWN", 728, 274, 10, 2, BLACK); | ||||
| 			DrawText("BEIGE", 733, 382, 10, 2, BLACK); | ||||
| 		 | ||||
|         EndDrawing(); | ||||
| 		//----------------------------------------------------- | ||||
|     } | ||||
|  | ||||
| 	// De-Initialization | ||||
| 	//--------------------------------------------------------- | ||||
|     CloseWindow();		// Close window and OpenGL context | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								examples/ex02c_color_palette.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 18 KiB | 
							
								
								
									
										57
									
								
								examples/ex03a_input_keys.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,57 @@ | ||||
| /******************************************************************************************* | ||||
| * | ||||
| *	raylib example 03a - Keyboard input  | ||||
| * | ||||
| *	This example has been created using raylib 1.0 (www.raylib.com) | ||||
| *	raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| * | ||||
| ********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| int main() | ||||
| { | ||||
| 	int screenWidth = 800; | ||||
| 	int screenHeight = 450; | ||||
| 	 | ||||
| 	Vector2 ballPosition = { screenWidth/2, screenHeight/2 }; | ||||
| 	 | ||||
| 	// Initialization | ||||
| 	//--------------------------------------------------------- | ||||
| 	InitWindow(screenWidth, screenHeight, "raylib example 05 - keyboard input");	// Window and context initialization | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     // Main game loop | ||||
|     while (!WindowShouldClose())	// Detect window close button or ESC key | ||||
|     { | ||||
| 		// Update | ||||
| 		//----------------------------------------------------- | ||||
| 		if (IsKeyPressed(KEY_RIGHT)) ballPosition.x += 0.8; | ||||
| 		if (IsKeyPressed(KEY_LEFT)) ballPosition.x -= 0.8; | ||||
| 		if (IsKeyPressed(KEY_UP)) ballPosition.y -= 0.8; | ||||
| 		if (IsKeyPressed(KEY_DOWN)) ballPosition.y += 0.8; | ||||
| 		//----------------------------------------------------- | ||||
| 		 | ||||
| 		// Draw | ||||
| 		//----------------------------------------------------- | ||||
| 		BeginDrawing(); | ||||
| 		 | ||||
| 			ClearBackground(RAYWHITE); | ||||
| 			 | ||||
| 			DrawText("move the ball with arrow keys", 10, 10, 20, 1, DARKGRAY); | ||||
| 			 | ||||
| 			DrawCircleV(ballPosition, 50, MAROON); | ||||
| 		 | ||||
|         EndDrawing(); | ||||
| 		//----------------------------------------------------- | ||||
|     } | ||||
|  | ||||
| 	// De-Initialization | ||||
| 	//--------------------------------------------------------- | ||||
|     CloseWindow();		// Close window and OpenGL context | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								examples/ex03a_input_keys.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 10 KiB | 
							
								
								
									
										63
									
								
								examples/ex03b_input_mouse.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,63 @@ | ||||
| /******************************************************************************************* | ||||
| * | ||||
| *	raylib example 03b - Mouse input  | ||||
| * | ||||
| *	This example has been created using raylib 1.0 (www.raylib.com) | ||||
| *	raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| * | ||||
| ********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| int main() | ||||
| { | ||||
| 	int screenWidth = 800; | ||||
| 	int screenHeight = 450; | ||||
| 	 | ||||
| 	Vector2 ballPosition = { -100.0, -100.0 }; | ||||
| 	int counter = 0; | ||||
| 	int mouseX, mouseY; | ||||
| 	 | ||||
| 	// Initialization | ||||
| 	//--------------------------------------------------------- | ||||
| 	InitWindow(screenWidth, screenHeight, "raylib example 06 - mouse input");	// Window and context initialization | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     // Main game loop | ||||
|     while (!WindowShouldClose())	// Detect window close button or ESC key | ||||
|     { | ||||
| 		// Update | ||||
| 		//----------------------------------------------------- | ||||
| 		if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) | ||||
| 		{ | ||||
| 			mouseX = GetMouseX(); | ||||
| 			mouseY = GetMouseY(); | ||||
| 			 | ||||
| 			ballPosition.x = (float)mouseX; | ||||
| 			ballPosition.y = (float)mouseY; | ||||
| 		} | ||||
| 		//----------------------------------------------------- | ||||
| 		 | ||||
| 		// Draw | ||||
| 		//----------------------------------------------------- | ||||
| 		BeginDrawing(); | ||||
| 		 | ||||
| 			ClearBackground(RAYWHITE); | ||||
| 			 | ||||
| 			DrawCircleV(ballPosition, 40, GOLD); | ||||
| 			 | ||||
| 			DrawText("mouse click to draw the ball", 10, 10, 20, 1, DARKGRAY); | ||||
| 		 | ||||
|         EndDrawing(); | ||||
| 		//----------------------------------------------------- | ||||
|     } | ||||
|  | ||||
| 	// De-Initialization | ||||
| 	//--------------------------------------------------------- | ||||
|     CloseWindow();		// Close window and OpenGL context | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								examples/ex03b_input_mouse.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 10 KiB | 
							
								
								
									
										67
									
								
								examples/ex03c_input_gamepad.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,67 @@ | ||||
| /******************************************************************************************* | ||||
| * | ||||
| *	raylib example 03c - Gamepad input | ||||
| * | ||||
| *	This example has been created using raylib 1.0 (www.raylib.com) | ||||
| *	raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| * | ||||
| ********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| int main() | ||||
| { | ||||
| 	int screenWidth = 800; | ||||
| 	int screenHeight = 450; | ||||
| 	 | ||||
| 	Vector2 ballPosition = { screenWidth/2, screenHeight/2 }; | ||||
| 	Vector2 gamepadMove = { 0, 0 }; | ||||
| 	 | ||||
| 	// Initialization | ||||
| 	//--------------------------------------------------------- | ||||
| 	InitWindow(screenWidth, screenHeight, "raylib example 01 - gamepad input");	// Window and context initialization | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     // Main game loop | ||||
|     while (!WindowShouldClose())	// Detect window close button or ESC key | ||||
|     { | ||||
| 		// Update | ||||
| 		//----------------------------------------------------- | ||||
| 		if (IsGamepadAvailable(GAMEPAD_PLAYER1)) | ||||
| 		{ | ||||
| 			gamepadMove = GetGamepadMovement(GAMEPAD_PLAYER1); | ||||
| 			 | ||||
| 			ballPosition.x += gamepadMove.x; | ||||
| 			ballPosition.y -= gamepadMove.y; | ||||
| 		 | ||||
| 			if (IsGamepadButtonPressed(GAMEPAD_PLAYER1, GAMEPAD_BUTTON_A)) | ||||
| 			{ | ||||
| 				ballPosition.x = screenWidth/2; | ||||
| 				ballPosition.y = screenHeight/2; | ||||
| 			} | ||||
| 		} | ||||
| 		//----------------------------------------------------- | ||||
| 		 | ||||
| 		// Draw | ||||
| 		//----------------------------------------------------- | ||||
| 		BeginDrawing(); | ||||
| 		 | ||||
| 			ClearBackground(RAYWHITE); | ||||
| 			 | ||||
| 			DrawText("move the ball with gamepad", 10, 10, 20, 1, DARKGRAY); | ||||
| 			 | ||||
| 			DrawCircleV(ballPosition, 50, MAROON); | ||||
| 		 | ||||
|         EndDrawing(); | ||||
| 		//----------------------------------------------------- | ||||
|     } | ||||
|  | ||||
| 	// De-Initialization | ||||
| 	//--------------------------------------------------------- | ||||
|     CloseWindow();		// Close window and OpenGL context | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								examples/ex03c_input_gamepad.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										57
									
								
								examples/ex04a_textures.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,57 @@ | ||||
| /******************************************************************************************* | ||||
| * | ||||
| *	raylib example 04a - Texture loading and drawing  | ||||
| * | ||||
| *	This example has been created using raylib 1.0 (www.raylib.com) | ||||
| *	raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| * | ||||
| ********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| int main() | ||||
| { | ||||
| 	int screenWidth = 800; | ||||
| 	int screenHeight = 450; | ||||
| 	 | ||||
| 	// Initialization | ||||
| 	//--------------------------------------------------------- | ||||
| 	InitWindow(screenWidth, screenHeight, "raylib example 04a - texture loading and drawing");	// Window and context initialization | ||||
| 	 | ||||
| 	// NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) | ||||
| 	Texture2D texture = LoadTexture("resources/raylib_logo.png");		// Texture loading | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     // Main game loop | ||||
|     while (!WindowShouldClose())	// Detect window close button or ESC key | ||||
|     { | ||||
| 		// Update | ||||
| 		//----------------------------------------------------- | ||||
| 		// TODO: Update your variables here | ||||
| 		//----------------------------------------------------- | ||||
| 		 | ||||
| 		// Draw | ||||
| 		//----------------------------------------------------- | ||||
| 		BeginDrawing(); | ||||
| 		 | ||||
| 			ClearBackground(RAYWHITE); | ||||
| 			 | ||||
| 			DrawTexture(texture, screenWidth/2 - texture.width/2, screenHeight/2 - texture.height/2, WHITE); | ||||
| 			 | ||||
| 			DrawText("this IS a texture!", 360, 370, 10, 1, GRAY); | ||||
| 		 | ||||
|         EndDrawing(); | ||||
| 		//----------------------------------------------------- | ||||
|     } | ||||
|  | ||||
| 	// De-Initialization | ||||
| 	//--------------------------------------------------------- | ||||
| 	UnloadTexture(texture);		// Texture unloading | ||||
| 	 | ||||
|     CloseWindow();				// Close window and OpenGL context | ||||
| 	//---------------------------------------------------------- | ||||
| 	 | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								examples/ex04a_textures.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 15 KiB | 
							
								
								
									
										
											BIN
										
									
								
								examples/resources/catsham.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 308 KiB | 
							
								
								
									
										
											BIN
										
									
								
								examples/resources/catwhite.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 302 KiB | 
							
								
								
									
										
											BIN
										
									
								
								examples/resources/coin.wav
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								examples/resources/raylib_logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								examples/resources/spring.wav
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2269
									
								
								external/glfw3/include/GLFW/glfw3.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								external/glfw3/lib/libglfw3.a
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										656
									
								
								external/openal_soft/include/AL/al.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,656 @@ | ||||
| #ifndef AL_AL_H | ||||
| #define AL_AL_H | ||||
|  | ||||
| #if defined(__cplusplus) | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_API | ||||
|  #if defined(AL_LIBTYPE_STATIC) | ||||
|   #define AL_API | ||||
|  #elif defined(_WIN32) | ||||
|   #define AL_API __declspec(dllimport) | ||||
|  #else | ||||
|   #define AL_API extern | ||||
|  #endif | ||||
| #endif | ||||
|  | ||||
| #if defined(_WIN32) | ||||
|  #define AL_APIENTRY __cdecl | ||||
| #else | ||||
|  #define AL_APIENTRY | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** Deprecated macro. */ | ||||
| #define OPENAL | ||||
| #define ALAPI                                    AL_API | ||||
| #define ALAPIENTRY                               AL_APIENTRY | ||||
| #define AL_INVALID                               (-1) | ||||
| #define AL_ILLEGAL_ENUM                          AL_INVALID_ENUM | ||||
| #define AL_ILLEGAL_COMMAND                       AL_INVALID_OPERATION | ||||
|  | ||||
| /** Supported AL version. */ | ||||
| #define AL_VERSION_1_0 | ||||
| #define AL_VERSION_1_1 | ||||
|  | ||||
| /** 8-bit boolean */ | ||||
| typedef char ALboolean; | ||||
|  | ||||
| /** character */ | ||||
| typedef char ALchar; | ||||
|  | ||||
| /** signed 8-bit 2's complement integer */ | ||||
| typedef signed char ALbyte; | ||||
|  | ||||
| /** unsigned 8-bit integer */ | ||||
| typedef unsigned char ALubyte; | ||||
|  | ||||
| /** signed 16-bit 2's complement integer */ | ||||
| typedef short ALshort; | ||||
|  | ||||
| /** unsigned 16-bit integer */ | ||||
| typedef unsigned short ALushort; | ||||
|  | ||||
| /** signed 32-bit 2's complement integer */ | ||||
| typedef int ALint; | ||||
|  | ||||
| /** unsigned 32-bit integer */ | ||||
| typedef unsigned int ALuint; | ||||
|  | ||||
| /** non-negative 32-bit binary integer size */ | ||||
| typedef int ALsizei; | ||||
|  | ||||
| /** enumerated 32-bit value */ | ||||
| typedef int ALenum; | ||||
|  | ||||
| /** 32-bit IEEE754 floating-point */ | ||||
| typedef float ALfloat; | ||||
|  | ||||
| /** 64-bit IEEE754 floating-point */ | ||||
| typedef double ALdouble; | ||||
|  | ||||
| /** void type (for opaque pointers only) */ | ||||
| typedef void ALvoid; | ||||
|  | ||||
|  | ||||
| /* Enumerant values begin at column 50. No tabs. */ | ||||
|  | ||||
| /** "no distance model" or "no buffer" */ | ||||
| #define AL_NONE                                  0 | ||||
|  | ||||
| /** Boolean False. */ | ||||
| #define AL_FALSE                                 0 | ||||
|  | ||||
| /** Boolean True. */ | ||||
| #define AL_TRUE                                  1 | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Relative source. | ||||
|  * Type:    ALboolean | ||||
|  * Range:   [AL_TRUE, AL_FALSE] | ||||
|  * Default: AL_FALSE | ||||
|  * | ||||
|  * Specifies if the Source has relative coordinates. | ||||
|  */ | ||||
| #define AL_SOURCE_RELATIVE                       0x202 | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Inner cone angle, in degrees. | ||||
|  * Type:    ALint, ALfloat | ||||
|  * Range:   [0 - 360] | ||||
|  * Default: 360 | ||||
|  * | ||||
|  * The angle covered by the inner cone, where the source will not attenuate. | ||||
|  */ | ||||
| #define AL_CONE_INNER_ANGLE                      0x1001 | ||||
|  | ||||
| /** | ||||
|  * Outer cone angle, in degrees. | ||||
|  * Range:   [0 - 360] | ||||
|  * Default: 360 | ||||
|  * | ||||
|  * The angle covered by the outer cone, where the source will be fully | ||||
|  * attenuated. | ||||
|  */ | ||||
| #define AL_CONE_OUTER_ANGLE                      0x1002 | ||||
|  | ||||
| /** | ||||
|  * Source pitch. | ||||
|  * Type:    ALfloat | ||||
|  * Range:   [0.5 - 2.0] | ||||
|  * Default: 1.0 | ||||
|  * | ||||
|  * A multiplier for the frequency (sample rate) of the source's buffer. | ||||
|  */ | ||||
| #define AL_PITCH                                 0x1003 | ||||
|  | ||||
| /** | ||||
|  * Source or listener position. | ||||
|  * Type:    ALfloat[3], ALint[3] | ||||
|  * Default: {0, 0, 0} | ||||
|  * | ||||
|  * The source or listener location in three dimensional space. | ||||
|  * | ||||
|  * OpenAL, like OpenGL, uses a right handed coordinate system, where in a | ||||
|  * frontal default view X (thumb) points right, Y points up (index finger), and | ||||
|  * Z points towards the viewer/camera (middle finger). | ||||
|  * | ||||
|  * To switch from a left handed coordinate system, flip the sign on the Z | ||||
|  * coordinate. | ||||
|  */ | ||||
| #define AL_POSITION                              0x1004 | ||||
|  | ||||
| /** | ||||
|  * Source direction. | ||||
|  * Type:    ALfloat[3], ALint[3] | ||||
|  * Default: {0, 0, 0} | ||||
|  * | ||||
|  * Specifies the current direction in local space. | ||||
|  * A zero-length vector specifies an omni-directional source (cone is ignored). | ||||
|  */ | ||||
| #define AL_DIRECTION                             0x1005 | ||||
|  | ||||
| /** | ||||
|  * Source or listener velocity. | ||||
|  * Type:    ALfloat[3], ALint[3] | ||||
|  * Default: {0, 0, 0} | ||||
|  * | ||||
|  * Specifies the current velocity in local space. | ||||
|  */ | ||||
| #define AL_VELOCITY                              0x1006 | ||||
|  | ||||
| /** | ||||
|  * Source looping. | ||||
|  * Type:    ALboolean | ||||
|  * Range:   [AL_TRUE, AL_FALSE] | ||||
|  * Default: AL_FALSE | ||||
|  * | ||||
|  * Specifies whether source is looping. | ||||
|  */ | ||||
| #define AL_LOOPING                               0x1007 | ||||
|  | ||||
| /** | ||||
|  * Source buffer. | ||||
|  * Type:  ALuint | ||||
|  * Range: any valid Buffer. | ||||
|  * | ||||
|  * Specifies the buffer to provide sound samples. | ||||
|  */ | ||||
| #define AL_BUFFER                                0x1009 | ||||
|  | ||||
| /** | ||||
|  * Source or listener gain. | ||||
|  * Type:  ALfloat | ||||
|  * Range: [0.0 - ] | ||||
|  * | ||||
|  * A value of 1.0 means unattenuated. Each division by 2 equals an attenuation | ||||
|  * of about -6dB. Each multiplicaton by 2 equals an amplification of about | ||||
|  * +6dB. | ||||
|  * | ||||
|  * A value of 0.0 is meaningless with respect to a logarithmic scale; it is | ||||
|  * silent. | ||||
|  */ | ||||
| #define AL_GAIN                                  0x100A | ||||
|  | ||||
| /** | ||||
|  * Minimum source gain. | ||||
|  * Type:  ALfloat | ||||
|  * Range: [0.0 - 1.0] | ||||
|  * | ||||
|  * The minimum gain allowed for a source, after distance and cone attenation is | ||||
|  * applied (if applicable). | ||||
|  */ | ||||
| #define AL_MIN_GAIN                              0x100D | ||||
|  | ||||
| /** | ||||
|  * Maximum source gain. | ||||
|  * Type:  ALfloat | ||||
|  * Range: [0.0 - 1.0] | ||||
|  * | ||||
|  * The maximum gain allowed for a source, after distance and cone attenation is | ||||
|  * applied (if applicable). | ||||
|  */ | ||||
| #define AL_MAX_GAIN                              0x100E | ||||
|  | ||||
| /** | ||||
|  * Listener orientation. | ||||
|  * Type: ALfloat[6] | ||||
|  * Default: {0.0, 0.0, -1.0, 0.0, 1.0, 0.0} | ||||
|  * | ||||
|  * Effectively two three dimensional vectors. The first vector is the front (or | ||||
|  * "at") and the second is the top (or "up"). | ||||
|  * | ||||
|  * Both vectors are in local space. | ||||
|  */ | ||||
| #define AL_ORIENTATION                           0x100F | ||||
|  | ||||
| /** | ||||
|  * Source state (query only). | ||||
|  * Type:  ALint | ||||
|  * Range: [AL_INITIAL, AL_PLAYING, AL_PAUSED, AL_STOPPED] | ||||
|  */ | ||||
| #define AL_SOURCE_STATE                          0x1010 | ||||
|  | ||||
| /** Source state value. */ | ||||
| #define AL_INITIAL                               0x1011 | ||||
| #define AL_PLAYING                               0x1012 | ||||
| #define AL_PAUSED                                0x1013 | ||||
| #define AL_STOPPED                               0x1014 | ||||
|  | ||||
| /** | ||||
|  * Source Buffer Queue size (query only). | ||||
|  * Type: ALint | ||||
|  * | ||||
|  * The number of buffers queued using alSourceQueueBuffers, minus the buffers | ||||
|  * removed with alSourceUnqueueBuffers. | ||||
|  */ | ||||
| #define AL_BUFFERS_QUEUED                        0x1015 | ||||
|  | ||||
| /** | ||||
|  * Source Buffer Queue processed count (query only). | ||||
|  * Type: ALint | ||||
|  * | ||||
|  * The number of queued buffers that have been fully processed, and can be | ||||
|  * removed with alSourceUnqueueBuffers. | ||||
|  * | ||||
|  * Looping sources will never fully process buffers because they will be set to | ||||
|  * play again for when the source loops. | ||||
|  */ | ||||
| #define AL_BUFFERS_PROCESSED                     0x1016 | ||||
|  | ||||
| /** | ||||
|  * Source reference distance. | ||||
|  * Type:    ALfloat | ||||
|  * Range:   [0.0 - ] | ||||
|  * Default: 1.0 | ||||
|  * | ||||
|  * The distance in units that no attenuation occurs. | ||||
|  * | ||||
|  * At 0.0, no distance attenuation ever occurs on non-linear attenuation models. | ||||
|  */ | ||||
| #define AL_REFERENCE_DISTANCE                    0x1020 | ||||
|  | ||||
| /** | ||||
|  * Source rolloff factor. | ||||
|  * Type:    ALfloat | ||||
|  * Range:   [0.0 - ] | ||||
|  * Default: 1.0 | ||||
|  * | ||||
|  * Multiplier to exaggerate or diminish distance attenuation. | ||||
|  * | ||||
|  * At 0.0, no distance attenuation ever occurs. | ||||
|  */ | ||||
| #define AL_ROLLOFF_FACTOR                        0x1021 | ||||
|  | ||||
| /** | ||||
|  * Outer cone gain. | ||||
|  * Type:    ALfloat | ||||
|  * Range:   [0.0 - 1.0] | ||||
|  * Default: 0.0 | ||||
|  * | ||||
|  * The gain attenuation applied when the listener is outside of the source's | ||||
|  * outer cone. | ||||
|  */ | ||||
| #define AL_CONE_OUTER_GAIN                       0x1022 | ||||
|  | ||||
| /** | ||||
|  * Source maximum distance. | ||||
|  * Type:    ALfloat | ||||
|  * Range:   [0.0 - ] | ||||
|  * Default: +inf | ||||
|  * | ||||
|  * The distance above which the source is not attenuated any further with a | ||||
|  * clamped distance model, or where attenuation reaches 0.0 gain for linear | ||||
|  * distance models with a default rolloff factor. | ||||
|  */ | ||||
| #define AL_MAX_DISTANCE                          0x1023 | ||||
|  | ||||
| /** Source buffer position, in seconds */ | ||||
| #define AL_SEC_OFFSET                            0x1024 | ||||
| /** Source buffer position, in sample frames */ | ||||
| #define AL_SAMPLE_OFFSET                         0x1025 | ||||
| /** Source buffer position, in bytes */ | ||||
| #define AL_BYTE_OFFSET                           0x1026 | ||||
|  | ||||
| /** | ||||
|  * Source type (query only). | ||||
|  * Type:  ALint | ||||
|  * Range: [AL_STATIC, AL_STREAMING, AL_UNDETERMINED] | ||||
|  * | ||||
|  * A Source is Static if a Buffer has been attached using AL_BUFFER. | ||||
|  * | ||||
|  * A Source is Streaming if one or more Buffers have been attached using | ||||
|  * alSourceQueueBuffers. | ||||
|  * | ||||
|  * A Source is Undetermined when it has the NULL buffer attached using | ||||
|  * AL_BUFFER. | ||||
|  */ | ||||
| #define AL_SOURCE_TYPE                           0x1027 | ||||
|  | ||||
| /** Source type value. */ | ||||
| #define AL_STATIC                                0x1028 | ||||
| #define AL_STREAMING                             0x1029 | ||||
| #define AL_UNDETERMINED                          0x1030 | ||||
|  | ||||
| /** Buffer format specifier. */ | ||||
| #define AL_FORMAT_MONO8                          0x1100 | ||||
| #define AL_FORMAT_MONO16                         0x1101 | ||||
| #define AL_FORMAT_STEREO8                        0x1102 | ||||
| #define AL_FORMAT_STEREO16                       0x1103 | ||||
|  | ||||
| /** Buffer frequency (query only). */ | ||||
| #define AL_FREQUENCY                             0x2001 | ||||
| /** Buffer bits per sample (query only). */ | ||||
| #define AL_BITS                                  0x2002 | ||||
| /** Buffer channel count (query only). */ | ||||
| #define AL_CHANNELS                              0x2003 | ||||
| /** Buffer data size (query only). */ | ||||
| #define AL_SIZE                                  0x2004 | ||||
|  | ||||
| /** | ||||
|  * Buffer state. | ||||
|  * | ||||
|  * Not for public use. | ||||
|  */ | ||||
| #define AL_UNUSED                                0x2010 | ||||
| #define AL_PENDING                               0x2011 | ||||
| #define AL_PROCESSED                             0x2012 | ||||
|  | ||||
|  | ||||
| /** No error. */ | ||||
| #define AL_NO_ERROR                              0 | ||||
|  | ||||
| /** Invalid name paramater passed to AL call. */ | ||||
| #define AL_INVALID_NAME                          0xA001 | ||||
|  | ||||
| /** Invalid enum parameter passed to AL call. */ | ||||
| #define AL_INVALID_ENUM                          0xA002 | ||||
|  | ||||
| /** Invalid value parameter passed to AL call. */ | ||||
| #define AL_INVALID_VALUE                         0xA003 | ||||
|  | ||||
| /** Illegal AL call. */ | ||||
| #define AL_INVALID_OPERATION                     0xA004 | ||||
|  | ||||
| /** Not enough memory. */ | ||||
| #define AL_OUT_OF_MEMORY                         0xA005 | ||||
|  | ||||
|  | ||||
| /** Context string: Vendor ID. */ | ||||
| #define AL_VENDOR                                0xB001 | ||||
| /** Context string: Version. */ | ||||
| #define AL_VERSION                               0xB002 | ||||
| /** Context string: Renderer ID. */ | ||||
| #define AL_RENDERER                              0xB003 | ||||
| /** Context string: Space-separated extension list. */ | ||||
| #define AL_EXTENSIONS                            0xB004 | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Doppler scale. | ||||
|  * Type:    ALfloat | ||||
|  * Range:   [0.0 - ] | ||||
|  * Default: 1.0 | ||||
|  * | ||||
|  * Scale for source and listener velocities. | ||||
|  */ | ||||
| #define AL_DOPPLER_FACTOR                        0xC000 | ||||
| AL_API void AL_APIENTRY alDopplerFactor(ALfloat value); | ||||
|  | ||||
| /** | ||||
|  * Doppler velocity (deprecated). | ||||
|  * | ||||
|  * A multiplier applied to the Speed of Sound. | ||||
|  */ | ||||
| #define AL_DOPPLER_VELOCITY                      0xC001 | ||||
| AL_API void AL_APIENTRY alDopplerVelocity(ALfloat value); | ||||
|  | ||||
| /** | ||||
|  * Speed of Sound, in units per second. | ||||
|  * Type:    ALfloat | ||||
|  * Range:   [0.0001 - ] | ||||
|  * Default: 343.3 | ||||
|  * | ||||
|  * The speed at which sound waves are assumed to travel, when calculating the | ||||
|  * doppler effect. | ||||
|  */ | ||||
| #define AL_SPEED_OF_SOUND                        0xC003 | ||||
| AL_API void AL_APIENTRY alSpeedOfSound(ALfloat value); | ||||
|  | ||||
| /** | ||||
|  * Distance attenuation model. | ||||
|  * Type:    ALint | ||||
|  * Range:   [AL_NONE, AL_INVERSE_DISTANCE, AL_INVERSE_DISTANCE_CLAMPED, | ||||
|  *           AL_LINEAR_DISTANCE, AL_LINEAR_DISTANCE_CLAMPED, | ||||
|  *           AL_EXPONENT_DISTANCE, AL_EXPONENT_DISTANCE_CLAMPED] | ||||
|  * Default: AL_INVERSE_DISTANCE_CLAMPED | ||||
|  * | ||||
|  * The model by which sources attenuate with distance. | ||||
|  * | ||||
|  * None     - No distance attenuation. | ||||
|  * Inverse  - Doubling the distance halves the source gain. | ||||
|  * Linear   - Linear gain scaling between the reference and max distances. | ||||
|  * Exponent - Exponential gain dropoff. | ||||
|  * | ||||
|  * Clamped variations work like the non-clamped counterparts, except the | ||||
|  * distance calculated is clamped between the reference and max distances. | ||||
|  */ | ||||
| #define AL_DISTANCE_MODEL                        0xD000 | ||||
| AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel); | ||||
|  | ||||
| /** Distance model value. */ | ||||
| #define AL_INVERSE_DISTANCE                      0xD001 | ||||
| #define AL_INVERSE_DISTANCE_CLAMPED              0xD002 | ||||
| #define AL_LINEAR_DISTANCE                       0xD003 | ||||
| #define AL_LINEAR_DISTANCE_CLAMPED               0xD004 | ||||
| #define AL_EXPONENT_DISTANCE                     0xD005 | ||||
| #define AL_EXPONENT_DISTANCE_CLAMPED             0xD006 | ||||
|  | ||||
| /** Renderer State management. */ | ||||
| AL_API void AL_APIENTRY alEnable(ALenum capability); | ||||
| AL_API void AL_APIENTRY alDisable(ALenum capability); | ||||
| AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability); | ||||
|  | ||||
| /** State retrieval. */ | ||||
| AL_API const ALchar* AL_APIENTRY alGetString(ALenum param); | ||||
| AL_API void AL_APIENTRY alGetBooleanv(ALenum param, ALboolean *values); | ||||
| AL_API void AL_APIENTRY alGetIntegerv(ALenum param, ALint *values); | ||||
| AL_API void AL_APIENTRY alGetFloatv(ALenum param, ALfloat *values); | ||||
| AL_API void AL_APIENTRY alGetDoublev(ALenum param, ALdouble *values); | ||||
| AL_API ALboolean AL_APIENTRY alGetBoolean(ALenum param); | ||||
| AL_API ALint AL_APIENTRY alGetInteger(ALenum param); | ||||
| AL_API ALfloat AL_APIENTRY alGetFloat(ALenum param); | ||||
| AL_API ALdouble AL_APIENTRY alGetDouble(ALenum param); | ||||
|  | ||||
| /** | ||||
|  * Error retrieval. | ||||
|  * | ||||
|  * Obtain the first error generated in the AL context since the last check. | ||||
|  */ | ||||
| AL_API ALenum AL_APIENTRY alGetError(void); | ||||
|  | ||||
| /** | ||||
|  * Extension support. | ||||
|  * | ||||
|  * Query for the presence of an extension, and obtain any appropriate function | ||||
|  * pointers and enum values. | ||||
|  */ | ||||
| AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extname); | ||||
| AL_API void* AL_APIENTRY alGetProcAddress(const ALchar *fname); | ||||
| AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *ename); | ||||
|  | ||||
|  | ||||
| /** Set Listener parameters */ | ||||
| AL_API void AL_APIENTRY alListenerf(ALenum param, ALfloat value); | ||||
| AL_API void AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); | ||||
| AL_API void AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values); | ||||
| AL_API void AL_APIENTRY alListeneri(ALenum param, ALint value); | ||||
| AL_API void AL_APIENTRY alListener3i(ALenum param, ALint value1, ALint value2, ALint value3); | ||||
| AL_API void AL_APIENTRY alListeneriv(ALenum param, const ALint *values); | ||||
|  | ||||
| /** Get Listener parameters */ | ||||
| AL_API void AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value); | ||||
| AL_API void AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); | ||||
| AL_API void AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values); | ||||
| AL_API void AL_APIENTRY alGetListeneri(ALenum param, ALint *value); | ||||
| AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *value2, ALint *value3); | ||||
| AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint *values); | ||||
|  | ||||
|  | ||||
| /** Create Source objects. */ | ||||
| AL_API void AL_APIENTRY alGenSources(ALsizei n, ALuint *sources); | ||||
| /** Delete Source objects. */ | ||||
| AL_API void AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources); | ||||
| /** Verify a handle is a valid Source. */ | ||||
| AL_API ALboolean AL_APIENTRY alIsSource(ALuint source); | ||||
|  | ||||
| /** Set Source parameters. */ | ||||
| AL_API void AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value); | ||||
| AL_API void AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); | ||||
| AL_API void AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat *values); | ||||
| AL_API void AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value); | ||||
| AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3); | ||||
| AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values); | ||||
|  | ||||
| /** Get Source parameters. */ | ||||
| AL_API void AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value); | ||||
| AL_API void AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); | ||||
| AL_API void AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *values); | ||||
| AL_API void AL_APIENTRY alGetSourcei(ALuint source,  ALenum param, ALint *value); | ||||
| AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3); | ||||
| AL_API void AL_APIENTRY alGetSourceiv(ALuint source,  ALenum param, ALint *values); | ||||
|  | ||||
|  | ||||
| /** Play, replay, or resume (if paused) a list of Sources */ | ||||
| AL_API void AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources); | ||||
| /** Stop a list of Sources */ | ||||
| AL_API void AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources); | ||||
| /** Rewind a list of Sources */ | ||||
| AL_API void AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources); | ||||
| /** Pause a list of Sources */ | ||||
| AL_API void AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources); | ||||
|  | ||||
| /** Play, replay, or resume a Source */ | ||||
| AL_API void AL_APIENTRY alSourcePlay(ALuint source); | ||||
| /** Stop a Source */ | ||||
| AL_API void AL_APIENTRY alSourceStop(ALuint source); | ||||
| /** Rewind a Source (set playback postiton to beginning) */ | ||||
| AL_API void AL_APIENTRY alSourceRewind(ALuint source); | ||||
| /** Pause a Source */ | ||||
| AL_API void AL_APIENTRY alSourcePause(ALuint source); | ||||
|  | ||||
| /** Queue buffers onto a source */ | ||||
| AL_API void AL_APIENTRY alSourceQueueBuffers(ALuint source, ALsizei nb, const ALuint *buffers); | ||||
| /** Unqueue processed buffers from a source */ | ||||
| AL_API void AL_APIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei nb, ALuint *buffers); | ||||
|  | ||||
|  | ||||
| /** Create Buffer objects */ | ||||
| AL_API void AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers); | ||||
| /** Delete Buffer objects */ | ||||
| AL_API void AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers); | ||||
| /** Verify a handle is a valid Buffer */ | ||||
| AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer); | ||||
|  | ||||
| /** Specifies the data to be copied into a buffer */ | ||||
| AL_API void AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq); | ||||
|  | ||||
| /** Set Buffer parameters, */ | ||||
| AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat value); | ||||
| AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); | ||||
| AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values); | ||||
| AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value); | ||||
| AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3); | ||||
| AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values); | ||||
|  | ||||
| /** Get Buffer parameters. */ | ||||
| AL_API void AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value); | ||||
| AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); | ||||
| AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values); | ||||
| AL_API void AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value); | ||||
| AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3); | ||||
| AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values); | ||||
|  | ||||
| /** Pointer-to-function type, useful for dynamically getting AL entry points. */ | ||||
| typedef void          (AL_APIENTRY *LPALENABLE)(ALenum capability); | ||||
| typedef void          (AL_APIENTRY *LPALDISABLE)(ALenum capability); | ||||
| typedef ALboolean     (AL_APIENTRY *LPALISENABLED)(ALenum capability); | ||||
| typedef const ALchar* (AL_APIENTRY *LPALGETSTRING)(ALenum param); | ||||
| typedef void          (AL_APIENTRY *LPALGETBOOLEANV)(ALenum param, ALboolean *values); | ||||
| typedef void          (AL_APIENTRY *LPALGETINTEGERV)(ALenum param, ALint *values); | ||||
| typedef void          (AL_APIENTRY *LPALGETFLOATV)(ALenum param, ALfloat *values); | ||||
| typedef void          (AL_APIENTRY *LPALGETDOUBLEV)(ALenum param, ALdouble *values); | ||||
| typedef ALboolean     (AL_APIENTRY *LPALGETBOOLEAN)(ALenum param); | ||||
| typedef ALint         (AL_APIENTRY *LPALGETINTEGER)(ALenum param); | ||||
| typedef ALfloat       (AL_APIENTRY *LPALGETFLOAT)(ALenum param); | ||||
| typedef ALdouble      (AL_APIENTRY *LPALGETDOUBLE)(ALenum param); | ||||
| typedef ALenum        (AL_APIENTRY *LPALGETERROR)(void); | ||||
| typedef ALboolean     (AL_APIENTRY *LPALISEXTENSIONPRESENT)(const ALchar *extname); | ||||
| typedef void*         (AL_APIENTRY *LPALGETPROCADDRESS)(const ALchar *fname); | ||||
| typedef ALenum        (AL_APIENTRY *LPALGETENUMVALUE)(const ALchar *ename); | ||||
| typedef void          (AL_APIENTRY *LPALLISTENERF)(ALenum param, ALfloat value); | ||||
| typedef void          (AL_APIENTRY *LPALLISTENER3F)(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); | ||||
| typedef void          (AL_APIENTRY *LPALLISTENERFV)(ALenum param, const ALfloat *values); | ||||
| typedef void          (AL_APIENTRY *LPALLISTENERI)(ALenum param, ALint value); | ||||
| typedef void          (AL_APIENTRY *LPALLISTENER3I)(ALenum param, ALint value1, ALint value2, ALint value3); | ||||
| typedef void          (AL_APIENTRY *LPALLISTENERIV)(ALenum param, const ALint *values); | ||||
| typedef void          (AL_APIENTRY *LPALGETLISTENERF)(ALenum param, ALfloat *value); | ||||
| typedef void          (AL_APIENTRY *LPALGETLISTENER3F)(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); | ||||
| typedef void          (AL_APIENTRY *LPALGETLISTENERFV)(ALenum param, ALfloat *values); | ||||
| typedef void          (AL_APIENTRY *LPALGETLISTENERI)(ALenum param, ALint *value); | ||||
| typedef void          (AL_APIENTRY *LPALGETLISTENER3I)(ALenum param, ALint *value1, ALint *value2, ALint *value3); | ||||
| typedef void          (AL_APIENTRY *LPALGETLISTENERIV)(ALenum param, ALint *values); | ||||
| typedef void          (AL_APIENTRY *LPALGENSOURCES)(ALsizei n, ALuint *sources); | ||||
| typedef void          (AL_APIENTRY *LPALDELETESOURCES)(ALsizei n, const ALuint *sources); | ||||
| typedef ALboolean     (AL_APIENTRY *LPALISSOURCE)(ALuint source); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEF)(ALuint source, ALenum param, ALfloat value); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCE3F)(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEFV)(ALuint source, ALenum param, const ALfloat *values); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEI)(ALuint source, ALenum param, ALint value); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCE3I)(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEIV)(ALuint source, ALenum param, const ALint *values); | ||||
| typedef void          (AL_APIENTRY *LPALGETSOURCEF)(ALuint source, ALenum param, ALfloat *value); | ||||
| typedef void          (AL_APIENTRY *LPALGETSOURCE3F)(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); | ||||
| typedef void          (AL_APIENTRY *LPALGETSOURCEFV)(ALuint source, ALenum param, ALfloat *values); | ||||
| typedef void          (AL_APIENTRY *LPALGETSOURCEI)(ALuint source, ALenum param, ALint *value); | ||||
| typedef void          (AL_APIENTRY *LPALGETSOURCE3I)(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3); | ||||
| typedef void          (AL_APIENTRY *LPALGETSOURCEIV)(ALuint source, ALenum param, ALint *values); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEPLAYV)(ALsizei n, const ALuint *sources); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCESTOPV)(ALsizei n, const ALuint *sources); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEREWINDV)(ALsizei n, const ALuint *sources); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEPAUSEV)(ALsizei n, const ALuint *sources); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEPLAY)(ALuint source); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCESTOP)(ALuint source); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEREWIND)(ALuint source); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEPAUSE)(ALuint source); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEQUEUEBUFFERS)(ALuint source, ALsizei nb, const ALuint *buffers); | ||||
| typedef void          (AL_APIENTRY *LPALSOURCEUNQUEUEBUFFERS)(ALuint source, ALsizei nb, ALuint *buffers); | ||||
| typedef void          (AL_APIENTRY *LPALGENBUFFERS)(ALsizei n, ALuint *buffers); | ||||
| typedef void          (AL_APIENTRY *LPALDELETEBUFFERS)(ALsizei n, const ALuint *buffers); | ||||
| typedef ALboolean     (AL_APIENTRY *LPALISBUFFER)(ALuint buffer); | ||||
| typedef void          (AL_APIENTRY *LPALBUFFERDATA)(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq); | ||||
| typedef void          (AL_APIENTRY *LPALBUFFERF)(ALuint buffer, ALenum param, ALfloat value); | ||||
| typedef void          (AL_APIENTRY *LPALBUFFER3F)(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); | ||||
| typedef void          (AL_APIENTRY *LPALBUFFERFV)(ALuint buffer, ALenum param, const ALfloat *values); | ||||
| typedef void          (AL_APIENTRY *LPALBUFFERI)(ALuint buffer, ALenum param, ALint value); | ||||
| typedef void          (AL_APIENTRY *LPALBUFFER3I)(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3); | ||||
| typedef void          (AL_APIENTRY *LPALBUFFERIV)(ALuint buffer, ALenum param, const ALint *values); | ||||
| typedef void          (AL_APIENTRY *LPALGETBUFFERF)(ALuint buffer, ALenum param, ALfloat *value); | ||||
| typedef void          (AL_APIENTRY *LPALGETBUFFER3F)(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); | ||||
| typedef void          (AL_APIENTRY *LPALGETBUFFERFV)(ALuint buffer, ALenum param, ALfloat *values); | ||||
| typedef void          (AL_APIENTRY *LPALGETBUFFERI)(ALuint buffer, ALenum param, ALint *value); | ||||
| typedef void          (AL_APIENTRY *LPALGETBUFFER3I)(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3); | ||||
| typedef void          (AL_APIENTRY *LPALGETBUFFERIV)(ALuint buffer, ALenum param, ALint *values); | ||||
| typedef void          (AL_APIENTRY *LPALDOPPLERFACTOR)(ALfloat value); | ||||
| typedef void          (AL_APIENTRY *LPALDOPPLERVELOCITY)(ALfloat value); | ||||
| typedef void          (AL_APIENTRY *LPALSPEEDOFSOUND)(ALfloat value); | ||||
| typedef void          (AL_APIENTRY *LPALDISTANCEMODEL)(ALenum distanceModel); | ||||
|  | ||||
| #if defined(__cplusplus) | ||||
| }  /* extern "C" */ | ||||
| #endif | ||||
|  | ||||
| #endif /* AL_AL_H */ | ||||
							
								
								
									
										237
									
								
								external/openal_soft/include/AL/alc.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,237 @@ | ||||
| #ifndef AL_ALC_H | ||||
| #define AL_ALC_H | ||||
|  | ||||
| #if defined(__cplusplus) | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #ifndef ALC_API | ||||
|  #if defined(AL_LIBTYPE_STATIC) | ||||
|   #define ALC_API | ||||
|  #elif defined(_WIN32) | ||||
|   #define ALC_API __declspec(dllimport) | ||||
|  #else | ||||
|   #define ALC_API extern | ||||
|  #endif | ||||
| #endif | ||||
|  | ||||
| #if defined(_WIN32) | ||||
|  #define ALC_APIENTRY __cdecl | ||||
| #else | ||||
|  #define ALC_APIENTRY | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** Deprecated macro. */ | ||||
| #define ALCAPI                                   ALC_API | ||||
| #define ALCAPIENTRY                              ALC_APIENTRY | ||||
| #define ALC_INVALID                              0 | ||||
|  | ||||
| /** Supported ALC version? */ | ||||
| #define ALC_VERSION_0_1                          1 | ||||
|  | ||||
| /** Opaque device handle */ | ||||
| typedef struct ALCdevice_struct ALCdevice; | ||||
| /** Opaque context handle */ | ||||
| typedef struct ALCcontext_struct ALCcontext; | ||||
|  | ||||
| /** 8-bit boolean */ | ||||
| typedef char ALCboolean; | ||||
|  | ||||
| /** character */ | ||||
| typedef char ALCchar; | ||||
|  | ||||
| /** signed 8-bit 2's complement integer */ | ||||
| typedef signed char ALCbyte; | ||||
|  | ||||
| /** unsigned 8-bit integer */ | ||||
| typedef unsigned char ALCubyte; | ||||
|  | ||||
| /** signed 16-bit 2's complement integer */ | ||||
| typedef short ALCshort; | ||||
|  | ||||
| /** unsigned 16-bit integer */ | ||||
| typedef unsigned short ALCushort; | ||||
|  | ||||
| /** signed 32-bit 2's complement integer */ | ||||
| typedef int ALCint; | ||||
|  | ||||
| /** unsigned 32-bit integer */ | ||||
| typedef unsigned int ALCuint; | ||||
|  | ||||
| /** non-negative 32-bit binary integer size */ | ||||
| typedef int ALCsizei; | ||||
|  | ||||
| /** enumerated 32-bit value */ | ||||
| typedef int ALCenum; | ||||
|  | ||||
| /** 32-bit IEEE754 floating-point */ | ||||
| typedef float ALCfloat; | ||||
|  | ||||
| /** 64-bit IEEE754 floating-point */ | ||||
| typedef double ALCdouble; | ||||
|  | ||||
| /** void type (for opaque pointers only) */ | ||||
| typedef void ALCvoid; | ||||
|  | ||||
|  | ||||
| /* Enumerant values begin at column 50. No tabs. */ | ||||
|  | ||||
| /** Boolean False. */ | ||||
| #define ALC_FALSE                                0 | ||||
|  | ||||
| /** Boolean True. */ | ||||
| #define ALC_TRUE                                 1 | ||||
|  | ||||
| /** Context attribute: <int> Hz. */ | ||||
| #define ALC_FREQUENCY                            0x1007 | ||||
|  | ||||
| /** Context attribute: <int> Hz. */ | ||||
| #define ALC_REFRESH                              0x1008 | ||||
|  | ||||
| /** Context attribute: AL_TRUE or AL_FALSE. */ | ||||
| #define ALC_SYNC                                 0x1009 | ||||
|  | ||||
| /** Context attribute: <int> requested Mono (3D) Sources. */ | ||||
| #define ALC_MONO_SOURCES                         0x1010 | ||||
|  | ||||
| /** Context attribute: <int> requested Stereo Sources. */ | ||||
| #define ALC_STEREO_SOURCES                       0x1011 | ||||
|  | ||||
| /** No error. */ | ||||
| #define ALC_NO_ERROR                             0 | ||||
|  | ||||
| /** Invalid device handle. */ | ||||
| #define ALC_INVALID_DEVICE                       0xA001 | ||||
|  | ||||
| /** Invalid context handle. */ | ||||
| #define ALC_INVALID_CONTEXT                      0xA002 | ||||
|  | ||||
| /** Invalid enum parameter passed to an ALC call. */ | ||||
| #define ALC_INVALID_ENUM                         0xA003 | ||||
|  | ||||
| /** Invalid value parameter passed to an ALC call. */ | ||||
| #define ALC_INVALID_VALUE                        0xA004 | ||||
|  | ||||
| /** Out of memory. */ | ||||
| #define ALC_OUT_OF_MEMORY                        0xA005 | ||||
|  | ||||
|  | ||||
| /** Runtime ALC version. */ | ||||
| #define ALC_MAJOR_VERSION                        0x1000 | ||||
| #define ALC_MINOR_VERSION                        0x1001 | ||||
|  | ||||
| /** Context attribute list properties. */ | ||||
| #define ALC_ATTRIBUTES_SIZE                      0x1002 | ||||
| #define ALC_ALL_ATTRIBUTES                       0x1003 | ||||
|  | ||||
| /** String for the default device specifier. */ | ||||
| #define ALC_DEFAULT_DEVICE_SPECIFIER             0x1004 | ||||
| /** | ||||
|  * String for the given device's specifier. | ||||
|  * | ||||
|  * If device handle is NULL, it is instead a null-char separated list of | ||||
|  * strings of known device specifiers (list ends with an empty string). | ||||
|  */ | ||||
| #define ALC_DEVICE_SPECIFIER                     0x1005 | ||||
| /** String for space-separated list of ALC extensions. */ | ||||
| #define ALC_EXTENSIONS                           0x1006 | ||||
|  | ||||
|  | ||||
| /** Capture extension */ | ||||
| #define ALC_EXT_CAPTURE 1 | ||||
| /** | ||||
|  * String for the given capture device's specifier. | ||||
|  * | ||||
|  * If device handle is NULL, it is instead a null-char separated list of | ||||
|  * strings of known capture device specifiers (list ends with an empty string). | ||||
|  */ | ||||
| #define ALC_CAPTURE_DEVICE_SPECIFIER             0x310 | ||||
| /** String for the default capture device specifier. */ | ||||
| #define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER     0x311 | ||||
| /** Number of sample frames available for capture. */ | ||||
| #define ALC_CAPTURE_SAMPLES                      0x312 | ||||
|  | ||||
|  | ||||
| /** Enumerate All extension */ | ||||
| #define ALC_ENUMERATE_ALL_EXT 1 | ||||
| /** String for the default extended device specifier. */ | ||||
| #define ALC_DEFAULT_ALL_DEVICES_SPECIFIER        0x1012 | ||||
| /** | ||||
|  * String for the given extended device's specifier. | ||||
|  * | ||||
|  * If device handle is NULL, it is instead a null-char separated list of | ||||
|  * strings of known extended device specifiers (list ends with an empty string). | ||||
|  */ | ||||
| #define ALC_ALL_DEVICES_SPECIFIER                0x1013 | ||||
|  | ||||
|  | ||||
| /** Context management. */ | ||||
| ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint* attrlist); | ||||
| ALC_API ALCboolean  ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context); | ||||
| ALC_API void        ALC_APIENTRY alcProcessContext(ALCcontext *context); | ||||
| ALC_API void        ALC_APIENTRY alcSuspendContext(ALCcontext *context); | ||||
| ALC_API void        ALC_APIENTRY alcDestroyContext(ALCcontext *context); | ||||
| ALC_API ALCcontext* ALC_APIENTRY alcGetCurrentContext(void); | ||||
| ALC_API ALCdevice*  ALC_APIENTRY alcGetContextsDevice(ALCcontext *context); | ||||
|  | ||||
| /** Device management. */ | ||||
| ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *devicename); | ||||
| ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device); | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Error support. | ||||
|  * | ||||
|  * Obtain the most recent Device error. | ||||
|  */ | ||||
| ALC_API ALCenum ALC_APIENTRY alcGetError(ALCdevice *device); | ||||
|  | ||||
| /** | ||||
|  * Extension support. | ||||
|  * | ||||
|  * Query for the presence of an extension, and obtain any appropriate | ||||
|  * function pointers and enum values. | ||||
|  */ | ||||
| ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const ALCchar *extname); | ||||
| ALC_API void*      ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcname); | ||||
| ALC_API ALCenum    ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *enumname); | ||||
|  | ||||
| /** Query function. */ | ||||
| ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum param); | ||||
| ALC_API void           ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values); | ||||
|  | ||||
| /** Capture function. */ | ||||
| ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize); | ||||
| ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device); | ||||
| ALC_API void       ALC_APIENTRY alcCaptureStart(ALCdevice *device); | ||||
| ALC_API void       ALC_APIENTRY alcCaptureStop(ALCdevice *device); | ||||
| ALC_API void       ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples); | ||||
|  | ||||
| /** Pointer-to-function type, useful for dynamically getting ALC entry points. */ | ||||
| typedef ALCcontext*    (ALC_APIENTRY *LPALCCREATECONTEXT)(ALCdevice *device, const ALCint *attrlist); | ||||
| typedef ALCboolean     (ALC_APIENTRY *LPALCMAKECONTEXTCURRENT)(ALCcontext *context); | ||||
| typedef void           (ALC_APIENTRY *LPALCPROCESSCONTEXT)(ALCcontext *context); | ||||
| typedef void           (ALC_APIENTRY *LPALCSUSPENDCONTEXT)(ALCcontext *context); | ||||
| typedef void           (ALC_APIENTRY *LPALCDESTROYCONTEXT)(ALCcontext *context); | ||||
| typedef ALCcontext*    (ALC_APIENTRY *LPALCGETCURRENTCONTEXT)(void); | ||||
| typedef ALCdevice*     (ALC_APIENTRY *LPALCGETCONTEXTSDEVICE)(ALCcontext *context); | ||||
| typedef ALCdevice*     (ALC_APIENTRY *LPALCOPENDEVICE)(const ALCchar *devicename); | ||||
| typedef ALCboolean     (ALC_APIENTRY *LPALCCLOSEDEVICE)(ALCdevice *device); | ||||
| typedef ALCenum        (ALC_APIENTRY *LPALCGETERROR)(ALCdevice *device); | ||||
| typedef ALCboolean     (ALC_APIENTRY *LPALCISEXTENSIONPRESENT)(ALCdevice *device, const ALCchar *extname); | ||||
| typedef void*          (ALC_APIENTRY *LPALCGETPROCADDRESS)(ALCdevice *device, const ALCchar *funcname); | ||||
| typedef ALCenum        (ALC_APIENTRY *LPALCGETENUMVALUE)(ALCdevice *device, const ALCchar *enumname); | ||||
| typedef const ALCchar* (ALC_APIENTRY *LPALCGETSTRING)(ALCdevice *device, ALCenum param); | ||||
| typedef void           (ALC_APIENTRY *LPALCGETINTEGERV)(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values); | ||||
| typedef ALCdevice*     (ALC_APIENTRY *LPALCCAPTUREOPENDEVICE)(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize); | ||||
| typedef ALCboolean     (ALC_APIENTRY *LPALCCAPTURECLOSEDEVICE)(ALCdevice *device); | ||||
| typedef void           (ALC_APIENTRY *LPALCCAPTURESTART)(ALCdevice *device); | ||||
| typedef void           (ALC_APIENTRY *LPALCCAPTURESTOP)(ALCdevice *device); | ||||
| typedef void           (ALC_APIENTRY *LPALCCAPTURESAMPLES)(ALCdevice *device, ALCvoid *buffer, ALCsizei samples); | ||||
|  | ||||
| #if defined(__cplusplus) | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* AL_ALC_H */ | ||||
							
								
								
									
										355
									
								
								external/openal_soft/include/AL/alext.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,355 @@ | ||||
| /** | ||||
|  * OpenAL cross platform audio library | ||||
|  * Copyright (C) 2008 by authors. | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  *  modify it under the terms of the GNU Library General Public | ||||
|  *  License as published by the Free Software Foundation; either | ||||
|  *  version 2 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  *  Library General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Library General Public | ||||
|  *  License along with this library; if not, write to the | ||||
|  *  Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||||
|  *  Boston, MA  02111-1307, USA. | ||||
|  * Or go to http://www.gnu.org/copyleft/lgpl.html | ||||
|  */ | ||||
|  | ||||
| #ifndef AL_ALEXT_H | ||||
| #define AL_ALEXT_H | ||||
|  | ||||
| #include <stddef.h> | ||||
| /* Define int64_t and uint64_t types */ | ||||
| #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L | ||||
| #include <inttypes.h> | ||||
| #elif defined(_WIN32) && defined(__GNUC__) | ||||
| #include <stdint.h> | ||||
| #elif defined(_WIN32) | ||||
| typedef __int64 int64_t; | ||||
| typedef unsigned __int64 uint64_t; | ||||
| #else | ||||
| /* Fallback if nothing above works */ | ||||
| #include <inttypes.h> | ||||
| #endif | ||||
|  | ||||
| #include "alc.h" | ||||
| #include "al.h" | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_LOKI_IMA_ADPCM_format | ||||
| #define AL_LOKI_IMA_ADPCM_format 1 | ||||
| #define AL_FORMAT_IMA_ADPCM_MONO16_EXT           0x10000 | ||||
| #define AL_FORMAT_IMA_ADPCM_STEREO16_EXT         0x10001 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_LOKI_WAVE_format | ||||
| #define AL_LOKI_WAVE_format 1 | ||||
| #define AL_FORMAT_WAVE_EXT                       0x10002 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_vorbis | ||||
| #define AL_EXT_vorbis 1 | ||||
| #define AL_FORMAT_VORBIS_EXT                     0x10003 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_LOKI_quadriphonic | ||||
| #define AL_LOKI_quadriphonic 1 | ||||
| #define AL_FORMAT_QUAD8_LOKI                     0x10004 | ||||
| #define AL_FORMAT_QUAD16_LOKI                    0x10005 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_float32 | ||||
| #define AL_EXT_float32 1 | ||||
| #define AL_FORMAT_MONO_FLOAT32                   0x10010 | ||||
| #define AL_FORMAT_STEREO_FLOAT32                 0x10011 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_double | ||||
| #define AL_EXT_double 1 | ||||
| #define AL_FORMAT_MONO_DOUBLE_EXT                0x10012 | ||||
| #define AL_FORMAT_STEREO_DOUBLE_EXT              0x10013 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_MULAW | ||||
| #define AL_EXT_MULAW 1 | ||||
| #define AL_FORMAT_MONO_MULAW_EXT                 0x10014 | ||||
| #define AL_FORMAT_STEREO_MULAW_EXT               0x10015 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_ALAW | ||||
| #define AL_EXT_ALAW 1 | ||||
| #define AL_FORMAT_MONO_ALAW_EXT                  0x10016 | ||||
| #define AL_FORMAT_STEREO_ALAW_EXT                0x10017 | ||||
| #endif | ||||
|  | ||||
| #ifndef ALC_LOKI_audio_channel | ||||
| #define ALC_LOKI_audio_channel 1 | ||||
| #define ALC_CHAN_MAIN_LOKI                       0x500001 | ||||
| #define ALC_CHAN_PCM_LOKI                        0x500002 | ||||
| #define ALC_CHAN_CD_LOKI                         0x500003 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_MCFORMATS | ||||
| #define AL_EXT_MCFORMATS 1 | ||||
| #define AL_FORMAT_QUAD8                          0x1204 | ||||
| #define AL_FORMAT_QUAD16                         0x1205 | ||||
| #define AL_FORMAT_QUAD32                         0x1206 | ||||
| #define AL_FORMAT_REAR8                          0x1207 | ||||
| #define AL_FORMAT_REAR16                         0x1208 | ||||
| #define AL_FORMAT_REAR32                         0x1209 | ||||
| #define AL_FORMAT_51CHN8                         0x120A | ||||
| #define AL_FORMAT_51CHN16                        0x120B | ||||
| #define AL_FORMAT_51CHN32                        0x120C | ||||
| #define AL_FORMAT_61CHN8                         0x120D | ||||
| #define AL_FORMAT_61CHN16                        0x120E | ||||
| #define AL_FORMAT_61CHN32                        0x120F | ||||
| #define AL_FORMAT_71CHN8                         0x1210 | ||||
| #define AL_FORMAT_71CHN16                        0x1211 | ||||
| #define AL_FORMAT_71CHN32                        0x1212 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_MULAW_MCFORMATS | ||||
| #define AL_EXT_MULAW_MCFORMATS 1 | ||||
| #define AL_FORMAT_MONO_MULAW                     0x10014 | ||||
| #define AL_FORMAT_STEREO_MULAW                   0x10015 | ||||
| #define AL_FORMAT_QUAD_MULAW                     0x10021 | ||||
| #define AL_FORMAT_REAR_MULAW                     0x10022 | ||||
| #define AL_FORMAT_51CHN_MULAW                    0x10023 | ||||
| #define AL_FORMAT_61CHN_MULAW                    0x10024 | ||||
| #define AL_FORMAT_71CHN_MULAW                    0x10025 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_IMA4 | ||||
| #define AL_EXT_IMA4 1 | ||||
| #define AL_FORMAT_MONO_IMA4                      0x1300 | ||||
| #define AL_FORMAT_STEREO_IMA4                    0x1301 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_STATIC_BUFFER | ||||
| #define AL_EXT_STATIC_BUFFER 1 | ||||
| typedef ALvoid (AL_APIENTRY*PFNALBUFFERDATASTATICPROC)(const ALint,ALenum,ALvoid*,ALsizei,ALsizei); | ||||
| #ifdef AL_ALEXT_PROTOTYPES | ||||
| AL_API ALvoid AL_APIENTRY alBufferDataStatic(const ALint buffer, ALenum format, ALvoid *data, ALsizei len, ALsizei freq); | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef ALC_EXT_EFX | ||||
| #define ALC_EXT_EFX 1 | ||||
| #include "efx.h" | ||||
| #endif | ||||
|  | ||||
| #ifndef ALC_EXT_disconnect | ||||
| #define ALC_EXT_disconnect 1 | ||||
| #define ALC_CONNECTED                            0x313 | ||||
| #endif | ||||
|  | ||||
| #ifndef ALC_EXT_thread_local_context | ||||
| #define ALC_EXT_thread_local_context 1 | ||||
| typedef ALCboolean  (ALC_APIENTRY*PFNALCSETTHREADCONTEXTPROC)(ALCcontext *context); | ||||
| typedef ALCcontext* (ALC_APIENTRY*PFNALCGETTHREADCONTEXTPROC)(void); | ||||
| #ifdef AL_ALEXT_PROTOTYPES | ||||
| ALC_API ALCboolean  ALC_APIENTRY alcSetThreadContext(ALCcontext *context); | ||||
| ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void); | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_source_distance_model | ||||
| #define AL_EXT_source_distance_model 1 | ||||
| #define AL_SOURCE_DISTANCE_MODEL                 0x200 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_SOFT_buffer_sub_data | ||||
| #define AL_SOFT_buffer_sub_data 1 | ||||
| #define AL_BYTE_RW_OFFSETS_SOFT                  0x1031 | ||||
| #define AL_SAMPLE_RW_OFFSETS_SOFT                0x1032 | ||||
| typedef ALvoid (AL_APIENTRY*PFNALBUFFERSUBDATASOFTPROC)(ALuint,ALenum,const ALvoid*,ALsizei,ALsizei); | ||||
| #ifdef AL_ALEXT_PROTOTYPES | ||||
| AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer,ALenum format,const ALvoid *data,ALsizei offset,ALsizei length); | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_SOFT_loop_points | ||||
| #define AL_SOFT_loop_points 1 | ||||
| #define AL_LOOP_POINTS_SOFT                      0x2015 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_FOLDBACK | ||||
| #define AL_EXT_FOLDBACK 1 | ||||
| #define AL_EXT_FOLDBACK_NAME                     "AL_EXT_FOLDBACK" | ||||
| #define AL_FOLDBACK_EVENT_BLOCK                  0x4112 | ||||
| #define AL_FOLDBACK_EVENT_START                  0x4111 | ||||
| #define AL_FOLDBACK_EVENT_STOP                   0x4113 | ||||
| #define AL_FOLDBACK_MODE_MONO                    0x4101 | ||||
| #define AL_FOLDBACK_MODE_STEREO                  0x4102 | ||||
| typedef void (AL_APIENTRY*LPALFOLDBACKCALLBACK)(ALenum,ALsizei); | ||||
| typedef void (AL_APIENTRY*LPALREQUESTFOLDBACKSTART)(ALenum,ALsizei,ALsizei,ALfloat*,LPALFOLDBACKCALLBACK); | ||||
| typedef void (AL_APIENTRY*LPALREQUESTFOLDBACKSTOP)(void); | ||||
| #ifdef AL_ALEXT_PROTOTYPES | ||||
| AL_API void AL_APIENTRY alRequestFoldbackStart(ALenum mode,ALsizei count,ALsizei length,ALfloat *mem,LPALFOLDBACKCALLBACK callback); | ||||
| AL_API void AL_APIENTRY alRequestFoldbackStop(void); | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef ALC_EXT_DEDICATED | ||||
| #define ALC_EXT_DEDICATED 1 | ||||
| #define AL_DEDICATED_GAIN                        0x0001 | ||||
| #define AL_EFFECT_DEDICATED_DIALOGUE             0x9001 | ||||
| #define AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT 0x9000 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_SOFT_buffer_samples | ||||
| #define AL_SOFT_buffer_samples 1 | ||||
| /* Channel configurations */ | ||||
| #define AL_MONO_SOFT                             0x1500 | ||||
| #define AL_STEREO_SOFT                           0x1501 | ||||
| #define AL_REAR_SOFT                             0x1502 | ||||
| #define AL_QUAD_SOFT                             0x1503 | ||||
| #define AL_5POINT1_SOFT                          0x1504 | ||||
| #define AL_6POINT1_SOFT                          0x1505 | ||||
| #define AL_7POINT1_SOFT                          0x1506 | ||||
|  | ||||
| /* Sample types */ | ||||
| #define AL_BYTE_SOFT                             0x1400 | ||||
| #define AL_UNSIGNED_BYTE_SOFT                    0x1401 | ||||
| #define AL_SHORT_SOFT                            0x1402 | ||||
| #define AL_UNSIGNED_SHORT_SOFT                   0x1403 | ||||
| #define AL_INT_SOFT                              0x1404 | ||||
| #define AL_UNSIGNED_INT_SOFT                     0x1405 | ||||
| #define AL_FLOAT_SOFT                            0x1406 | ||||
| #define AL_DOUBLE_SOFT                           0x1407 | ||||
| #define AL_BYTE3_SOFT                            0x1408 | ||||
| #define AL_UNSIGNED_BYTE3_SOFT                   0x1409 | ||||
|  | ||||
| /* Storage formats */ | ||||
| #define AL_MONO8_SOFT                            0x1100 | ||||
| #define AL_MONO16_SOFT                           0x1101 | ||||
| #define AL_MONO32F_SOFT                          0x10010 | ||||
| #define AL_STEREO8_SOFT                          0x1102 | ||||
| #define AL_STEREO16_SOFT                         0x1103 | ||||
| #define AL_STEREO32F_SOFT                        0x10011 | ||||
| #define AL_QUAD8_SOFT                            0x1204 | ||||
| #define AL_QUAD16_SOFT                           0x1205 | ||||
| #define AL_QUAD32F_SOFT                          0x1206 | ||||
| #define AL_REAR8_SOFT                            0x1207 | ||||
| #define AL_REAR16_SOFT                           0x1208 | ||||
| #define AL_REAR32F_SOFT                          0x1209 | ||||
| #define AL_5POINT1_8_SOFT                        0x120A | ||||
| #define AL_5POINT1_16_SOFT                       0x120B | ||||
| #define AL_5POINT1_32F_SOFT                      0x120C | ||||
| #define AL_6POINT1_8_SOFT                        0x120D | ||||
| #define AL_6POINT1_16_SOFT                       0x120E | ||||
| #define AL_6POINT1_32F_SOFT                      0x120F | ||||
| #define AL_7POINT1_8_SOFT                        0x1210 | ||||
| #define AL_7POINT1_16_SOFT                       0x1211 | ||||
| #define AL_7POINT1_32F_SOFT                      0x1212 | ||||
|  | ||||
| /* Buffer attributes */ | ||||
| #define AL_INTERNAL_FORMAT_SOFT                  0x2008 | ||||
| #define AL_BYTE_LENGTH_SOFT                      0x2009 | ||||
| #define AL_SAMPLE_LENGTH_SOFT                    0x200A | ||||
| #define AL_SEC_LENGTH_SOFT                       0x200B | ||||
|  | ||||
| typedef void (AL_APIENTRY*LPALBUFFERSAMPLESSOFT)(ALuint,ALuint,ALenum,ALsizei,ALenum,ALenum,const ALvoid*); | ||||
| typedef void (AL_APIENTRY*LPALBUFFERSUBSAMPLESSOFT)(ALuint,ALsizei,ALsizei,ALenum,ALenum,const ALvoid*); | ||||
| typedef void (AL_APIENTRY*LPALGETBUFFERSAMPLESSOFT)(ALuint,ALsizei,ALsizei,ALenum,ALenum,ALvoid*); | ||||
| typedef ALboolean (AL_APIENTRY*LPALISBUFFERFORMATSUPPORTEDSOFT)(ALenum); | ||||
| #ifdef AL_ALEXT_PROTOTYPES | ||||
| AL_API void AL_APIENTRY alBufferSamplesSOFT(ALuint buffer, ALuint samplerate, ALenum internalformat, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data); | ||||
| AL_API void AL_APIENTRY alBufferSubSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data); | ||||
| AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, ALvoid *data); | ||||
| AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum format); | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_SOFT_direct_channels | ||||
| #define AL_SOFT_direct_channels 1 | ||||
| #define AL_DIRECT_CHANNELS_SOFT                  0x1033 | ||||
| #endif | ||||
|  | ||||
| #ifndef ALC_SOFT_loopback | ||||
| #define ALC_SOFT_loopback 1 | ||||
| #define ALC_FORMAT_CHANNELS_SOFT                 0x1990 | ||||
| #define ALC_FORMAT_TYPE_SOFT                     0x1991 | ||||
|  | ||||
| /* Sample types */ | ||||
| #define ALC_BYTE_SOFT                            0x1400 | ||||
| #define ALC_UNSIGNED_BYTE_SOFT                   0x1401 | ||||
| #define ALC_SHORT_SOFT                           0x1402 | ||||
| #define ALC_UNSIGNED_SHORT_SOFT                  0x1403 | ||||
| #define ALC_INT_SOFT                             0x1404 | ||||
| #define ALC_UNSIGNED_INT_SOFT                    0x1405 | ||||
| #define ALC_FLOAT_SOFT                           0x1406 | ||||
|  | ||||
| /* Channel configurations */ | ||||
| #define ALC_MONO_SOFT                            0x1500 | ||||
| #define ALC_STEREO_SOFT                          0x1501 | ||||
| #define ALC_QUAD_SOFT                            0x1503 | ||||
| #define ALC_5POINT1_SOFT                         0x1504 | ||||
| #define ALC_6POINT1_SOFT                         0x1505 | ||||
| #define ALC_7POINT1_SOFT                         0x1506 | ||||
|  | ||||
| typedef ALCdevice* (ALC_APIENTRY*LPALCLOOPBACKOPENDEVICESOFT)(const ALCchar*); | ||||
| typedef ALCboolean (ALC_APIENTRY*LPALCISRENDERFORMATSUPPORTEDSOFT)(ALCdevice*,ALCsizei,ALCenum,ALCenum); | ||||
| typedef void (ALC_APIENTRY*LPALCRENDERSAMPLESSOFT)(ALCdevice*,ALCvoid*,ALCsizei); | ||||
| #ifdef AL_ALEXT_PROTOTYPES | ||||
| ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceName); | ||||
| ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALCenum channels, ALCenum type); | ||||
| ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffer, ALCsizei samples); | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_STEREO_ANGLES | ||||
| #define AL_EXT_STEREO_ANGLES 1 | ||||
| #define AL_STEREO_ANGLES                         0x1030 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_EXT_SOURCE_RADIUS | ||||
| #define AL_EXT_SOURCE_RADIUS 1 | ||||
| #define AL_SOURCE_RADIUS                         0x1031 | ||||
| #endif | ||||
|  | ||||
| #ifndef AL_SOFT_source_latency | ||||
| #define AL_SOFT_source_latency 1 | ||||
| #define AL_SAMPLE_OFFSET_LATENCY_SOFT            0x1200 | ||||
| #define AL_SEC_OFFSET_LATENCY_SOFT               0x1201 | ||||
| typedef int64_t ALint64SOFT; | ||||
| typedef uint64_t ALuint64SOFT; | ||||
| typedef void (AL_APIENTRY*LPALSOURCEDSOFT)(ALuint,ALenum,ALdouble); | ||||
| typedef void (AL_APIENTRY*LPALSOURCE3DSOFT)(ALuint,ALenum,ALdouble,ALdouble,ALdouble); | ||||
| typedef void (AL_APIENTRY*LPALSOURCEDVSOFT)(ALuint,ALenum,const ALdouble*); | ||||
| typedef void (AL_APIENTRY*LPALGETSOURCEDSOFT)(ALuint,ALenum,ALdouble*); | ||||
| typedef void (AL_APIENTRY*LPALGETSOURCE3DSOFT)(ALuint,ALenum,ALdouble*,ALdouble*,ALdouble*); | ||||
| typedef void (AL_APIENTRY*LPALGETSOURCEDVSOFT)(ALuint,ALenum,ALdouble*); | ||||
| typedef void (AL_APIENTRY*LPALSOURCEI64SOFT)(ALuint,ALenum,ALint64SOFT); | ||||
| typedef void (AL_APIENTRY*LPALSOURCE3I64SOFT)(ALuint,ALenum,ALint64SOFT,ALint64SOFT,ALint64SOFT); | ||||
| typedef void (AL_APIENTRY*LPALSOURCEI64VSOFT)(ALuint,ALenum,const ALint64SOFT*); | ||||
| typedef void (AL_APIENTRY*LPALGETSOURCEI64SOFT)(ALuint,ALenum,ALint64SOFT*); | ||||
| typedef void (AL_APIENTRY*LPALGETSOURCE3I64SOFT)(ALuint,ALenum,ALint64SOFT*,ALint64SOFT*,ALint64SOFT*); | ||||
| typedef void (AL_APIENTRY*LPALGETSOURCEI64VSOFT)(ALuint,ALenum,ALint64SOFT*); | ||||
| #ifdef AL_ALEXT_PROTOTYPES | ||||
| AL_API void AL_APIENTRY alSourcedSOFT(ALuint source, ALenum param, ALdouble value); | ||||
| AL_API void AL_APIENTRY alSource3dSOFT(ALuint source, ALenum param, ALdouble value1, ALdouble value2, ALdouble value3); | ||||
| AL_API void AL_APIENTRY alSourcedvSOFT(ALuint source, ALenum param, const ALdouble *values); | ||||
| AL_API void AL_APIENTRY alGetSourcedSOFT(ALuint source, ALenum param, ALdouble *value); | ||||
| AL_API void AL_APIENTRY alGetSource3dSOFT(ALuint source, ALenum param, ALdouble *value1, ALdouble *value2, ALdouble *value3); | ||||
| AL_API void AL_APIENTRY alGetSourcedvSOFT(ALuint source, ALenum param, ALdouble *values); | ||||
| AL_API void AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT value); | ||||
| AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT value1, ALint64SOFT value2, ALint64SOFT value3); | ||||
| AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALint64SOFT *values); | ||||
| AL_API void AL_APIENTRY alGetSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT *value); | ||||
| AL_API void AL_APIENTRY alGetSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT *value1, ALint64SOFT *value2, ALint64SOFT *value3); | ||||
| AL_API void AL_APIENTRY alGetSourcei64vSOFT(ALuint source, ALenum param, ALint64SOFT *values); | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										3
									
								
								external/openal_soft/include/AL/efx-creative.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | ||||
| /* The tokens that would be defined here are already defined in efx.h. This | ||||
|  * empty file is here to provide compatibility with Windows-based projects | ||||
|  * that would include it. */ | ||||
							
								
								
									
										402
									
								
								external/openal_soft/include/AL/efx-presets.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,402 @@ | ||||
| /* Reverb presets for EFX */ | ||||
|  | ||||
| #ifndef EFX_PRESETS_H | ||||
| #define EFX_PRESETS_H | ||||
|  | ||||
| #ifndef EFXEAXREVERBPROPERTIES_DEFINED | ||||
| #define EFXEAXREVERBPROPERTIES_DEFINED | ||||
| typedef struct { | ||||
|     float flDensity; | ||||
|     float flDiffusion; | ||||
|     float flGain; | ||||
|     float flGainHF; | ||||
|     float flGainLF; | ||||
|     float flDecayTime; | ||||
|     float flDecayHFRatio; | ||||
|     float flDecayLFRatio; | ||||
|     float flReflectionsGain; | ||||
|     float flReflectionsDelay; | ||||
|     float flReflectionsPan[3]; | ||||
|     float flLateReverbGain; | ||||
|     float flLateReverbDelay; | ||||
|     float flLateReverbPan[3]; | ||||
|     float flEchoTime; | ||||
|     float flEchoDepth; | ||||
|     float flModulationTime; | ||||
|     float flModulationDepth; | ||||
|     float flAirAbsorptionGainHF; | ||||
|     float flHFReference; | ||||
|     float flLFReference; | ||||
|     float flRoomRolloffFactor; | ||||
|     int   iDecayHFLimit; | ||||
| } EFXEAXREVERBPROPERTIES, *LPEFXEAXREVERBPROPERTIES; | ||||
| #endif | ||||
|  | ||||
| /* Default Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_GENERIC \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.8913f, 1.0000f, 1.4900f, 0.8300f, 1.0000f, 0.0500f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PADDEDCELL \ | ||||
|     { 0.1715f, 1.0000f, 0.3162f, 0.0010f, 1.0000f, 0.1700f, 0.1000f, 1.0000f, 0.2500f, 0.0010f, { 0.0000f, 0.0000f, 0.0000f }, 1.2691f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ROOM \ | ||||
|     { 0.4287f, 1.0000f, 0.3162f, 0.5929f, 1.0000f, 0.4000f, 0.8300f, 1.0000f, 0.1503f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 1.0629f, 0.0030f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_BATHROOM \ | ||||
|     { 0.1715f, 1.0000f, 0.3162f, 0.2512f, 1.0000f, 1.4900f, 0.5400f, 1.0000f, 0.6531f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 3.2734f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_LIVINGROOM \ | ||||
|     { 0.9766f, 1.0000f, 0.3162f, 0.0010f, 1.0000f, 0.5000f, 0.1000f, 1.0000f, 0.2051f, 0.0030f, { 0.0000f, 0.0000f, 0.0000f }, 0.2805f, 0.0040f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_STONEROOM \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.7079f, 1.0000f, 2.3100f, 0.6400f, 1.0000f, 0.4411f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1003f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_AUDITORIUM \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.5781f, 1.0000f, 4.3200f, 0.5900f, 1.0000f, 0.4032f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.7170f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CONCERTHALL \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.5623f, 1.0000f, 3.9200f, 0.7000f, 1.0000f, 0.2427f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.9977f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CAVE \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 1.0000f, 1.0000f, 2.9100f, 1.3000f, 1.0000f, 0.5000f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.7063f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ARENA \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.4477f, 1.0000f, 7.2400f, 0.3300f, 1.0000f, 0.2612f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.0186f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_HANGAR \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.3162f, 1.0000f, 10.0500f, 0.2300f, 1.0000f, 0.5000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.2560f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CARPETEDHALLWAY \ | ||||
|     { 0.4287f, 1.0000f, 0.3162f, 0.0100f, 1.0000f, 0.3000f, 0.1000f, 1.0000f, 0.1215f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 0.1531f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_HALLWAY \ | ||||
|     { 0.3645f, 1.0000f, 0.3162f, 0.7079f, 1.0000f, 1.4900f, 0.5900f, 1.0000f, 0.2458f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.6615f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_STONECORRIDOR \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.7612f, 1.0000f, 2.7000f, 0.7900f, 1.0000f, 0.2472f, 0.0130f, { 0.0000f, 0.0000f, 0.0000f }, 1.5758f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ALLEY \ | ||||
|     { 1.0000f, 0.3000f, 0.3162f, 0.7328f, 1.0000f, 1.4900f, 0.8600f, 1.0000f, 0.2500f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.9954f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 0.9500f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_FOREST \ | ||||
|     { 1.0000f, 0.3000f, 0.3162f, 0.0224f, 1.0000f, 1.4900f, 0.5400f, 1.0000f, 0.0525f, 0.1620f, { 0.0000f, 0.0000f, 0.0000f }, 0.7682f, 0.0880f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CITY \ | ||||
|     { 1.0000f, 0.5000f, 0.3162f, 0.3981f, 1.0000f, 1.4900f, 0.6700f, 1.0000f, 0.0730f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.1427f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_MOUNTAINS \ | ||||
|     { 1.0000f, 0.2700f, 0.3162f, 0.0562f, 1.0000f, 1.4900f, 0.2100f, 1.0000f, 0.0407f, 0.3000f, { 0.0000f, 0.0000f, 0.0000f }, 0.1919f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_QUARRY \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.3162f, 1.0000f, 1.4900f, 0.8300f, 1.0000f, 0.0000f, 0.0610f, { 0.0000f, 0.0000f, 0.0000f }, 1.7783f, 0.0250f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 0.7000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PLAIN \ | ||||
|     { 1.0000f, 0.2100f, 0.3162f, 0.1000f, 1.0000f, 1.4900f, 0.5000f, 1.0000f, 0.0585f, 0.1790f, { 0.0000f, 0.0000f, 0.0000f }, 0.1089f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PARKINGLOT \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 1.0000f, 1.0000f, 1.6500f, 1.5000f, 1.0000f, 0.2082f, 0.0080f, { 0.0000f, 0.0000f, 0.0000f }, 0.2652f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SEWERPIPE \ | ||||
|     { 0.3071f, 0.8000f, 0.3162f, 0.3162f, 1.0000f, 2.8100f, 0.1400f, 1.0000f, 1.6387f, 0.0140f, { 0.0000f, 0.0000f, 0.0000f }, 3.2471f, 0.0210f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_UNDERWATER \ | ||||
|     { 0.3645f, 1.0000f, 0.3162f, 0.0100f, 1.0000f, 1.4900f, 0.1000f, 1.0000f, 0.5963f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 7.0795f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 1.1800f, 0.3480f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DRUGGED \ | ||||
|     { 0.4287f, 0.5000f, 0.3162f, 1.0000f, 1.0000f, 8.3900f, 1.3900f, 1.0000f, 0.8760f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 3.1081f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 1.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DIZZY \ | ||||
|     { 0.3645f, 0.6000f, 0.3162f, 0.6310f, 1.0000f, 17.2300f, 0.5600f, 1.0000f, 0.1392f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.4937f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.8100f, 0.3100f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PSYCHOTIC \ | ||||
|     { 0.0625f, 0.5000f, 0.3162f, 0.8404f, 1.0000f, 7.5600f, 0.9100f, 1.0000f, 0.4864f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 2.4378f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 4.0000f, 1.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| /* Castle Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CASTLE_SMALLROOM \ | ||||
|     { 1.0000f, 0.8900f, 0.3162f, 0.3981f, 0.1000f, 1.2200f, 0.8300f, 0.3100f, 0.8913f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CASTLE_SHORTPASSAGE \ | ||||
|     { 1.0000f, 0.8900f, 0.3162f, 0.3162f, 0.1000f, 2.3200f, 0.8300f, 0.3100f, 0.8913f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CASTLE_MEDIUMROOM \ | ||||
|     { 1.0000f, 0.9300f, 0.3162f, 0.2818f, 0.1000f, 2.0400f, 0.8300f, 0.4600f, 0.6310f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 1.5849f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1550f, 0.0300f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CASTLE_LARGEROOM \ | ||||
|     { 1.0000f, 0.8200f, 0.3162f, 0.2818f, 0.1259f, 2.5300f, 0.8300f, 0.5000f, 0.4467f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.1850f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CASTLE_LONGPASSAGE \ | ||||
|     { 1.0000f, 0.8900f, 0.3162f, 0.3981f, 0.1000f, 3.4200f, 0.8300f, 0.3100f, 0.8913f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CASTLE_HALL \ | ||||
|     { 1.0000f, 0.8100f, 0.3162f, 0.2818f, 0.1778f, 3.1400f, 0.7900f, 0.6200f, 0.1778f, 0.0560f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CASTLE_CUPBOARD \ | ||||
|     { 1.0000f, 0.8900f, 0.3162f, 0.2818f, 0.1000f, 0.6700f, 0.8700f, 0.3100f, 1.4125f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 3.5481f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CASTLE_COURTYARD \ | ||||
|     { 1.0000f, 0.4200f, 0.3162f, 0.4467f, 0.1995f, 2.1300f, 0.6100f, 0.2300f, 0.2239f, 0.1600f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0360f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.3700f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CASTLE_ALCOVE \ | ||||
|     { 1.0000f, 0.8900f, 0.3162f, 0.5012f, 0.1000f, 1.6400f, 0.8700f, 0.3100f, 1.0000f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| /* Factory Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_FACTORY_SMALLROOM \ | ||||
|     { 0.3645f, 0.8200f, 0.3162f, 0.7943f, 0.5012f, 1.7200f, 0.6500f, 1.3100f, 0.7079f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.7783f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.1190f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_FACTORY_SHORTPASSAGE \ | ||||
|     { 0.3645f, 0.6400f, 0.2512f, 0.7943f, 0.5012f, 2.5300f, 0.6500f, 1.3100f, 1.0000f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.1350f, 0.2300f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_FACTORY_MEDIUMROOM \ | ||||
|     { 0.4287f, 0.8200f, 0.2512f, 0.7943f, 0.5012f, 2.7600f, 0.6500f, 1.3100f, 0.2818f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1740f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_FACTORY_LARGEROOM \ | ||||
|     { 0.4287f, 0.7500f, 0.2512f, 0.7079f, 0.6310f, 4.2400f, 0.5100f, 1.3100f, 0.1778f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.2310f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_FACTORY_LONGPASSAGE \ | ||||
|     { 0.3645f, 0.6400f, 0.2512f, 0.7943f, 0.5012f, 4.0600f, 0.6500f, 1.3100f, 1.0000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0370f, { 0.0000f, 0.0000f, 0.0000f }, 0.1350f, 0.2300f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_FACTORY_HALL \ | ||||
|     { 0.4287f, 0.7500f, 0.3162f, 0.7079f, 0.6310f, 7.4300f, 0.5100f, 1.3100f, 0.0631f, 0.0730f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0270f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_FACTORY_CUPBOARD \ | ||||
|     { 0.3071f, 0.6300f, 0.2512f, 0.7943f, 0.5012f, 0.4900f, 0.6500f, 1.3100f, 1.2589f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.1070f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_FACTORY_COURTYARD \ | ||||
|     { 0.3071f, 0.5700f, 0.3162f, 0.3162f, 0.6310f, 2.3200f, 0.2900f, 0.5600f, 0.2239f, 0.1400f, { 0.0000f, 0.0000f, 0.0000f }, 0.3981f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2900f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_FACTORY_ALCOVE \ | ||||
|     { 0.3645f, 0.5900f, 0.2512f, 0.7943f, 0.5012f, 3.1400f, 0.6500f, 1.3100f, 1.4125f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.1140f, 0.1000f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } | ||||
|  | ||||
| /* Ice Palace Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ICEPALACE_SMALLROOM \ | ||||
|     { 1.0000f, 0.8400f, 0.3162f, 0.5623f, 0.2818f, 1.5100f, 1.5300f, 0.2700f, 0.8913f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1640f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ICEPALACE_SHORTPASSAGE \ | ||||
|     { 1.0000f, 0.7500f, 0.3162f, 0.5623f, 0.2818f, 1.7900f, 1.4600f, 0.2800f, 0.5012f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0190f, { 0.0000f, 0.0000f, 0.0000f }, 0.1770f, 0.0900f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ICEPALACE_MEDIUMROOM \ | ||||
|     { 1.0000f, 0.8700f, 0.3162f, 0.5623f, 0.4467f, 2.2200f, 1.5300f, 0.3200f, 0.3981f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0270f, { 0.0000f, 0.0000f, 0.0000f }, 0.1860f, 0.1200f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ICEPALACE_LARGEROOM \ | ||||
|     { 1.0000f, 0.8100f, 0.3162f, 0.5623f, 0.4467f, 3.1400f, 1.5300f, 0.3200f, 0.2512f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0270f, { 0.0000f, 0.0000f, 0.0000f }, 0.2140f, 0.1100f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ICEPALACE_LONGPASSAGE \ | ||||
|     { 1.0000f, 0.7700f, 0.3162f, 0.5623f, 0.3981f, 3.0100f, 1.4600f, 0.2800f, 0.7943f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0250f, { 0.0000f, 0.0000f, 0.0000f }, 0.1860f, 0.0400f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ICEPALACE_HALL \ | ||||
|     { 1.0000f, 0.7600f, 0.3162f, 0.4467f, 0.5623f, 5.4900f, 1.5300f, 0.3800f, 0.1122f, 0.0540f, { 0.0000f, 0.0000f, 0.0000f }, 0.6310f, 0.0520f, { 0.0000f, 0.0000f, 0.0000f }, 0.2260f, 0.1100f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ICEPALACE_CUPBOARD \ | ||||
|     { 1.0000f, 0.8300f, 0.3162f, 0.5012f, 0.2239f, 0.7600f, 1.5300f, 0.2600f, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.1430f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ICEPALACE_COURTYARD \ | ||||
|     { 1.0000f, 0.5900f, 0.3162f, 0.2818f, 0.3162f, 2.0400f, 1.2000f, 0.3800f, 0.3162f, 0.1730f, { 0.0000f, 0.0000f, 0.0000f }, 0.3162f, 0.0430f, { 0.0000f, 0.0000f, 0.0000f }, 0.2350f, 0.4800f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_ICEPALACE_ALCOVE \ | ||||
|     { 1.0000f, 0.8400f, 0.3162f, 0.5623f, 0.2818f, 2.7600f, 1.4600f, 0.2800f, 1.1220f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1610f, 0.0900f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| /* Space Station Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPACESTATION_SMALLROOM \ | ||||
|     { 0.2109f, 0.7000f, 0.3162f, 0.7079f, 0.8913f, 1.7200f, 0.8200f, 0.5500f, 0.7943f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0130f, { 0.0000f, 0.0000f, 0.0000f }, 0.1880f, 0.2600f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPACESTATION_SHORTPASSAGE \ | ||||
|     { 0.2109f, 0.8700f, 0.3162f, 0.6310f, 0.8913f, 3.5700f, 0.5000f, 0.5500f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.1720f, 0.2000f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPACESTATION_MEDIUMROOM \ | ||||
|     { 0.2109f, 0.7500f, 0.3162f, 0.6310f, 0.8913f, 3.0100f, 0.5000f, 0.5500f, 0.3981f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0350f, { 0.0000f, 0.0000f, 0.0000f }, 0.2090f, 0.3100f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPACESTATION_LARGEROOM \ | ||||
|     { 0.3645f, 0.8100f, 0.3162f, 0.6310f, 0.8913f, 3.8900f, 0.3800f, 0.6100f, 0.3162f, 0.0560f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0350f, { 0.0000f, 0.0000f, 0.0000f }, 0.2330f, 0.2800f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPACESTATION_LONGPASSAGE \ | ||||
|     { 0.4287f, 0.8200f, 0.3162f, 0.6310f, 0.8913f, 4.6200f, 0.6200f, 0.5500f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0310f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2300f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPACESTATION_HALL \ | ||||
|     { 0.4287f, 0.8700f, 0.3162f, 0.6310f, 0.8913f, 7.1100f, 0.3800f, 0.6100f, 0.1778f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.6310f, 0.0470f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2500f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPACESTATION_CUPBOARD \ | ||||
|     { 0.1715f, 0.5600f, 0.3162f, 0.7079f, 0.8913f, 0.7900f, 0.8100f, 0.5500f, 1.4125f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.7783f, 0.0180f, { 0.0000f, 0.0000f, 0.0000f }, 0.1810f, 0.3100f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPACESTATION_ALCOVE \ | ||||
|     { 0.2109f, 0.7800f, 0.3162f, 0.7079f, 0.8913f, 1.1600f, 0.8100f, 0.5500f, 1.4125f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0180f, { 0.0000f, 0.0000f, 0.0000f }, 0.1920f, 0.2100f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| /* Wooden Galleon Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_WOODEN_SMALLROOM \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.1122f, 0.3162f, 0.7900f, 0.3200f, 0.8700f, 1.0000f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_WOODEN_SHORTPASSAGE \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.1259f, 0.3162f, 1.7500f, 0.5000f, 0.8700f, 0.8913f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.6310f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_WOODEN_MEDIUMROOM \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.1000f, 0.2818f, 1.4700f, 0.4200f, 0.8200f, 0.8913f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_WOODEN_LARGEROOM \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.0891f, 0.2818f, 2.6500f, 0.3300f, 0.8200f, 0.8913f, 0.0660f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_WOODEN_LONGPASSAGE \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.1000f, 0.3162f, 1.9900f, 0.4000f, 0.7900f, 1.0000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.4467f, 0.0360f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_WOODEN_HALL \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.0794f, 0.2818f, 3.4500f, 0.3000f, 0.8200f, 0.8913f, 0.0880f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0630f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_WOODEN_CUPBOARD \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.1413f, 0.3162f, 0.5600f, 0.4600f, 0.9100f, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0280f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_WOODEN_COURTYARD \ | ||||
|     { 1.0000f, 0.6500f, 0.3162f, 0.0794f, 0.3162f, 1.7900f, 0.3500f, 0.7900f, 0.5623f, 0.1230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1000f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_WOODEN_ALCOVE \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.1259f, 0.3162f, 1.2200f, 0.6200f, 0.9100f, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } | ||||
|  | ||||
| /* Sports Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPORT_EMPTYSTADIUM \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.4467f, 0.7943f, 6.2600f, 0.5100f, 1.1000f, 0.0631f, 0.1830f, { 0.0000f, 0.0000f, 0.0000f }, 0.3981f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPORT_SQUASHCOURT \ | ||||
|     { 1.0000f, 0.7500f, 0.3162f, 0.3162f, 0.7943f, 2.2200f, 0.9100f, 1.1600f, 0.4467f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1260f, 0.1900f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPORT_SMALLSWIMMINGPOOL \ | ||||
|     { 1.0000f, 0.7000f, 0.3162f, 0.7943f, 0.8913f, 2.7600f, 1.2500f, 1.1400f, 0.6310f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1790f, 0.1500f, 0.8950f, 0.1900f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPORT_LARGESWIMMINGPOOL \ | ||||
|     { 1.0000f, 0.8200f, 0.3162f, 0.7943f, 1.0000f, 5.4900f, 1.3100f, 1.1400f, 0.4467f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 0.5012f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2220f, 0.5500f, 1.1590f, 0.2100f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPORT_GYMNASIUM \ | ||||
|     { 1.0000f, 0.8100f, 0.3162f, 0.4467f, 0.8913f, 3.1400f, 1.0600f, 1.3500f, 0.3981f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.5623f, 0.0450f, { 0.0000f, 0.0000f, 0.0000f }, 0.1460f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPORT_FULLSTADIUM \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.0708f, 0.7943f, 5.2500f, 0.1700f, 0.8000f, 0.1000f, 0.1880f, { 0.0000f, 0.0000f, 0.0000f }, 0.2818f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SPORT_STADIUMTANNOY \ | ||||
|     { 1.0000f, 0.7800f, 0.3162f, 0.5623f, 0.5012f, 2.5300f, 0.8800f, 0.6800f, 0.2818f, 0.2300f, { 0.0000f, 0.0000f, 0.0000f }, 0.5012f, 0.0630f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| /* Prefab Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PREFAB_WORKSHOP \ | ||||
|     { 0.4287f, 1.0000f, 0.3162f, 0.1413f, 0.3981f, 0.7600f, 1.0000f, 1.0000f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PREFAB_SCHOOLROOM \ | ||||
|     { 0.4022f, 0.6900f, 0.3162f, 0.6310f, 0.5012f, 0.9800f, 0.4500f, 0.1800f, 1.4125f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.0950f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PREFAB_PRACTISEROOM \ | ||||
|     { 0.4022f, 0.8700f, 0.3162f, 0.3981f, 0.5012f, 1.1200f, 0.5600f, 0.1800f, 1.2589f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.0950f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PREFAB_OUTHOUSE \ | ||||
|     { 1.0000f, 0.8200f, 0.3162f, 0.1122f, 0.1585f, 1.3800f, 0.3800f, 0.3500f, 0.8913f, 0.0240f, { 0.0000f, 0.0000f, -0.0000f }, 0.6310f, 0.0440f, { 0.0000f, 0.0000f, 0.0000f }, 0.1210f, 0.1700f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PREFAB_CARAVAN \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.0891f, 0.1259f, 0.4300f, 1.5000f, 1.0000f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| /* Dome and Pipe Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DOME_TOMB \ | ||||
|     { 1.0000f, 0.7900f, 0.3162f, 0.3548f, 0.2239f, 4.1800f, 0.2100f, 0.1000f, 0.3868f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 1.6788f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.1770f, 0.1900f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PIPE_SMALL \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.3548f, 0.2239f, 5.0400f, 0.1000f, 0.1000f, 0.5012f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 2.5119f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DOME_SAINTPAULS \ | ||||
|     { 1.0000f, 0.8700f, 0.3162f, 0.3548f, 0.2239f, 10.4800f, 0.1900f, 0.1000f, 0.1778f, 0.0900f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0420f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.1200f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PIPE_LONGTHIN \ | ||||
|     { 0.2560f, 0.9100f, 0.3162f, 0.4467f, 0.2818f, 9.2100f, 0.1800f, 0.1000f, 0.7079f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PIPE_LARGE \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.3548f, 0.2239f, 8.4500f, 0.1000f, 0.1000f, 0.3981f, 0.0460f, { 0.0000f, 0.0000f, 0.0000f }, 1.5849f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_PIPE_RESONANT \ | ||||
|     { 0.1373f, 0.9100f, 0.3162f, 0.4467f, 0.2818f, 6.8100f, 0.1800f, 0.1000f, 0.7079f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| /* Outdoors Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_OUTDOORS_BACKYARD \ | ||||
|     { 1.0000f, 0.4500f, 0.3162f, 0.2512f, 0.5012f, 1.1200f, 0.3400f, 0.4600f, 0.4467f, 0.0690f, { 0.0000f, 0.0000f, -0.0000f }, 0.7079f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.2180f, 0.3400f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_OUTDOORS_ROLLINGPLAINS \ | ||||
|     { 1.0000f, 0.0000f, 0.3162f, 0.0112f, 0.6310f, 2.1300f, 0.2100f, 0.4600f, 0.1778f, 0.3000f, { 0.0000f, 0.0000f, -0.0000f }, 0.4467f, 0.0190f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_OUTDOORS_DEEPCANYON \ | ||||
|     { 1.0000f, 0.7400f, 0.3162f, 0.1778f, 0.6310f, 3.8900f, 0.2100f, 0.4600f, 0.3162f, 0.2230f, { 0.0000f, 0.0000f, -0.0000f }, 0.3548f, 0.0190f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_OUTDOORS_CREEK \ | ||||
|     { 1.0000f, 0.3500f, 0.3162f, 0.1778f, 0.5012f, 2.1300f, 0.2100f, 0.4600f, 0.3981f, 0.1150f, { 0.0000f, 0.0000f, -0.0000f }, 0.1995f, 0.0310f, { 0.0000f, 0.0000f, 0.0000f }, 0.2180f, 0.3400f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_OUTDOORS_VALLEY \ | ||||
|     { 1.0000f, 0.2800f, 0.3162f, 0.0282f, 0.1585f, 2.8800f, 0.2600f, 0.3500f, 0.1413f, 0.2630f, { 0.0000f, 0.0000f, -0.0000f }, 0.3981f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.3400f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } | ||||
|  | ||||
| /* Mood Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_MOOD_HEAVEN \ | ||||
|     { 1.0000f, 0.9400f, 0.3162f, 0.7943f, 0.4467f, 5.0400f, 1.1200f, 0.5600f, 0.2427f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0800f, 2.7420f, 0.0500f, 0.9977f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_MOOD_HELL \ | ||||
|     { 1.0000f, 0.5700f, 0.3162f, 0.3548f, 0.4467f, 3.5700f, 0.4900f, 2.0000f, 0.0000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1100f, 0.0400f, 2.1090f, 0.5200f, 0.9943f, 5000.0000f, 139.5000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_MOOD_MEMORY \ | ||||
|     { 1.0000f, 0.8500f, 0.3162f, 0.6310f, 0.3548f, 4.0600f, 0.8200f, 0.5600f, 0.0398f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.4740f, 0.4500f, 0.9886f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| /* Driving Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DRIVING_COMMENTATOR \ | ||||
|     { 1.0000f, 0.0000f, 3.1623f, 0.5623f, 0.5012f, 2.4200f, 0.8800f, 0.6800f, 0.1995f, 0.0930f, { 0.0000f, 0.0000f, 0.0000f }, 0.2512f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9886f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DRIVING_PITGARAGE \ | ||||
|     { 0.4287f, 0.5900f, 0.3162f, 0.7079f, 0.5623f, 1.7200f, 0.9300f, 0.8700f, 0.5623f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.1100f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DRIVING_INCAR_RACER \ | ||||
|     { 0.0832f, 0.8000f, 0.3162f, 1.0000f, 0.7943f, 0.1700f, 2.0000f, 0.4100f, 1.7783f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10268.2002f, 251.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DRIVING_INCAR_SPORTS \ | ||||
|     { 0.0832f, 0.8000f, 0.3162f, 0.6310f, 1.0000f, 0.1700f, 0.7500f, 0.4100f, 1.0000f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.5623f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10268.2002f, 251.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DRIVING_INCAR_LUXURY \ | ||||
|     { 0.2560f, 1.0000f, 0.3162f, 0.1000f, 0.5012f, 0.1300f, 0.4100f, 0.4600f, 0.7943f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.5849f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10268.2002f, 251.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DRIVING_FULLGRANDSTAND \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 0.2818f, 0.6310f, 3.0100f, 1.3700f, 1.2800f, 0.3548f, 0.0900f, { 0.0000f, 0.0000f, 0.0000f }, 0.1778f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10420.2002f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DRIVING_EMPTYGRANDSTAND \ | ||||
|     { 1.0000f, 1.0000f, 0.3162f, 1.0000f, 0.7943f, 4.6200f, 1.7500f, 1.4000f, 0.2082f, 0.0900f, { 0.0000f, 0.0000f, 0.0000f }, 0.2512f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10420.2002f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DRIVING_TUNNEL \ | ||||
|     { 1.0000f, 0.8100f, 0.3162f, 0.3981f, 0.8913f, 3.4200f, 0.9400f, 1.3100f, 0.7079f, 0.0510f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0470f, { 0.0000f, 0.0000f, 0.0000f }, 0.2140f, 0.0500f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 155.3000f, 0.0000f, 0x1 } | ||||
|  | ||||
| /* City Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CITY_STREETS \ | ||||
|     { 1.0000f, 0.7800f, 0.3162f, 0.7079f, 0.8913f, 1.7900f, 1.1200f, 0.9100f, 0.2818f, 0.0460f, { 0.0000f, 0.0000f, 0.0000f }, 0.1995f, 0.0280f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CITY_SUBWAY \ | ||||
|     { 1.0000f, 0.7400f, 0.3162f, 0.7079f, 0.8913f, 3.0100f, 1.2300f, 0.9100f, 0.7079f, 0.0460f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0280f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 0.2100f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CITY_MUSEUM \ | ||||
|     { 1.0000f, 0.8200f, 0.3162f, 0.1778f, 0.1778f, 3.2800f, 1.4000f, 0.5700f, 0.2512f, 0.0390f, { 0.0000f, 0.0000f, -0.0000f }, 0.8913f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 0.1300f, 0.1700f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CITY_LIBRARY \ | ||||
|     { 1.0000f, 0.8200f, 0.3162f, 0.2818f, 0.0891f, 2.7600f, 0.8900f, 0.4100f, 0.3548f, 0.0290f, { 0.0000f, 0.0000f, -0.0000f }, 0.8913f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.1300f, 0.1700f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CITY_UNDERPASS \ | ||||
|     { 1.0000f, 0.8200f, 0.3162f, 0.4467f, 0.8913f, 3.5700f, 1.1200f, 0.9100f, 0.3981f, 0.0590f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0370f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.1400f, 0.2500f, 0.0000f, 0.9920f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CITY_ABANDONED \ | ||||
|     { 1.0000f, 0.6900f, 0.3162f, 0.7943f, 0.8913f, 3.2800f, 1.1700f, 0.9100f, 0.4467f, 0.0440f, { 0.0000f, 0.0000f, 0.0000f }, 0.2818f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2000f, 0.2500f, 0.0000f, 0.9966f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| /* Misc. Presets */ | ||||
|  | ||||
| #define EFX_REVERB_PRESET_DUSTYROOM \ | ||||
|     { 0.3645f, 0.5600f, 0.3162f, 0.7943f, 0.7079f, 1.7900f, 0.3800f, 0.2100f, 0.5012f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0060f, { 0.0000f, 0.0000f, 0.0000f }, 0.2020f, 0.0500f, 0.2500f, 0.0000f, 0.9886f, 13046.0000f, 163.3000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_CHAPEL \ | ||||
|     { 1.0000f, 0.8400f, 0.3162f, 0.5623f, 1.0000f, 4.6200f, 0.6400f, 1.2300f, 0.4467f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.1100f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } | ||||
|  | ||||
| #define EFX_REVERB_PRESET_SMALLWATERROOM \ | ||||
|     { 1.0000f, 0.7000f, 0.3162f, 0.4477f, 1.0000f, 1.5100f, 1.2500f, 1.1400f, 0.8913f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1790f, 0.1500f, 0.8950f, 0.1900f, 0.9920f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } | ||||
|  | ||||
| #endif /* EFX_PRESETS_H */ | ||||
							
								
								
									
										761
									
								
								external/openal_soft/include/AL/efx.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,761 @@ | ||||
| #ifndef AL_EFX_H | ||||
| #define AL_EFX_H | ||||
|  | ||||
|  | ||||
| #include "alc.h" | ||||
| #include "al.h" | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #define ALC_EXT_EFX_NAME                         "ALC_EXT_EFX" | ||||
|  | ||||
| #define ALC_EFX_MAJOR_VERSION                    0x20001 | ||||
| #define ALC_EFX_MINOR_VERSION                    0x20002 | ||||
| #define ALC_MAX_AUXILIARY_SENDS                  0x20003 | ||||
|  | ||||
|  | ||||
| /* Listener properties. */ | ||||
| #define AL_METERS_PER_UNIT                       0x20004 | ||||
|  | ||||
| /* Source properties. */ | ||||
| #define AL_DIRECT_FILTER                         0x20005 | ||||
| #define AL_AUXILIARY_SEND_FILTER                 0x20006 | ||||
| #define AL_AIR_ABSORPTION_FACTOR                 0x20007 | ||||
| #define AL_ROOM_ROLLOFF_FACTOR                   0x20008 | ||||
| #define AL_CONE_OUTER_GAINHF                     0x20009 | ||||
| #define AL_DIRECT_FILTER_GAINHF_AUTO             0x2000A | ||||
| #define AL_AUXILIARY_SEND_FILTER_GAIN_AUTO       0x2000B | ||||
| #define AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO     0x2000C | ||||
|  | ||||
|  | ||||
| /* Effect properties. */ | ||||
|  | ||||
| /* Reverb effect parameters */ | ||||
| #define AL_REVERB_DENSITY                        0x0001 | ||||
| #define AL_REVERB_DIFFUSION                      0x0002 | ||||
| #define AL_REVERB_GAIN                           0x0003 | ||||
| #define AL_REVERB_GAINHF                         0x0004 | ||||
| #define AL_REVERB_DECAY_TIME                     0x0005 | ||||
| #define AL_REVERB_DECAY_HFRATIO                  0x0006 | ||||
| #define AL_REVERB_REFLECTIONS_GAIN               0x0007 | ||||
| #define AL_REVERB_REFLECTIONS_DELAY              0x0008 | ||||
| #define AL_REVERB_LATE_REVERB_GAIN               0x0009 | ||||
| #define AL_REVERB_LATE_REVERB_DELAY              0x000A | ||||
| #define AL_REVERB_AIR_ABSORPTION_GAINHF          0x000B | ||||
| #define AL_REVERB_ROOM_ROLLOFF_FACTOR            0x000C | ||||
| #define AL_REVERB_DECAY_HFLIMIT                  0x000D | ||||
|  | ||||
| /* EAX Reverb effect parameters */ | ||||
| #define AL_EAXREVERB_DENSITY                     0x0001 | ||||
| #define AL_EAXREVERB_DIFFUSION                   0x0002 | ||||
| #define AL_EAXREVERB_GAIN                        0x0003 | ||||
| #define AL_EAXREVERB_GAINHF                      0x0004 | ||||
| #define AL_EAXREVERB_GAINLF                      0x0005 | ||||
| #define AL_EAXREVERB_DECAY_TIME                  0x0006 | ||||
| #define AL_EAXREVERB_DECAY_HFRATIO               0x0007 | ||||
| #define AL_EAXREVERB_DECAY_LFRATIO               0x0008 | ||||
| #define AL_EAXREVERB_REFLECTIONS_GAIN            0x0009 | ||||
| #define AL_EAXREVERB_REFLECTIONS_DELAY           0x000A | ||||
| #define AL_EAXREVERB_REFLECTIONS_PAN             0x000B | ||||
| #define AL_EAXREVERB_LATE_REVERB_GAIN            0x000C | ||||
| #define AL_EAXREVERB_LATE_REVERB_DELAY           0x000D | ||||
| #define AL_EAXREVERB_LATE_REVERB_PAN             0x000E | ||||
| #define AL_EAXREVERB_ECHO_TIME                   0x000F | ||||
| #define AL_EAXREVERB_ECHO_DEPTH                  0x0010 | ||||
| #define AL_EAXREVERB_MODULATION_TIME             0x0011 | ||||
| #define AL_EAXREVERB_MODULATION_DEPTH            0x0012 | ||||
| #define AL_EAXREVERB_AIR_ABSORPTION_GAINHF       0x0013 | ||||
| #define AL_EAXREVERB_HFREFERENCE                 0x0014 | ||||
| #define AL_EAXREVERB_LFREFERENCE                 0x0015 | ||||
| #define AL_EAXREVERB_ROOM_ROLLOFF_FACTOR         0x0016 | ||||
| #define AL_EAXREVERB_DECAY_HFLIMIT               0x0017 | ||||
|  | ||||
| /* Chorus effect parameters */ | ||||
| #define AL_CHORUS_WAVEFORM                       0x0001 | ||||
| #define AL_CHORUS_PHASE                          0x0002 | ||||
| #define AL_CHORUS_RATE                           0x0003 | ||||
| #define AL_CHORUS_DEPTH                          0x0004 | ||||
| #define AL_CHORUS_FEEDBACK                       0x0005 | ||||
| #define AL_CHORUS_DELAY                          0x0006 | ||||
|  | ||||
| /* Distortion effect parameters */ | ||||
| #define AL_DISTORTION_EDGE                       0x0001 | ||||
| #define AL_DISTORTION_GAIN                       0x0002 | ||||
| #define AL_DISTORTION_LOWPASS_CUTOFF             0x0003 | ||||
| #define AL_DISTORTION_EQCENTER                   0x0004 | ||||
| #define AL_DISTORTION_EQBANDWIDTH                0x0005 | ||||
|  | ||||
| /* Echo effect parameters */ | ||||
| #define AL_ECHO_DELAY                            0x0001 | ||||
| #define AL_ECHO_LRDELAY                          0x0002 | ||||
| #define AL_ECHO_DAMPING                          0x0003 | ||||
| #define AL_ECHO_FEEDBACK                         0x0004 | ||||
| #define AL_ECHO_SPREAD                           0x0005 | ||||
|  | ||||
| /* Flanger effect parameters */ | ||||
| #define AL_FLANGER_WAVEFORM                      0x0001 | ||||
| #define AL_FLANGER_PHASE                         0x0002 | ||||
| #define AL_FLANGER_RATE                          0x0003 | ||||
| #define AL_FLANGER_DEPTH                         0x0004 | ||||
| #define AL_FLANGER_FEEDBACK                      0x0005 | ||||
| #define AL_FLANGER_DELAY                         0x0006 | ||||
|  | ||||
| /* Frequency shifter effect parameters */ | ||||
| #define AL_FREQUENCY_SHIFTER_FREQUENCY           0x0001 | ||||
| #define AL_FREQUENCY_SHIFTER_LEFT_DIRECTION      0x0002 | ||||
| #define AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION     0x0003 | ||||
|  | ||||
| /* Vocal morpher effect parameters */ | ||||
| #define AL_VOCAL_MORPHER_PHONEMEA                0x0001 | ||||
| #define AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING  0x0002 | ||||
| #define AL_VOCAL_MORPHER_PHONEMEB                0x0003 | ||||
| #define AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING  0x0004 | ||||
| #define AL_VOCAL_MORPHER_WAVEFORM                0x0005 | ||||
| #define AL_VOCAL_MORPHER_RATE                    0x0006 | ||||
|  | ||||
| /* Pitchshifter effect parameters */ | ||||
| #define AL_PITCH_SHIFTER_COARSE_TUNE             0x0001 | ||||
| #define AL_PITCH_SHIFTER_FINE_TUNE               0x0002 | ||||
|  | ||||
| /* Ringmodulator effect parameters */ | ||||
| #define AL_RING_MODULATOR_FREQUENCY              0x0001 | ||||
| #define AL_RING_MODULATOR_HIGHPASS_CUTOFF        0x0002 | ||||
| #define AL_RING_MODULATOR_WAVEFORM               0x0003 | ||||
|  | ||||
| /* Autowah effect parameters */ | ||||
| #define AL_AUTOWAH_ATTACK_TIME                   0x0001 | ||||
| #define AL_AUTOWAH_RELEASE_TIME                  0x0002 | ||||
| #define AL_AUTOWAH_RESONANCE                     0x0003 | ||||
| #define AL_AUTOWAH_PEAK_GAIN                     0x0004 | ||||
|  | ||||
| /* Compressor effect parameters */ | ||||
| #define AL_COMPRESSOR_ONOFF                      0x0001 | ||||
|  | ||||
| /* Equalizer effect parameters */ | ||||
| #define AL_EQUALIZER_LOW_GAIN                    0x0001 | ||||
| #define AL_EQUALIZER_LOW_CUTOFF                  0x0002 | ||||
| #define AL_EQUALIZER_MID1_GAIN                   0x0003 | ||||
| #define AL_EQUALIZER_MID1_CENTER                 0x0004 | ||||
| #define AL_EQUALIZER_MID1_WIDTH                  0x0005 | ||||
| #define AL_EQUALIZER_MID2_GAIN                   0x0006 | ||||
| #define AL_EQUALIZER_MID2_CENTER                 0x0007 | ||||
| #define AL_EQUALIZER_MID2_WIDTH                  0x0008 | ||||
| #define AL_EQUALIZER_HIGH_GAIN                   0x0009 | ||||
| #define AL_EQUALIZER_HIGH_CUTOFF                 0x000A | ||||
|  | ||||
| /* Effect type */ | ||||
| #define AL_EFFECT_FIRST_PARAMETER                0x0000 | ||||
| #define AL_EFFECT_LAST_PARAMETER                 0x8000 | ||||
| #define AL_EFFECT_TYPE                           0x8001 | ||||
|  | ||||
| /* Effect types, used with the AL_EFFECT_TYPE property */ | ||||
| #define AL_EFFECT_NULL                           0x0000 | ||||
| #define AL_EFFECT_REVERB                         0x0001 | ||||
| #define AL_EFFECT_CHORUS                         0x0002 | ||||
| #define AL_EFFECT_DISTORTION                     0x0003 | ||||
| #define AL_EFFECT_ECHO                           0x0004 | ||||
| #define AL_EFFECT_FLANGER                        0x0005 | ||||
| #define AL_EFFECT_FREQUENCY_SHIFTER              0x0006 | ||||
| #define AL_EFFECT_VOCAL_MORPHER                  0x0007 | ||||
| #define AL_EFFECT_PITCH_SHIFTER                  0x0008 | ||||
| #define AL_EFFECT_RING_MODULATOR                 0x0009 | ||||
| #define AL_EFFECT_AUTOWAH                        0x000A | ||||
| #define AL_EFFECT_COMPRESSOR                     0x000B | ||||
| #define AL_EFFECT_EQUALIZER                      0x000C | ||||
| #define AL_EFFECT_EAXREVERB                      0x8000 | ||||
|  | ||||
| /* Auxiliary Effect Slot properties. */ | ||||
| #define AL_EFFECTSLOT_EFFECT                     0x0001 | ||||
| #define AL_EFFECTSLOT_GAIN                       0x0002 | ||||
| #define AL_EFFECTSLOT_AUXILIARY_SEND_AUTO        0x0003 | ||||
|  | ||||
| /* NULL Auxiliary Slot ID to disable a source send. */ | ||||
| #define AL_EFFECTSLOT_NULL                       0x0000 | ||||
|  | ||||
|  | ||||
| /* Filter properties. */ | ||||
|  | ||||
| /* Lowpass filter parameters */ | ||||
| #define AL_LOWPASS_GAIN                          0x0001 | ||||
| #define AL_LOWPASS_GAINHF                        0x0002 | ||||
|  | ||||
| /* Highpass filter parameters */ | ||||
| #define AL_HIGHPASS_GAIN                         0x0001 | ||||
| #define AL_HIGHPASS_GAINLF                       0x0002 | ||||
|  | ||||
| /* Bandpass filter parameters */ | ||||
| #define AL_BANDPASS_GAIN                         0x0001 | ||||
| #define AL_BANDPASS_GAINLF                       0x0002 | ||||
| #define AL_BANDPASS_GAINHF                       0x0003 | ||||
|  | ||||
| /* Filter type */ | ||||
| #define AL_FILTER_FIRST_PARAMETER                0x0000 | ||||
| #define AL_FILTER_LAST_PARAMETER                 0x8000 | ||||
| #define AL_FILTER_TYPE                           0x8001 | ||||
|  | ||||
| /* Filter types, used with the AL_FILTER_TYPE property */ | ||||
| #define AL_FILTER_NULL                           0x0000 | ||||
| #define AL_FILTER_LOWPASS                        0x0001 | ||||
| #define AL_FILTER_HIGHPASS                       0x0002 | ||||
| #define AL_FILTER_BANDPASS                       0x0003 | ||||
|  | ||||
|  | ||||
| /* Effect object function types. */ | ||||
| typedef void (AL_APIENTRY *LPALGENEFFECTS)(ALsizei, ALuint*); | ||||
| typedef void (AL_APIENTRY *LPALDELETEEFFECTS)(ALsizei, const ALuint*); | ||||
| typedef ALboolean (AL_APIENTRY *LPALISEFFECT)(ALuint); | ||||
| typedef void (AL_APIENTRY *LPALEFFECTI)(ALuint, ALenum, ALint); | ||||
| typedef void (AL_APIENTRY *LPALEFFECTIV)(ALuint, ALenum, const ALint*); | ||||
| typedef void (AL_APIENTRY *LPALEFFECTF)(ALuint, ALenum, ALfloat); | ||||
| typedef void (AL_APIENTRY *LPALEFFECTFV)(ALuint, ALenum, const ALfloat*); | ||||
| typedef void (AL_APIENTRY *LPALGETEFFECTI)(ALuint, ALenum, ALint*); | ||||
| typedef void (AL_APIENTRY *LPALGETEFFECTIV)(ALuint, ALenum, ALint*); | ||||
| typedef void (AL_APIENTRY *LPALGETEFFECTF)(ALuint, ALenum, ALfloat*); | ||||
| typedef void (AL_APIENTRY *LPALGETEFFECTFV)(ALuint, ALenum, ALfloat*); | ||||
|  | ||||
| /* Filter object function types. */ | ||||
| typedef void (AL_APIENTRY *LPALGENFILTERS)(ALsizei, ALuint*); | ||||
| typedef void (AL_APIENTRY *LPALDELETEFILTERS)(ALsizei, const ALuint*); | ||||
| typedef ALboolean (AL_APIENTRY *LPALISFILTER)(ALuint); | ||||
| typedef void (AL_APIENTRY *LPALFILTERI)(ALuint, ALenum, ALint); | ||||
| typedef void (AL_APIENTRY *LPALFILTERIV)(ALuint, ALenum, const ALint*); | ||||
| typedef void (AL_APIENTRY *LPALFILTERF)(ALuint, ALenum, ALfloat); | ||||
| typedef void (AL_APIENTRY *LPALFILTERFV)(ALuint, ALenum, const ALfloat*); | ||||
| typedef void (AL_APIENTRY *LPALGETFILTERI)(ALuint, ALenum, ALint*); | ||||
| typedef void (AL_APIENTRY *LPALGETFILTERIV)(ALuint, ALenum, ALint*); | ||||
| typedef void (AL_APIENTRY *LPALGETFILTERF)(ALuint, ALenum, ALfloat*); | ||||
| typedef void (AL_APIENTRY *LPALGETFILTERFV)(ALuint, ALenum, ALfloat*); | ||||
|  | ||||
| /* Auxiliary Effect Slot object function types. */ | ||||
| typedef void (AL_APIENTRY *LPALGENAUXILIARYEFFECTSLOTS)(ALsizei, ALuint*); | ||||
| typedef void (AL_APIENTRY *LPALDELETEAUXILIARYEFFECTSLOTS)(ALsizei, const ALuint*); | ||||
| typedef ALboolean (AL_APIENTRY *LPALISAUXILIARYEFFECTSLOT)(ALuint); | ||||
| typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTI)(ALuint, ALenum, ALint); | ||||
| typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTIV)(ALuint, ALenum, const ALint*); | ||||
| typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat); | ||||
| typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, const ALfloat*); | ||||
| typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTI)(ALuint, ALenum, ALint*); | ||||
| typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTIV)(ALuint, ALenum, ALint*); | ||||
| typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat*); | ||||
| typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, ALfloat*); | ||||
|  | ||||
| #ifdef AL_ALEXT_PROTOTYPES | ||||
| AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects); | ||||
| AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects); | ||||
| AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect); | ||||
| AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue); | ||||
| AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *piValues); | ||||
| AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue); | ||||
| AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *pflValues); | ||||
| AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue); | ||||
| AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues); | ||||
| AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue); | ||||
| AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues); | ||||
|  | ||||
| AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters); | ||||
| AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters); | ||||
| AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter); | ||||
| AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue); | ||||
| AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *piValues); | ||||
| AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue); | ||||
| AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *pflValues); | ||||
| AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue); | ||||
| AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues); | ||||
| AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue); | ||||
| AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues); | ||||
|  | ||||
| AL_API ALvoid AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots); | ||||
| AL_API ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint *effectslots); | ||||
| AL_API ALboolean AL_APIENTRY alIsAuxiliaryEffectSlot(ALuint effectslot); | ||||
| AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint iValue); | ||||
| AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, const ALint *piValues); | ||||
| AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat flValue); | ||||
| AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, const ALfloat *pflValues); | ||||
| AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *piValue); | ||||
| AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *piValues); | ||||
| AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *pflValue); | ||||
| AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *pflValues); | ||||
| #endif | ||||
|  | ||||
| /* Filter ranges and defaults. */ | ||||
|  | ||||
| /* Lowpass filter */ | ||||
| #define AL_LOWPASS_MIN_GAIN                      (0.0f) | ||||
| #define AL_LOWPASS_MAX_GAIN                      (1.0f) | ||||
| #define AL_LOWPASS_DEFAULT_GAIN                  (1.0f) | ||||
|  | ||||
| #define AL_LOWPASS_MIN_GAINHF                    (0.0f) | ||||
| #define AL_LOWPASS_MAX_GAINHF                    (1.0f) | ||||
| #define AL_LOWPASS_DEFAULT_GAINHF                (1.0f) | ||||
|  | ||||
| /* Highpass filter */ | ||||
| #define AL_HIGHPASS_MIN_GAIN                     (0.0f) | ||||
| #define AL_HIGHPASS_MAX_GAIN                     (1.0f) | ||||
| #define AL_HIGHPASS_DEFAULT_GAIN                 (1.0f) | ||||
|  | ||||
| #define AL_HIGHPASS_MIN_GAINLF                   (0.0f) | ||||
| #define AL_HIGHPASS_MAX_GAINLF                   (1.0f) | ||||
| #define AL_HIGHPASS_DEFAULT_GAINLF               (1.0f) | ||||
|  | ||||
| /* Bandpass filter */ | ||||
| #define AL_BANDPASS_MIN_GAIN                     (0.0f) | ||||
| #define AL_BANDPASS_MAX_GAIN                     (1.0f) | ||||
| #define AL_BANDPASS_DEFAULT_GAIN                 (1.0f) | ||||
|  | ||||
| #define AL_BANDPASS_MIN_GAINHF                   (0.0f) | ||||
| #define AL_BANDPASS_MAX_GAINHF                   (1.0f) | ||||
| #define AL_BANDPASS_DEFAULT_GAINHF               (1.0f) | ||||
|  | ||||
| #define AL_BANDPASS_MIN_GAINLF                   (0.0f) | ||||
| #define AL_BANDPASS_MAX_GAINLF                   (1.0f) | ||||
| #define AL_BANDPASS_DEFAULT_GAINLF               (1.0f) | ||||
|  | ||||
|  | ||||
| /* Effect parameter ranges and defaults. */ | ||||
|  | ||||
| /* Standard reverb effect */ | ||||
| #define AL_REVERB_MIN_DENSITY                    (0.0f) | ||||
| #define AL_REVERB_MAX_DENSITY                    (1.0f) | ||||
| #define AL_REVERB_DEFAULT_DENSITY                (1.0f) | ||||
|  | ||||
| #define AL_REVERB_MIN_DIFFUSION                  (0.0f) | ||||
| #define AL_REVERB_MAX_DIFFUSION                  (1.0f) | ||||
| #define AL_REVERB_DEFAULT_DIFFUSION              (1.0f) | ||||
|  | ||||
| #define AL_REVERB_MIN_GAIN                       (0.0f) | ||||
| #define AL_REVERB_MAX_GAIN                       (1.0f) | ||||
| #define AL_REVERB_DEFAULT_GAIN                   (0.32f) | ||||
|  | ||||
| #define AL_REVERB_MIN_GAINHF                     (0.0f) | ||||
| #define AL_REVERB_MAX_GAINHF                     (1.0f) | ||||
| #define AL_REVERB_DEFAULT_GAINHF                 (0.89f) | ||||
|  | ||||
| #define AL_REVERB_MIN_DECAY_TIME                 (0.1f) | ||||
| #define AL_REVERB_MAX_DECAY_TIME                 (20.0f) | ||||
| #define AL_REVERB_DEFAULT_DECAY_TIME             (1.49f) | ||||
|  | ||||
| #define AL_REVERB_MIN_DECAY_HFRATIO              (0.1f) | ||||
| #define AL_REVERB_MAX_DECAY_HFRATIO              (2.0f) | ||||
| #define AL_REVERB_DEFAULT_DECAY_HFRATIO          (0.83f) | ||||
|  | ||||
| #define AL_REVERB_MIN_REFLECTIONS_GAIN           (0.0f) | ||||
| #define AL_REVERB_MAX_REFLECTIONS_GAIN           (3.16f) | ||||
| #define AL_REVERB_DEFAULT_REFLECTIONS_GAIN       (0.05f) | ||||
|  | ||||
| #define AL_REVERB_MIN_REFLECTIONS_DELAY          (0.0f) | ||||
| #define AL_REVERB_MAX_REFLECTIONS_DELAY          (0.3f) | ||||
| #define AL_REVERB_DEFAULT_REFLECTIONS_DELAY      (0.007f) | ||||
|  | ||||
| #define AL_REVERB_MIN_LATE_REVERB_GAIN           (0.0f) | ||||
| #define AL_REVERB_MAX_LATE_REVERB_GAIN           (10.0f) | ||||
| #define AL_REVERB_DEFAULT_LATE_REVERB_GAIN       (1.26f) | ||||
|  | ||||
| #define AL_REVERB_MIN_LATE_REVERB_DELAY          (0.0f) | ||||
| #define AL_REVERB_MAX_LATE_REVERB_DELAY          (0.1f) | ||||
| #define AL_REVERB_DEFAULT_LATE_REVERB_DELAY      (0.011f) | ||||
|  | ||||
| #define AL_REVERB_MIN_AIR_ABSORPTION_GAINHF      (0.892f) | ||||
| #define AL_REVERB_MAX_AIR_ABSORPTION_GAINHF      (1.0f) | ||||
| #define AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF  (0.994f) | ||||
|  | ||||
| #define AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR        (0.0f) | ||||
| #define AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR        (10.0f) | ||||
| #define AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR    (0.0f) | ||||
|  | ||||
| #define AL_REVERB_MIN_DECAY_HFLIMIT              AL_FALSE | ||||
| #define AL_REVERB_MAX_DECAY_HFLIMIT              AL_TRUE | ||||
| #define AL_REVERB_DEFAULT_DECAY_HFLIMIT          AL_TRUE | ||||
|  | ||||
| /* EAX reverb effect */ | ||||
| #define AL_EAXREVERB_MIN_DENSITY                 (0.0f) | ||||
| #define AL_EAXREVERB_MAX_DENSITY                 (1.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_DENSITY             (1.0f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_DIFFUSION               (0.0f) | ||||
| #define AL_EAXREVERB_MAX_DIFFUSION               (1.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_DIFFUSION           (1.0f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_GAIN                    (0.0f) | ||||
| #define AL_EAXREVERB_MAX_GAIN                    (1.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_GAIN                (0.32f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_GAINHF                  (0.0f) | ||||
| #define AL_EAXREVERB_MAX_GAINHF                  (1.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_GAINHF              (0.89f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_GAINLF                  (0.0f) | ||||
| #define AL_EAXREVERB_MAX_GAINLF                  (1.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_GAINLF              (1.0f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_DECAY_TIME              (0.1f) | ||||
| #define AL_EAXREVERB_MAX_DECAY_TIME              (20.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_DECAY_TIME          (1.49f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_DECAY_HFRATIO           (0.1f) | ||||
| #define AL_EAXREVERB_MAX_DECAY_HFRATIO           (2.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_DECAY_HFRATIO       (0.83f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_DECAY_LFRATIO           (0.1f) | ||||
| #define AL_EAXREVERB_MAX_DECAY_LFRATIO           (2.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_DECAY_LFRATIO       (1.0f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_REFLECTIONS_GAIN        (0.0f) | ||||
| #define AL_EAXREVERB_MAX_REFLECTIONS_GAIN        (3.16f) | ||||
| #define AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN    (0.05f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_REFLECTIONS_DELAY       (0.0f) | ||||
| #define AL_EAXREVERB_MAX_REFLECTIONS_DELAY       (0.3f) | ||||
| #define AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY   (0.007f) | ||||
|  | ||||
| #define AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ (0.0f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_LATE_REVERB_GAIN        (0.0f) | ||||
| #define AL_EAXREVERB_MAX_LATE_REVERB_GAIN        (10.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN    (1.26f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_LATE_REVERB_DELAY       (0.0f) | ||||
| #define AL_EAXREVERB_MAX_LATE_REVERB_DELAY       (0.1f) | ||||
| #define AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY   (0.011f) | ||||
|  | ||||
| #define AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ (0.0f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_ECHO_TIME               (0.075f) | ||||
| #define AL_EAXREVERB_MAX_ECHO_TIME               (0.25f) | ||||
| #define AL_EAXREVERB_DEFAULT_ECHO_TIME           (0.25f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_ECHO_DEPTH              (0.0f) | ||||
| #define AL_EAXREVERB_MAX_ECHO_DEPTH              (1.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_ECHO_DEPTH          (0.0f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_MODULATION_TIME         (0.04f) | ||||
| #define AL_EAXREVERB_MAX_MODULATION_TIME         (4.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_MODULATION_TIME     (0.25f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_MODULATION_DEPTH        (0.0f) | ||||
| #define AL_EAXREVERB_MAX_MODULATION_DEPTH        (1.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_MODULATION_DEPTH    (0.0f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF   (0.892f) | ||||
| #define AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF   (1.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF (0.994f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_HFREFERENCE             (1000.0f) | ||||
| #define AL_EAXREVERB_MAX_HFREFERENCE             (20000.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_HFREFERENCE         (5000.0f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_LFREFERENCE             (20.0f) | ||||
| #define AL_EAXREVERB_MAX_LFREFERENCE             (1000.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_LFREFERENCE         (250.0f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR     (0.0f) | ||||
| #define AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR     (10.0f) | ||||
| #define AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) | ||||
|  | ||||
| #define AL_EAXREVERB_MIN_DECAY_HFLIMIT           AL_FALSE | ||||
| #define AL_EAXREVERB_MAX_DECAY_HFLIMIT           AL_TRUE | ||||
| #define AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT       AL_TRUE | ||||
|  | ||||
| /* Chorus effect */ | ||||
| #define AL_CHORUS_WAVEFORM_SINUSOID              (0) | ||||
| #define AL_CHORUS_WAVEFORM_TRIANGLE              (1) | ||||
|  | ||||
| #define AL_CHORUS_MIN_WAVEFORM                   (0) | ||||
| #define AL_CHORUS_MAX_WAVEFORM                   (1) | ||||
| #define AL_CHORUS_DEFAULT_WAVEFORM               (1) | ||||
|  | ||||
| #define AL_CHORUS_MIN_PHASE                      (-180) | ||||
| #define AL_CHORUS_MAX_PHASE                      (180) | ||||
| #define AL_CHORUS_DEFAULT_PHASE                  (90) | ||||
|  | ||||
| #define AL_CHORUS_MIN_RATE                       (0.0f) | ||||
| #define AL_CHORUS_MAX_RATE                       (10.0f) | ||||
| #define AL_CHORUS_DEFAULT_RATE                   (1.1f) | ||||
|  | ||||
| #define AL_CHORUS_MIN_DEPTH                      (0.0f) | ||||
| #define AL_CHORUS_MAX_DEPTH                      (1.0f) | ||||
| #define AL_CHORUS_DEFAULT_DEPTH                  (0.1f) | ||||
|  | ||||
| #define AL_CHORUS_MIN_FEEDBACK                   (-1.0f) | ||||
| #define AL_CHORUS_MAX_FEEDBACK                   (1.0f) | ||||
| #define AL_CHORUS_DEFAULT_FEEDBACK               (0.25f) | ||||
|  | ||||
| #define AL_CHORUS_MIN_DELAY                      (0.0f) | ||||
| #define AL_CHORUS_MAX_DELAY                      (0.016f) | ||||
| #define AL_CHORUS_DEFAULT_DELAY                  (0.016f) | ||||
|  | ||||
| /* Distortion effect */ | ||||
| #define AL_DISTORTION_MIN_EDGE                   (0.0f) | ||||
| #define AL_DISTORTION_MAX_EDGE                   (1.0f) | ||||
| #define AL_DISTORTION_DEFAULT_EDGE               (0.2f) | ||||
|  | ||||
| #define AL_DISTORTION_MIN_GAIN                   (0.01f) | ||||
| #define AL_DISTORTION_MAX_GAIN                   (1.0f) | ||||
| #define AL_DISTORTION_DEFAULT_GAIN               (0.05f) | ||||
|  | ||||
| #define AL_DISTORTION_MIN_LOWPASS_CUTOFF         (80.0f) | ||||
| #define AL_DISTORTION_MAX_LOWPASS_CUTOFF         (24000.0f) | ||||
| #define AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF     (8000.0f) | ||||
|  | ||||
| #define AL_DISTORTION_MIN_EQCENTER               (80.0f) | ||||
| #define AL_DISTORTION_MAX_EQCENTER               (24000.0f) | ||||
| #define AL_DISTORTION_DEFAULT_EQCENTER           (3600.0f) | ||||
|  | ||||
| #define AL_DISTORTION_MIN_EQBANDWIDTH            (80.0f) | ||||
| #define AL_DISTORTION_MAX_EQBANDWIDTH            (24000.0f) | ||||
| #define AL_DISTORTION_DEFAULT_EQBANDWIDTH        (3600.0f) | ||||
|  | ||||
| /* Echo effect */ | ||||
| #define AL_ECHO_MIN_DELAY                        (0.0f) | ||||
| #define AL_ECHO_MAX_DELAY                        (0.207f) | ||||
| #define AL_ECHO_DEFAULT_DELAY                    (0.1f) | ||||
|  | ||||
| #define AL_ECHO_MIN_LRDELAY                      (0.0f) | ||||
| #define AL_ECHO_MAX_LRDELAY                      (0.404f) | ||||
| #define AL_ECHO_DEFAULT_LRDELAY                  (0.1f) | ||||
|  | ||||
| #define AL_ECHO_MIN_DAMPING                      (0.0f) | ||||
| #define AL_ECHO_MAX_DAMPING                      (0.99f) | ||||
| #define AL_ECHO_DEFAULT_DAMPING                  (0.5f) | ||||
|  | ||||
| #define AL_ECHO_MIN_FEEDBACK                     (0.0f) | ||||
| #define AL_ECHO_MAX_FEEDBACK                     (1.0f) | ||||
| #define AL_ECHO_DEFAULT_FEEDBACK                 (0.5f) | ||||
|  | ||||
| #define AL_ECHO_MIN_SPREAD                       (-1.0f) | ||||
| #define AL_ECHO_MAX_SPREAD                       (1.0f) | ||||
| #define AL_ECHO_DEFAULT_SPREAD                   (-1.0f) | ||||
|  | ||||
| /* Flanger effect */ | ||||
| #define AL_FLANGER_WAVEFORM_SINUSOID             (0) | ||||
| #define AL_FLANGER_WAVEFORM_TRIANGLE             (1) | ||||
|  | ||||
| #define AL_FLANGER_MIN_WAVEFORM                  (0) | ||||
| #define AL_FLANGER_MAX_WAVEFORM                  (1) | ||||
| #define AL_FLANGER_DEFAULT_WAVEFORM              (1) | ||||
|  | ||||
| #define AL_FLANGER_MIN_PHASE                     (-180) | ||||
| #define AL_FLANGER_MAX_PHASE                     (180) | ||||
| #define AL_FLANGER_DEFAULT_PHASE                 (0) | ||||
|  | ||||
| #define AL_FLANGER_MIN_RATE                      (0.0f) | ||||
| #define AL_FLANGER_MAX_RATE                      (10.0f) | ||||
| #define AL_FLANGER_DEFAULT_RATE                  (0.27f) | ||||
|  | ||||
| #define AL_FLANGER_MIN_DEPTH                     (0.0f) | ||||
| #define AL_FLANGER_MAX_DEPTH                     (1.0f) | ||||
| #define AL_FLANGER_DEFAULT_DEPTH                 (1.0f) | ||||
|  | ||||
| #define AL_FLANGER_MIN_FEEDBACK                  (-1.0f) | ||||
| #define AL_FLANGER_MAX_FEEDBACK                  (1.0f) | ||||
| #define AL_FLANGER_DEFAULT_FEEDBACK              (-0.5f) | ||||
|  | ||||
| #define AL_FLANGER_MIN_DELAY                     (0.0f) | ||||
| #define AL_FLANGER_MAX_DELAY                     (0.004f) | ||||
| #define AL_FLANGER_DEFAULT_DELAY                 (0.002f) | ||||
|  | ||||
| /* Frequency shifter effect */ | ||||
| #define AL_FREQUENCY_SHIFTER_MIN_FREQUENCY       (0.0f) | ||||
| #define AL_FREQUENCY_SHIFTER_MAX_FREQUENCY       (24000.0f) | ||||
| #define AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY   (0.0f) | ||||
|  | ||||
| #define AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION  (0) | ||||
| #define AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION  (2) | ||||
| #define AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION (0) | ||||
|  | ||||
| #define AL_FREQUENCY_SHIFTER_DIRECTION_DOWN      (0) | ||||
| #define AL_FREQUENCY_SHIFTER_DIRECTION_UP        (1) | ||||
| #define AL_FREQUENCY_SHIFTER_DIRECTION_OFF       (2) | ||||
|  | ||||
| #define AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION (0) | ||||
| #define AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION (2) | ||||
| #define AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION (0) | ||||
|  | ||||
| /* Vocal morpher effect */ | ||||
| #define AL_VOCAL_MORPHER_MIN_PHONEMEA            (0) | ||||
| #define AL_VOCAL_MORPHER_MAX_PHONEMEA            (29) | ||||
| #define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA        (0) | ||||
|  | ||||
| #define AL_VOCAL_MORPHER_MIN_PHONEMEA_COARSE_TUNING (-24) | ||||
| #define AL_VOCAL_MORPHER_MAX_PHONEMEA_COARSE_TUNING (24) | ||||
| #define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA_COARSE_TUNING (0) | ||||
|  | ||||
| #define AL_VOCAL_MORPHER_MIN_PHONEMEB            (0) | ||||
| #define AL_VOCAL_MORPHER_MAX_PHONEMEB            (29) | ||||
| #define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB        (10) | ||||
|  | ||||
| #define AL_VOCAL_MORPHER_MIN_PHONEMEB_COARSE_TUNING (-24) | ||||
| #define AL_VOCAL_MORPHER_MAX_PHONEMEB_COARSE_TUNING (24) | ||||
| #define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB_COARSE_TUNING (0) | ||||
|  | ||||
| #define AL_VOCAL_MORPHER_PHONEME_A               (0) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_E               (1) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_I               (2) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_O               (3) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_U               (4) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_AA              (5) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_AE              (6) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_AH              (7) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_AO              (8) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_EH              (9) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_ER              (10) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_IH              (11) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_IY              (12) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_UH              (13) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_UW              (14) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_B               (15) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_D               (16) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_F               (17) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_G               (18) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_J               (19) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_K               (20) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_L               (21) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_M               (22) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_N               (23) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_P               (24) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_R               (25) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_S               (26) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_T               (27) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_V               (28) | ||||
| #define AL_VOCAL_MORPHER_PHONEME_Z               (29) | ||||
|  | ||||
| #define AL_VOCAL_MORPHER_WAVEFORM_SINUSOID       (0) | ||||
| #define AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE       (1) | ||||
| #define AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH       (2) | ||||
|  | ||||
| #define AL_VOCAL_MORPHER_MIN_WAVEFORM            (0) | ||||
| #define AL_VOCAL_MORPHER_MAX_WAVEFORM            (2) | ||||
| #define AL_VOCAL_MORPHER_DEFAULT_WAVEFORM        (0) | ||||
|  | ||||
| #define AL_VOCAL_MORPHER_MIN_RATE                (0.0f) | ||||
| #define AL_VOCAL_MORPHER_MAX_RATE                (10.0f) | ||||
| #define AL_VOCAL_MORPHER_DEFAULT_RATE            (1.41f) | ||||
|  | ||||
| /* Pitch shifter effect */ | ||||
| #define AL_PITCH_SHIFTER_MIN_COARSE_TUNE         (-12) | ||||
| #define AL_PITCH_SHIFTER_MAX_COARSE_TUNE         (12) | ||||
| #define AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE     (12) | ||||
|  | ||||
| #define AL_PITCH_SHIFTER_MIN_FINE_TUNE           (-50) | ||||
| #define AL_PITCH_SHIFTER_MAX_FINE_TUNE           (50) | ||||
| #define AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE       (0) | ||||
|  | ||||
| /* Ring modulator effect */ | ||||
| #define AL_RING_MODULATOR_MIN_FREQUENCY          (0.0f) | ||||
| #define AL_RING_MODULATOR_MAX_FREQUENCY          (8000.0f) | ||||
| #define AL_RING_MODULATOR_DEFAULT_FREQUENCY      (440.0f) | ||||
|  | ||||
| #define AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF    (0.0f) | ||||
| #define AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF    (24000.0f) | ||||
| #define AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF (800.0f) | ||||
|  | ||||
| #define AL_RING_MODULATOR_SINUSOID               (0) | ||||
| #define AL_RING_MODULATOR_SAWTOOTH               (1) | ||||
| #define AL_RING_MODULATOR_SQUARE                 (2) | ||||
|  | ||||
| #define AL_RING_MODULATOR_MIN_WAVEFORM           (0) | ||||
| #define AL_RING_MODULATOR_MAX_WAVEFORM           (2) | ||||
| #define AL_RING_MODULATOR_DEFAULT_WAVEFORM       (0) | ||||
|  | ||||
| /* Autowah effect */ | ||||
| #define AL_AUTOWAH_MIN_ATTACK_TIME               (0.0001f) | ||||
| #define AL_AUTOWAH_MAX_ATTACK_TIME               (1.0f) | ||||
| #define AL_AUTOWAH_DEFAULT_ATTACK_TIME           (0.06f) | ||||
|  | ||||
| #define AL_AUTOWAH_MIN_RELEASE_TIME              (0.0001f) | ||||
| #define AL_AUTOWAH_MAX_RELEASE_TIME              (1.0f) | ||||
| #define AL_AUTOWAH_DEFAULT_RELEASE_TIME          (0.06f) | ||||
|  | ||||
| #define AL_AUTOWAH_MIN_RESONANCE                 (2.0f) | ||||
| #define AL_AUTOWAH_MAX_RESONANCE                 (1000.0f) | ||||
| #define AL_AUTOWAH_DEFAULT_RESONANCE             (1000.0f) | ||||
|  | ||||
| #define AL_AUTOWAH_MIN_PEAK_GAIN                 (0.00003f) | ||||
| #define AL_AUTOWAH_MAX_PEAK_GAIN                 (31621.0f) | ||||
| #define AL_AUTOWAH_DEFAULT_PEAK_GAIN             (11.22f) | ||||
|  | ||||
| /* Compressor effect */ | ||||
| #define AL_COMPRESSOR_MIN_ONOFF                  (0) | ||||
| #define AL_COMPRESSOR_MAX_ONOFF                  (1) | ||||
| #define AL_COMPRESSOR_DEFAULT_ONOFF              (1) | ||||
|  | ||||
| /* Equalizer effect */ | ||||
| #define AL_EQUALIZER_MIN_LOW_GAIN                (0.126f) | ||||
| #define AL_EQUALIZER_MAX_LOW_GAIN                (7.943f) | ||||
| #define AL_EQUALIZER_DEFAULT_LOW_GAIN            (1.0f) | ||||
|  | ||||
| #define AL_EQUALIZER_MIN_LOW_CUTOFF              (50.0f) | ||||
| #define AL_EQUALIZER_MAX_LOW_CUTOFF              (800.0f) | ||||
| #define AL_EQUALIZER_DEFAULT_LOW_CUTOFF          (200.0f) | ||||
|  | ||||
| #define AL_EQUALIZER_MIN_MID1_GAIN               (0.126f) | ||||
| #define AL_EQUALIZER_MAX_MID1_GAIN               (7.943f) | ||||
| #define AL_EQUALIZER_DEFAULT_MID1_GAIN           (1.0f) | ||||
|  | ||||
| #define AL_EQUALIZER_MIN_MID1_CENTER             (200.0f) | ||||
| #define AL_EQUALIZER_MAX_MID1_CENTER             (3000.0f) | ||||
| #define AL_EQUALIZER_DEFAULT_MID1_CENTER         (500.0f) | ||||
|  | ||||
| #define AL_EQUALIZER_MIN_MID1_WIDTH              (0.01f) | ||||
| #define AL_EQUALIZER_MAX_MID1_WIDTH              (1.0f) | ||||
| #define AL_EQUALIZER_DEFAULT_MID1_WIDTH          (1.0f) | ||||
|  | ||||
| #define AL_EQUALIZER_MIN_MID2_GAIN               (0.126f) | ||||
| #define AL_EQUALIZER_MAX_MID2_GAIN               (7.943f) | ||||
| #define AL_EQUALIZER_DEFAULT_MID2_GAIN           (1.0f) | ||||
|  | ||||
| #define AL_EQUALIZER_MIN_MID2_CENTER             (1000.0f) | ||||
| #define AL_EQUALIZER_MAX_MID2_CENTER             (8000.0f) | ||||
| #define AL_EQUALIZER_DEFAULT_MID2_CENTER         (3000.0f) | ||||
|  | ||||
| #define AL_EQUALIZER_MIN_MID2_WIDTH              (0.01f) | ||||
| #define AL_EQUALIZER_MAX_MID2_WIDTH              (1.0f) | ||||
| #define AL_EQUALIZER_DEFAULT_MID2_WIDTH          (1.0f) | ||||
|  | ||||
| #define AL_EQUALIZER_MIN_HIGH_GAIN               (0.126f) | ||||
| #define AL_EQUALIZER_MAX_HIGH_GAIN               (7.943f) | ||||
| #define AL_EQUALIZER_DEFAULT_HIGH_GAIN           (1.0f) | ||||
|  | ||||
| #define AL_EQUALIZER_MIN_HIGH_CUTOFF             (4000.0f) | ||||
| #define AL_EQUALIZER_MAX_HIGH_CUTOFF             (16000.0f) | ||||
| #define AL_EQUALIZER_DEFAULT_HIGH_CUTOFF         (6000.0f) | ||||
|  | ||||
|  | ||||
| /* Source parameter value ranges and defaults. */ | ||||
| #define AL_MIN_AIR_ABSORPTION_FACTOR             (0.0f) | ||||
| #define AL_MAX_AIR_ABSORPTION_FACTOR             (10.0f) | ||||
| #define AL_DEFAULT_AIR_ABSORPTION_FACTOR         (0.0f) | ||||
|  | ||||
| #define AL_MIN_ROOM_ROLLOFF_FACTOR               (0.0f) | ||||
| #define AL_MAX_ROOM_ROLLOFF_FACTOR               (10.0f) | ||||
| #define AL_DEFAULT_ROOM_ROLLOFF_FACTOR           (0.0f) | ||||
|  | ||||
| #define AL_MIN_CONE_OUTER_GAINHF                 (0.0f) | ||||
| #define AL_MAX_CONE_OUTER_GAINHF                 (1.0f) | ||||
| #define AL_DEFAULT_CONE_OUTER_GAINHF             (1.0f) | ||||
|  | ||||
| #define AL_MIN_DIRECT_FILTER_GAINHF_AUTO         AL_FALSE | ||||
| #define AL_MAX_DIRECT_FILTER_GAINHF_AUTO         AL_TRUE | ||||
| #define AL_DEFAULT_DIRECT_FILTER_GAINHF_AUTO     AL_TRUE | ||||
|  | ||||
| #define AL_MIN_AUXILIARY_SEND_FILTER_GAIN_AUTO   AL_FALSE | ||||
| #define AL_MAX_AUXILIARY_SEND_FILTER_GAIN_AUTO   AL_TRUE | ||||
| #define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_TRUE | ||||
|  | ||||
| #define AL_MIN_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_FALSE | ||||
| #define AL_MAX_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE | ||||
| #define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE | ||||
|  | ||||
|  | ||||
| /* Listener parameter value ranges and defaults. */ | ||||
| #define AL_MIN_METERS_PER_UNIT                   FLT_MIN | ||||
| #define AL_MAX_METERS_PER_UNIT                   FLT_MAX | ||||
| #define AL_DEFAULT_METERS_PER_UNIT               (1.0f) | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| }  /* extern "C" */ | ||||
| #endif | ||||
|  | ||||
| #endif /* AL_EFX_H */ | ||||
							
								
								
									
										
											BIN
										
									
								
								external/openal_soft/lib/libopenal32.a
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								external/openal_soft/openal32.dll
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								fonts/coming_soon
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								logo/logo128x128.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								logo/logo16x16.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 293 B | 
							
								
								
									
										
											BIN
										
									
								
								logo/logo24x24.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 383 B | 
							
								
								
									
										
											BIN
										
									
								
								logo/logo256x256.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								logo/logo32x32.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 552 B | 
							
								
								
									
										
											BIN
										
									
								
								logo/logo48x4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 922 B | 
							
								
								
									
										
											BIN
										
									
								
								logo/logo64x64.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								logo/raylib.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 103 KiB | 
							
								
								
									
										306
									
								
								src/audio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,306 @@ | ||||
| /********************************************************************************************* | ||||
| * | ||||
| *	raylib.audio | ||||
| * | ||||
| *	Basic functions to manage Audio: InitAudioDevice, LoadAudioFiles, PlayAudioFiles | ||||
| *	 | ||||
| *	Uses external lib:	 | ||||
| *		OpenAL - Audio device management lib | ||||
| *		TODO: stb_vorbis - Ogg audio files loading | ||||
| *        | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| *	 | ||||
| *	This software is provided "as-is", without any express or implied warranty. In no event  | ||||
| *	will the authors be held liable for any damages arising from the use of this software. | ||||
| * | ||||
| *	Permission is granted to anyone to use this software for any purpose, including commercial  | ||||
| *	applications, and to alter it and redistribute it freely, subject to the following restrictions: | ||||
| * | ||||
| *	  1. The origin of this software must not be misrepresented; you must not claim that you  | ||||
| *	  wrote the original software. If you use this software in a product, an acknowledgment  | ||||
| *	  in the product documentation would be appreciated but is not required. | ||||
| * | ||||
| *	  2. Altered source versions must be plainly marked as such, and must not be misrepresented | ||||
| *	  as being the original software. | ||||
| * | ||||
| *	  3. This notice may not be removed or altered from any source distribution. | ||||
| * | ||||
| **********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| #include <AL/al.h>			// OpenAL basic header | ||||
| #include <AL/alc.h>			// OpenAL context header (like OpenGL, OpenAL requires a context to work) | ||||
|  | ||||
| #include <stdlib.h>			// To use exit() function | ||||
| #include <stdio.h>			// Used for .WAV loading | ||||
|  | ||||
| //#include "stb_vorbis.h"	// TODO: OGG loading functions | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Defines and Macros | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Nop... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // Wave file data | ||||
| typedef struct Wave { | ||||
| 	unsigned char *data;		// Buffer data pointer | ||||
| 	unsigned int sampleRate; | ||||
| 	unsigned int dataSize; | ||||
| 	short channels; | ||||
|     short format;	 | ||||
| } Wave; | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Global Variables Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Nop... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Declaration | ||||
| //---------------------------------------------------------------------------------- | ||||
| static Wave LoadWAV(char *fileName); | ||||
| static void UnloadWAV(Wave wave); | ||||
| //static Ogg LoadOGG(char *fileName); | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module Functions Definition - Window and OpenGL Context Functions | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // Initialize audio device and context | ||||
| void InitAudioDevice() | ||||
| { | ||||
| 	// Open and initialize a device with default settings | ||||
| 	ALCdevice *device = alcOpenDevice(NULL); | ||||
| 	 | ||||
| 	if(!device) | ||||
| 	{ | ||||
| 		fprintf(stderr, "Could not open a device!\n"); | ||||
| 		exit(1); | ||||
| 	} | ||||
|  | ||||
| 	ALCcontext *context = alcCreateContext(device, NULL); | ||||
| 	 | ||||
| 	if(context == NULL || alcMakeContextCurrent(context) == ALC_FALSE) | ||||
| 	{ | ||||
| 		if(context != NULL)	alcDestroyContext(context); | ||||
| 		 | ||||
| 		alcCloseDevice(device); | ||||
| 		 | ||||
| 		fprintf(stderr, "Could not set a context!\n"); | ||||
| 		exit(1); | ||||
| 	} | ||||
|  | ||||
| 	printf("Opened \"%s\"\n", alcGetString(device, ALC_DEVICE_SPECIFIER)); | ||||
| 	 | ||||
| 	// Listener definition (just for 2D) | ||||
| 	alListener3f(AL_POSITION, 0, 0, 0); | ||||
| 	alListener3f(AL_VELOCITY, 0, 0, 0); | ||||
| 	alListener3f(AL_ORIENTATION, 0, 0, -1); | ||||
| } | ||||
|  | ||||
| // Close the audio device for the current context, and destroys the context | ||||
| void CloseAudioDevice() | ||||
| { | ||||
| 	ALCdevice *device; | ||||
| 	ALCcontext *context = alcGetCurrentContext(); | ||||
| 	 | ||||
| 	if (context == NULL) return; | ||||
|  | ||||
| 	device = alcGetContextsDevice(context); | ||||
|  | ||||
| 	alcMakeContextCurrent(NULL); | ||||
| 	alcDestroyContext(context); | ||||
| 	alcCloseDevice(device); | ||||
| } | ||||
|  | ||||
| // Load sound to memory | ||||
| Sound LoadSound(char *fileName) | ||||
| { | ||||
| 	Sound sound; | ||||
| 	 | ||||
| 	// NOTE: The entire file is loaded to memory to play it all at once (no-streaming) | ||||
| 	 | ||||
| 	// WAV file loading | ||||
| 	// NOTE: Buffer space is allocated inside LoadWAV, Wave must be freed | ||||
| 	Wave wave = LoadWAV(fileName); | ||||
| 	 | ||||
| 	ALenum format; | ||||
| 	// The OpenAL format is worked out by looking at the number of channels and the bits per sample | ||||
| 	if (wave.channels == 1)  | ||||
| 	{ | ||||
| 		if (wave.sampleRate == 8 ) format = AL_FORMAT_MONO8; | ||||
| 		else if (wave.sampleRate == 16) format = AL_FORMAT_MONO16; | ||||
| 	}  | ||||
| 	else if (wave.channels == 2)  | ||||
| 	{ | ||||
| 		if (wave.sampleRate == 8 ) format = AL_FORMAT_STEREO8; | ||||
| 		else if (wave.sampleRate == 16) format = AL_FORMAT_STEREO16; | ||||
| 	} | ||||
| 	 | ||||
| 	// Create an audio source | ||||
| 	ALuint source; | ||||
| 	alGenSources(1, &source);			// Generate pointer to audio source | ||||
|  | ||||
| 	alSourcef(source, AL_PITCH, 1);	 | ||||
| 	alSourcef(source, AL_GAIN, 1); | ||||
| 	alSource3f(source, AL_POSITION, 0, 0, 0); | ||||
| 	alSource3f(source, AL_VELOCITY, 0, 0, 0); | ||||
| 	alSourcei(source, AL_LOOPING, AL_FALSE); | ||||
| 	 | ||||
| 	// Convert loaded data to OpenAL buffer | ||||
| 	//---------------------------------------- | ||||
| 	ALuint buffer; | ||||
| 	alGenBuffers(1, &buffer);			// Generate pointer to buffer | ||||
|  | ||||
| 	// Upload sound data to buffer | ||||
| 	alBufferData(buffer, format, wave.data, wave.dataSize, wave.sampleRate); | ||||
|  | ||||
| 	// Attach sound buffer to source | ||||
| 	alSourcei(source, AL_BUFFER, buffer); | ||||
| 	 | ||||
| 	// Unallocate WAV data | ||||
| 	UnloadWAV(wave); | ||||
| 	 | ||||
| 	printf("Sample rate: %i\n", wave.sampleRate); | ||||
| 	printf("Channels: %i\n", wave.channels); | ||||
|     printf("Format: %i\n", wave.format); | ||||
| 	 | ||||
| 	printf("Audio file loaded...!\n"); | ||||
| 	 | ||||
| 	sound.source = source; | ||||
| 	sound.buffer = buffer; | ||||
| 	 | ||||
| 	return sound; | ||||
| } | ||||
|  | ||||
| // Unload sound | ||||
| void UnloadSound(Sound sound) | ||||
| { | ||||
| 	alDeleteSources(1, &sound.source); | ||||
| 	alDeleteBuffers(1, &sound.buffer); | ||||
| } | ||||
|  | ||||
| // Play a sound | ||||
| void PlaySound(Sound sound) | ||||
| { | ||||
| 	alSourcePlay(sound.source);		// Play the sound | ||||
| 	 | ||||
| 	printf("Playing sound!\n"); | ||||
|  | ||||
| 	// Find the current position of the sound being played | ||||
| 	// NOTE: Only work when the entire file is in a single buffer | ||||
| 	//int byteOffset; | ||||
| 	//alGetSourcei(sound.source, AL_BYTE_OFFSET, &byteOffset); | ||||
| 	//float seconds = (float)byteOffset / sampleRate;				// Number of seconds since the beginning of the sound | ||||
| } | ||||
|  | ||||
| // Play a sound with extended options | ||||
| void PlaySoundEx(Sound sound, float timePosition, bool loop) | ||||
| { | ||||
| 	// TODO: Review | ||||
| 	 | ||||
| 	// Change the current position (e.g. skip some part of the sound) | ||||
| 	// NOTE: Only work when the entire file is in a single buffer | ||||
| 	//alSourcei(sound.source, AL_BYTE_OFFSET, int(position * sampleRate)); | ||||
|  | ||||
| 	alSourcePlay(sound.source);		// Play the sound | ||||
| 	 | ||||
| 	if (loop) alSourcei(sound.source, AL_LOOPING, AL_TRUE); | ||||
| 	else alSourcei(sound.source, AL_LOOPING, AL_FALSE); | ||||
| } | ||||
|  | ||||
| // Pause a sound | ||||
| void PauseSound(Sound sound) | ||||
| { | ||||
| 	alSourcePause(sound.source); | ||||
| } | ||||
|  | ||||
| // Stop reproducing a sound | ||||
| void StopSound(Sound sound) | ||||
| { | ||||
| 	alSourceStop(sound.source); | ||||
| } | ||||
|  | ||||
| // Load WAV file into Wave structure | ||||
| static Wave LoadWAV(char *fileName)  | ||||
| { | ||||
| 	Wave wave; | ||||
|     FILE *wavFile;  | ||||
|  | ||||
|     wavFile = fopen(fileName, "rb"); | ||||
| 	 | ||||
| 	if (!wavFile) | ||||
| 	{ | ||||
| 		printf("Could not load WAV file.\n"); | ||||
| 		exit(1); | ||||
| 	} | ||||
| 	 | ||||
| 	unsigned char id[4]; 		// Four bytes to hold 'RIFF' and 'WAVE' (and other ids) | ||||
| 	 | ||||
| 	unsigned int size = 0; 		// File size (useless) | ||||
| 	 | ||||
| 	short format; | ||||
| 	short channels; | ||||
| 	short blockAlign; | ||||
| 	short bitsPerSample; | ||||
| 	 | ||||
| 	unsigned int formatLength; | ||||
| 	unsigned int sampleRate; | ||||
| 	unsigned int avgBytesSec; | ||||
| 	unsigned int dataSize; | ||||
|  | ||||
| 	fread(id, sizeof(unsigned char), 4, wavFile); 			// Read the first four bytes  | ||||
| 	 | ||||
| 	if ((id[0] != 'R') || (id[1] != 'I') || (id[2] != 'F') || (id[3] != 'F')) | ||||
| 	{ | ||||
| 		printf("Invalid RIFF file.\n");						// If not "RIFF" id, exit | ||||
| 		exit(1); | ||||
| 	} 				 | ||||
|  | ||||
| 	fread(&size, sizeof(unsigned int), 1, wavFile); 		// Read file size | ||||
| 	fread(id, sizeof(unsigned char), 4, wavFile); 			// Read the next id | ||||
| 	 | ||||
| 	if ((id[0] != 'W') || (id[1] != 'A') || (id[2] != 'V') || (id[3] != 'E')) | ||||
| 	{ | ||||
| 		printf("Invalid WAVE file.\n");						// If not "WAVE" id, exit | ||||
| 		exit(1); | ||||
| 	}  | ||||
| 	 | ||||
| 	fread(id, sizeof(unsigned char), 4, wavFile); 			// Read 4 bytes id "fmt " | ||||
| 	fread(&formatLength, sizeof(unsigned int),1,wavFile); 	// Read format lenght | ||||
| 	fread(&format, sizeof(short), 1, wavFile); 				// Read format tag | ||||
| 	fread(&channels, sizeof(short), 1, wavFile); 			// Read num channels (1 mono, 2 stereo)  | ||||
| 	fread(&sampleRate, sizeof(unsigned int), 1, wavFile); 	// Read sample rate (44100, 22050, etc...) | ||||
| 	fread(&avgBytesSec, sizeof(short), 1, wavFile); 		// Read average bytes per second (probably won't need this) | ||||
| 	fread(&blockAlign, sizeof(short), 1, wavFile); 			// Read block alignment (probably won't need this) | ||||
| 	fread(&bitsPerSample, sizeof(short), 1, wavFile); 		// Read bits per sample (8 bit or 16 bit)  | ||||
| 	 | ||||
| 	fread(id, sizeof(unsigned char), 4, wavFile); 			// Read 4 bytes id "data"  | ||||
| 	fread(&dataSize, sizeof(unsigned int), 1, wavFile); 	// Read data size (in bytes) | ||||
| 	 | ||||
| 	wave.sampleRate = sampleRate; | ||||
| 	wave.dataSize = dataSize; | ||||
| 	wave.channels = channels; | ||||
| 	wave.format = format; | ||||
| 	 | ||||
| 	wave.data = (unsigned char *)malloc(sizeof(unsigned char) * dataSize); 	// Allocate the required bytes to store data | ||||
| 	 | ||||
| 	fread(wave.data, sizeof(unsigned char), dataSize, wavFile); 		// Read the whole sound data chunk | ||||
| 	 | ||||
| 	return wave; | ||||
| }  | ||||
|  | ||||
| // Unload WAV file data | ||||
| static void UnloadWAV(Wave wave) | ||||
| { | ||||
| 	free(wave.data); | ||||
| } | ||||
|  | ||||
| // TODO: Ogg data loading | ||||
| //static Ogg LoadOGG(char *fileName) { } | ||||
|  | ||||
							
								
								
									
										582
									
								
								src/core.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,582 @@ | ||||
| /********************************************************************************************* | ||||
| * | ||||
| *	raylib.core | ||||
| * | ||||
| *	Basic functions to manage Windows, OpenGL context and Input | ||||
| *	 | ||||
| *	Uses external lib:	 | ||||
| *		GLFW3 - Window, context and Input management (static lib version) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| *	 | ||||
| *	This software is provided "as-is", without any express or implied warranty. In no event  | ||||
| *	will the authors be held liable for any damages arising from the use of this software. | ||||
| * | ||||
| *	Permission is granted to anyone to use this software for any purpose, including commercial  | ||||
| *	applications, and to alter it and redistribute it freely, subject to the following restrictions: | ||||
| * | ||||
| *	  1. The origin of this software must not be misrepresented; you must not claim that you  | ||||
| *	  wrote the original software. If you use this software in a product, an acknowledgment  | ||||
| *	  in the product documentation would be appreciated but is not required. | ||||
| * | ||||
| *	  2. Altered source versions must be plainly marked as such, and must not be misrepresented | ||||
| *	  as being the original software. | ||||
| * | ||||
| *	  3. This notice may not be removed or altered from any source distribution. | ||||
| * | ||||
| **********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| #include <GLFW/glfw3.h>		// GLFW3 lib: Windows, OpenGL context and Input management | ||||
| //#include <GL/gl.h>		// OpenGL functions (GLFW3 already includes gl.h) | ||||
| #include <stdio.h>			// Standard input / output lib | ||||
| #include <stdlib.h>			// Declares malloc() and free() for memory management | ||||
| #include <math.h>			// Math related functions, tan() on SetPerspective | ||||
| #include "vector3.h"		// Basic Vector3 functions | ||||
|  | ||||
| //#define GLFW_DLL			// Using GLFW DLL on Windows -> No, we use static version! | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Defines and Macros | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Nop... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| typedef Color pixel; | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Global Variables Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| static GLFWwindow* window;					// Main window | ||||
| static bool fullscreen;						// Fullscreen mode track | ||||
|  | ||||
| static double currentTime, previousTime;	// Used to track timmings | ||||
| static double updateTime, drawTime;			// Time measures for update and draw | ||||
| static double frameTime;					// Time measure for one frame | ||||
| static double targetTime = 0;				// Desired time for one frame, if 0 not applied | ||||
|  | ||||
| static int windowWidth, windowHeight;		// Required to switch between windowed/fullscren mode (F11) | ||||
| static char *windowTitle;					// Required to switch between windowed/fullscren mode (F11) | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Other Modules Functions Declaration (required by core) | ||||
| //---------------------------------------------------------------------------------- | ||||
| extern void LoadDefaultFont();				// [Module: text] Loads default font on InitWindow() | ||||
| extern void UnloadDefaultFont();			// [Module: text] Unloads default font from GPU memory | ||||
| extern void WriteBitmap(const char *fileName, const pixel *imgDataPixel, int width, int height);	// [Module: textures] Writes a bitmap (BMP) file | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Declaration | ||||
| //---------------------------------------------------------------------------------- | ||||
| static void InitGraphicsDevice();															// Initialize Graphics Device (OpenGL stuff) | ||||
| static void ErrorCallback(int error, const char *description);								// GLFW3 Error Callback, runs on GLFW3 error | ||||
| static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);	// GLFW3 Keyboard Callback, runs on key pressed | ||||
| static void WindowSizeCallback(GLFWwindow* window, int width, int height);					// GLFW3 WindowSize Callback, runs when window is resized | ||||
| static void CameraLookAt(Vector3 position, Vector3 target, Vector3 up);						// Setup camera view (updates MODELVIEW matrix) | ||||
| static void SetPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);	// Setup view projection (updates PROJECTION matrix) | ||||
| static void TakeScreenshot();																// Takes a bitmap (BMP) screenshot and saves it in the same folder as executable | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module Functions Definition - Window and OpenGL Context Functions | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // Initialize Window and Graphics Context (OpenGL) | ||||
| void InitWindow(int width, int height, char* title) | ||||
| { | ||||
|     glfwSetErrorCallback(ErrorCallback); | ||||
| 	 | ||||
|     if (!glfwInit()) exit(1); | ||||
| 	 | ||||
| 	//glfwWindowHint(GLFW_SAMPLES, 4);	// If called before windows creation, enables multisampling x4 (MSAA), default is 0 | ||||
| 		 | ||||
|     window = glfwCreateWindow(width, height, title, NULL, NULL); | ||||
| 	 | ||||
| 	windowWidth = width; | ||||
| 	windowHeight = height; | ||||
| 	windowTitle = title; | ||||
| 	 | ||||
|     if (!window) | ||||
|     { | ||||
|         glfwTerminate(); | ||||
|         exit(1); | ||||
|     } | ||||
| 	 | ||||
| 	glfwSetWindowSizeCallback(window, WindowSizeCallback); | ||||
| 	 | ||||
| 	glfwMakeContextCurrent(window); | ||||
| 	glfwSetKeyCallback(window, KeyCallback); | ||||
| 	glfwSwapInterval(0);			// Disables GPU v-sync (if set), so frames are not limited to screen refresh rate (60Hz -> 60 FPS) | ||||
| 									// If not set, swap interval uses GPU v-sync configuration | ||||
| 									// Framerate can be setup using SetTargetFPS() | ||||
| 	InitGraphicsDevice(); | ||||
| 	 | ||||
| 	previousTime = glfwGetTime(); | ||||
|  | ||||
| 	LoadDefaultFont(); | ||||
| } | ||||
|  | ||||
| // Close Window and Terminate Context | ||||
| void CloseWindow() | ||||
| { | ||||
| 	UnloadDefaultFont(); | ||||
|  | ||||
|     glfwDestroyWindow(window); | ||||
| 	glfwTerminate(); | ||||
| } | ||||
|  | ||||
| // Detect if KEY_ESCAPE pressed or Close icon pressed | ||||
| bool WindowShouldClose() | ||||
| { | ||||
| 	return (glfwWindowShouldClose(window)); | ||||
| } | ||||
|  | ||||
| // Fullscreen toggle (by default F11) | ||||
| void ToggleFullscreen() | ||||
| { | ||||
| 	if (glfwGetKey(window, GLFW_KEY_F11))  | ||||
| 	{ | ||||
| 		fullscreen = !fullscreen;			// Toggle fullscreen flag | ||||
|  | ||||
| 		glfwDestroyWindow(window);			// Destroy the current window (we will recreate it!) | ||||
|  | ||||
| 		// NOTE: Window aspect ratio is always windowWidth / windowHeight | ||||
| 		if (fullscreen) window = glfwCreateWindow(windowWidth, windowHeight, windowTitle, glfwGetPrimaryMonitor(), NULL);	// Fullscreen mode | ||||
| 		else window = glfwCreateWindow(windowWidth, windowHeight, windowTitle, NULL, NULL); | ||||
| 	 | ||||
| 		if (!window) | ||||
| 		{ | ||||
| 			glfwTerminate(); | ||||
| 			exit(1); | ||||
| 		} | ||||
| 		 | ||||
| 		glfwMakeContextCurrent(window); | ||||
| 		glfwSetKeyCallback(window, KeyCallback); | ||||
|  | ||||
| 		InitGraphicsDevice(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Sets Background Color | ||||
| void ClearBackground(Color color) | ||||
| { | ||||
| 	// Color values clamp to 0.0f(0) and 1.0f(255) | ||||
| 	float r = (float)color.r / 255; | ||||
| 	float g = (float)color.g / 255; | ||||
| 	float b = (float)color.b / 255; | ||||
| 	float a = (float)color.a / 255; | ||||
| 	 | ||||
| 	glClearColor(r, g, b, a); | ||||
| } | ||||
|  | ||||
| // Setup drawing canvas to start drawing | ||||
| void BeginDrawing() | ||||
| { | ||||
| 	currentTime = glfwGetTime();		// glfwGetTime() returns a 'double' containing the number of elapsed seconds since glfwInit() was called | ||||
| 	updateTime = currentTime - previousTime; | ||||
| 	previousTime = currentTime; | ||||
|  | ||||
|     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 	// Clear used buffers, Depth Buffer is used for 3D | ||||
| 	 | ||||
| 	glLoadIdentity();					// Reset current matrix (MODELVIEW) | ||||
| 	 | ||||
| 	glTranslatef(0.375, 0.375, 0);		// HACK to have 2D pixel-perfect drawing on OpenGL | ||||
| } | ||||
|  | ||||
| // End canvas drawing and Swap Buffers (Double Buffering) | ||||
| void EndDrawing() | ||||
| { | ||||
|     glfwSwapBuffers(window);			// Swap back and front buffers | ||||
|     glfwPollEvents();					// Register keyboard/mouse events | ||||
| 	 | ||||
| 	currentTime = glfwGetTime(); | ||||
| 	drawTime = currentTime - previousTime; | ||||
| 	previousTime = currentTime; | ||||
| 	 | ||||
| 	frameTime = updateTime + drawTime; | ||||
| 	 | ||||
| 	double extraTime = 0; | ||||
|  | ||||
| 	while (frameTime < targetTime) | ||||
| 	{ | ||||
| 		// Implement a delay | ||||
| 		currentTime = glfwGetTime(); | ||||
| 		extraTime = currentTime - previousTime; | ||||
| 		previousTime = currentTime; | ||||
| 		frameTime += extraTime; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Initializes 3D mode for drawing (Camera setup) | ||||
| void Begin3dMode(Camera camera) | ||||
| { | ||||
| 	//glEnable(GL_LIGHTING);			// TODO: Setup proper lighting system (raylib 1.x) | ||||
| 	 | ||||
| 	glMatrixMode(GL_PROJECTION);		// Switch to projection matrix | ||||
| 	 | ||||
| 	glPushMatrix();						// Save previous matrix, which contains the settings for the 2d ortho projection | ||||
| 	glLoadIdentity();					// Reset current matrix (PROJECTION) | ||||
| 	 | ||||
| 	SetPerspective(45.0f, (GLfloat)windowWidth/(GLfloat)windowHeight, 0.1f, 100.0f);	// Setup perspective projection | ||||
|  | ||||
| 	glMatrixMode(GL_MODELVIEW);			// Switch back to modelview matrix | ||||
| 	glLoadIdentity();					// Reset current matrix (MODELVIEW) | ||||
| 	 | ||||
| 	CameraLookAt(camera.position, camera.target, camera.up);		// Setup Camera view | ||||
| } | ||||
|  | ||||
| // Ends 3D mode and returns to default 2D orthographic mode | ||||
| void End3dMode() | ||||
| { | ||||
| 	glMatrixMode(GL_PROJECTION);		// Switch to projection matrix | ||||
| 	glPopMatrix();						// Restore previous matrix (PROJECTION) from matrix stack | ||||
| 	 | ||||
| 	glMatrixMode(GL_MODELVIEW);			// Get back to modelview matrix | ||||
| 	glLoadIdentity();					// Reset current matrix (MODELVIEW) | ||||
| 	 | ||||
| 	glTranslatef(0.375, 0.375, 0);		// HACK to ensure pixel-perfect drawing on OpenGL (after exiting 3D mode) | ||||
| 		 | ||||
| 	//glDisable(GL_LIGHTING);			// TODO: Setup proper lighting system (raylib 1.x) | ||||
| } | ||||
|  | ||||
| // Set target FPS for the game | ||||
| void SetTargetFPS(int fps) | ||||
| { | ||||
| 	targetTime = 1 / (float)fps; | ||||
| 	 | ||||
| 	printf("TargetTime per Frame: %f seconds\n", (float)targetTime); | ||||
| } | ||||
|  | ||||
| // Returns current FPS | ||||
| float GetFPS() | ||||
| { | ||||
| 	return (1/(float)frameTime); | ||||
| } | ||||
|  | ||||
| // Returns time in seconds for one frame | ||||
| float GetFrameTime() | ||||
| { | ||||
| 	// As we are operating quite a lot with frameTime, it could be no stable | ||||
| 	// so we round it before before passing around to be used | ||||
| 	// NOTE: There are still problems with high framerates (>500fps) | ||||
| 	double roundedFrameTime =  round(frameTime*10000) / 10000; | ||||
| 	 | ||||
| 	return (float)roundedFrameTime;	// Time in seconds to run a frame | ||||
| } | ||||
|  | ||||
| // Returns a Color struct from hexadecimal value | ||||
| Color GetColor(int hexValue) | ||||
| { | ||||
| 	Color color; | ||||
|  | ||||
| 	color.r = (unsigned char)(hexValue >> 24) & 0xFF; | ||||
| 	color.g = (unsigned char)(hexValue >> 16) & 0xFF; | ||||
| 	color.b = (unsigned char)(hexValue >> 8) & 0xFF; | ||||
| 	color.a = (unsigned char)hexValue & 0xFF; | ||||
| 	 | ||||
| 	return color; | ||||
| } | ||||
|  | ||||
| // Returns hexadecimal value for a Color | ||||
| int GetHexValue(Color color) | ||||
| { | ||||
| 	return ((color.a << 24) + (color.r << 16) + (color.g << 8) + color.b); | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module Functions Definition - Input (Keyboard, Mouse, Gamepad) Functions | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // Detect if a key is being pressed (key held down) | ||||
| bool IsKeyPressed(int key) | ||||
| { | ||||
| 	if (glfwGetKey(window, key) == GLFW_PRESS) return true; | ||||
| 	else return false; | ||||
| } | ||||
|  | ||||
| // Detect if a key is NOT being pressed (key not held down) | ||||
| bool IsKeyReleased(int key) | ||||
| { | ||||
| 	if (glfwGetKey(window, key) == GLFW_RELEASE) return true; | ||||
| 	else return false; | ||||
| } | ||||
|  | ||||
| // Detect if a mouse button is being pressed | ||||
| bool IsMouseButtonPressed(int button) | ||||
| { | ||||
| 	if (glfwGetMouseButton(window, button) == GLFW_PRESS) return true; | ||||
| 	else return false; | ||||
| } | ||||
|  | ||||
| // Detect if a mouse button is NOT being pressed | ||||
| bool IsMouseButtonReleased(int button) | ||||
| { | ||||
| 	if (glfwGetMouseButton(window, button) == GLFW_RELEASE) return true; | ||||
| 	else return false; | ||||
| } | ||||
|  | ||||
| // Returns mouse position X | ||||
| int GetMouseX() | ||||
| { | ||||
| 	double mouseX; | ||||
| 	double mouseY; | ||||
| 	 | ||||
| 	glfwGetCursorPos(window, &mouseX, &mouseY); | ||||
|  | ||||
| 	return (int)mouseX; | ||||
| } | ||||
|  | ||||
| // Returns mouse position Y | ||||
| int GetMouseY() | ||||
| { | ||||
| 	double mouseX; | ||||
| 	double mouseY; | ||||
| 	 | ||||
| 	glfwGetCursorPos(window, &mouseX, &mouseY); | ||||
|  | ||||
| 	return (int)mouseY; | ||||
| } | ||||
|  | ||||
| // Returns mouse position XY | ||||
| Vector2 GetMousePosition() | ||||
| { | ||||
| 	double mouseX; | ||||
| 	double mouseY; | ||||
| 	 | ||||
| 	glfwGetCursorPos(window, &mouseX, &mouseY); | ||||
| 	 | ||||
| 	Vector2 position = { (float)mouseX, (float)mouseY }; | ||||
|  | ||||
| 	return position; | ||||
| } | ||||
|  | ||||
| // Detect if a gamepad is available | ||||
| bool IsGamepadAvailable(int gamepad) | ||||
| { | ||||
| 	int result = glfwJoystickPresent(gamepad); | ||||
| 	 | ||||
| 	if (result == 1) return true; | ||||
| 	else return false; | ||||
| } | ||||
|  | ||||
| // Return axis movement vector for a gamepad | ||||
| Vector2 GetGamepadMovement(int gamepad) | ||||
| { | ||||
| 	Vector2 vec = { 0, 0 }; | ||||
| 	 | ||||
| 	const float *axes; | ||||
|     int axisCount; | ||||
| 	 | ||||
| 	axes = glfwGetJoystickAxes(gamepad, &axisCount); | ||||
| 	 | ||||
| 	if (axisCount >= 2) | ||||
| 	{ | ||||
| 		vec.x = axes[0];	// Left joystick X	 | ||||
| 		vec.y = axes[1];	// Left joystick Y | ||||
| 		 | ||||
| 		//vec.x = axes[2];	// Right joystick X | ||||
| 		//vec.x = axes[3];	// Right joystick Y | ||||
| 	}		 | ||||
|  | ||||
| 	return vec; | ||||
| } | ||||
|  | ||||
| // Detect if a gamepad button is being pressed | ||||
| bool IsGamepadButtonPressed(int gamepad, int button) | ||||
| { | ||||
| 	const unsigned char* buttons; | ||||
| 	int buttonsCount; | ||||
| 	 | ||||
| 	buttons = glfwGetJoystickButtons(gamepad, &buttonsCount); | ||||
| 	 | ||||
| 	if (buttons[button] == GLFW_PRESS) | ||||
| 	{ | ||||
| 		return true; | ||||
| 	} | ||||
| 	else return false; | ||||
| } | ||||
|  | ||||
| // Detect if a gamepad button is NOT being pressed | ||||
| bool IsGamepadButtonReleased(int gamepad, int button) | ||||
| { | ||||
| 	const unsigned char* buttons; | ||||
| 	int buttonsCount; | ||||
| 	 | ||||
| 	buttons = glfwGetJoystickButtons(gamepad, &buttonsCount); | ||||
| 	 | ||||
| 	if (buttons[button] == GLFW_RELEASE) | ||||
| 	{ | ||||
| 		return true; | ||||
| 	} | ||||
| 	else return false; | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // GLFW3 Error Callback, runs on GLFW3 error | ||||
| static void ErrorCallback(int error, const char *description) | ||||
| { | ||||
|     printf(description); | ||||
| 	//fprintf(stderr, description); | ||||
| } | ||||
|  | ||||
| // GLFW3 Keyboard Callback, runs on key pressed | ||||
| static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) | ||||
| { | ||||
|     if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) | ||||
| 	{ | ||||
| 		glfwSetWindowShouldClose(window, GL_TRUE); | ||||
| 		 | ||||
| 		// NOTE: Before closing window, while loop must be left! | ||||
| 	} | ||||
| 	else if (key == GLFW_KEY_F11 && action == GLFW_PRESS) | ||||
| 	{ | ||||
| 		ToggleFullscreen(); | ||||
| 	} | ||||
| 	else if (key == GLFW_KEY_F12 && action == GLFW_PRESS) | ||||
| 	{ | ||||
| 		TakeScreenshot(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // GLFW3 WindowSize Callback, runs when window is resized | ||||
| static void WindowSizeCallback(GLFWwindow* window, int width, int height) | ||||
| { | ||||
| 	InitGraphicsDevice();	// If window is resized, graphics device is re-initialized | ||||
| 							// NOTE: Aspect ratio does not change, so, image can be deformed | ||||
| } | ||||
|  | ||||
| // Initialize Graphics Device (OpenGL stuff) | ||||
| static void InitGraphicsDevice() | ||||
| { | ||||
| 	int fbWidth, fbHeight; | ||||
| 	 | ||||
| 	glfwGetFramebufferSize(window, &fbWidth, &fbHeight);	// Get framebuffer size of current window | ||||
|  | ||||
| 	glViewport(0, 0, fbWidth, fbHeight);					// Set viewport width and height | ||||
|  | ||||
| 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 	// Clear used buffers, depth buffer is used for 3D | ||||
| 	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);					// Set background color (black) | ||||
| 	glClearDepth(1.0f);										// Clear depth buffer | ||||
| 	 | ||||
| 	glEnable(GL_DEPTH_TEST);								// Enables depth testing (required for 3D) | ||||
| 	glDepthFunc(GL_LEQUAL);									// Type of depth testing to apply | ||||
| 	 | ||||
| 	glEnable(GL_BLEND);										// Enable color blending (required to work with transparencies) | ||||
| 	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);		// Color blending function (how colors are mixed) | ||||
| 	 | ||||
| 	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);		// Improve quality of color and texture coordinate interpolation (Deprecated in OGL 3.0) | ||||
| 															// Other options: GL_FASTEST, GL_DONT_CARE (default) | ||||
| 	 | ||||
| 	glMatrixMode(GL_PROJECTION);				// Switch to PROJECTION matrix | ||||
| 	glLoadIdentity();							// Reset current matrix (PROJECTION) | ||||
| 	glOrtho(0, fbWidth, fbHeight, 0, 0, 1);		// Config orthographic mode: top-left corner --> (0,0) | ||||
| 	glMatrixMode(GL_MODELVIEW);					// Switch back to MODELVIEW matrix | ||||
| 	glLoadIdentity();							// Reset current matrix (MODELVIEW) | ||||
| 	 | ||||
| 	glDisable(GL_LIGHTING);						// Lighting Disabled... | ||||
| 	 | ||||
| 	// TODO: Create an efficient Lighting System with proper functions (raylib 1.x) | ||||
| /*	 | ||||
| 	glEnable(GL_COLOR_MATERIAL);						// Enable materials, causes some glMaterial atributes to track the current color (glColor)... | ||||
| 	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);	// Material types and where to apply them | ||||
| 														// NOTE: ONLY works with lighting; defines how light interacts with material | ||||
| 														 | ||||
| 	glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient);		// Define ambient light color property | ||||
| 	glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse); 	// Define diffuse light color property | ||||
| 	glLightfv(GL_LIGHT1, GL_POSITION, lightPosition); 	// Define light position | ||||
| 	 | ||||
| 	glEnable(GL_LIGHTING); | ||||
| 	glEnable(GL_LIGHT1); 								// Enable light one (8 lights available at the same time) | ||||
| */	 | ||||
| 	// TODO: Review all shapes/models are drawn CCW and enable backface culling | ||||
|  | ||||
| 	//glEnable(GL_CULL_FACE);		// Enable backface culling (Disabled by default) | ||||
| 	//glCullFace(GL_BACK);			// Cull the Back face (default) | ||||
| 	//glFrontFace(GL_CCW);			// Front face are defined counter clockwise (default) | ||||
| 	 | ||||
| 	glShadeModel(GL_SMOOTH);		// Smooth shading between vertex (vertex colors interpolation) | ||||
| 									// Possible options: GL_SMOOTH (Color interpolation) or GL_FLAT (no interpolation) | ||||
| } | ||||
|  | ||||
| // Setup camera view (updates MODELVIEW matrix) | ||||
| static void CameraLookAt(Vector3 position, Vector3 target, Vector3 up) | ||||
| { | ||||
|     float rotMatrix[16];			// Matrix to store camera rotation | ||||
|      | ||||
| 	Vector3 rotX, rotY, rotZ;				// Vectors to calculate camera rotations X, Y, Z (Euler) | ||||
|      | ||||
|     // Construct rotation matrix from vectors | ||||
| 	rotZ = VectorSubtract(position, target); | ||||
| 	VectorNormalize(&rotZ); | ||||
|     rotY = up;	    						// Y rotation vector | ||||
| 	rotX = VectorCrossProduct(rotY, rotZ);	// X rotation vector = Y cross Z | ||||
|     rotY = VectorCrossProduct(rotZ, rotX);	// Recompute Y rotation = Z cross X | ||||
|     VectorNormalize(&rotX);					// X rotation vector normalization | ||||
|     VectorNormalize(&rotY);					// Y rotation vector normalization | ||||
|      | ||||
|     rotMatrix[0] = rotX.x; | ||||
| 	rotMatrix[1] = rotY.x; | ||||
|     rotMatrix[2] = rotZ.x;	 | ||||
|     rotMatrix[3] = 0.0f;	 | ||||
|     rotMatrix[4] = rotX.y; | ||||
|     rotMatrix[5] = rotY.y;	 | ||||
|     rotMatrix[6] = rotZ.y; | ||||
|     rotMatrix[7] = 0.0f;	 | ||||
|     rotMatrix[8] = rotX.z; | ||||
|     rotMatrix[9] = rotY.z; | ||||
|     rotMatrix[10] = rotZ.z; | ||||
|     rotMatrix[11] = 0.0f; | ||||
|     rotMatrix[12] = 0.0f; | ||||
|     rotMatrix[13] = 0.0f; | ||||
|     rotMatrix[14] = 0.0f; | ||||
|     rotMatrix[15] = 1.0f; | ||||
|  | ||||
|     glMultMatrixf(rotMatrix);	// Multiply MODELVIEW matrix by rotation matrix | ||||
|      | ||||
|     glTranslatef(-position.x, -position.y, -position.z);	// Translate eye to position | ||||
| } | ||||
|  | ||||
| // Setup view projection (updates PROJECTION matrix) | ||||
| static void SetPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) | ||||
| { | ||||
|    double xmin, xmax, ymin, ymax; | ||||
|  | ||||
|    ymax = zNear * tan(fovy * PI / 360.0); | ||||
|    ymin = -ymax; | ||||
|    xmin = ymin * aspect; | ||||
|    xmax = ymax * aspect; | ||||
|  | ||||
|    glFrustum(xmin, xmax, ymin, ymax, zNear, zFar); | ||||
| } | ||||
|  | ||||
| // Takes a bitmap (BMP) screenshot and saves it in the same folder as executable | ||||
| static void TakeScreenshot() | ||||
| { | ||||
| 	static int shotNum = 0;		// Screenshot number, increments every screenshot take during program execution | ||||
| 		 | ||||
| 	char buffer[20];			// Buffer to store file name | ||||
| 	int fbWidth, fbHeight; | ||||
| 	 | ||||
| 	Color *imgDataPixel; 		// Pixel image data array | ||||
|  | ||||
| 	glfwGetFramebufferSize(window, &fbWidth, &fbHeight);	// Get framebuffer size of current window | ||||
|  | ||||
| 	imgDataPixel = (Color *)malloc(fbWidth * fbHeight * sizeof(Color)); | ||||
|  | ||||
| 	// NOTE: glReadPixels returns image flipped vertically -> (0,0) is the bottom left corner of the framebuffer | ||||
| 	glReadPixels(0, 0, fbWidth, fbHeight, GL_RGBA, GL_UNSIGNED_BYTE, imgDataPixel); | ||||
| 	 | ||||
| 	sprintf(buffer, "screenshot%03i.bmp", shotNum); | ||||
|  | ||||
| 	// NOTE: BMP directly stores data flipped vertically | ||||
| 	WriteBitmap(buffer, imgDataPixel, fbWidth, fbHeight);	// Writes pixel data array into a bitmap (BMP) file | ||||
| 	 | ||||
| 	free(imgDataPixel); | ||||
| 	 | ||||
| 	shotNum++; | ||||
| } | ||||
							
								
								
									
										819
									
								
								src/models.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,819 @@ | ||||
| /********************************************************************************************* | ||||
| * | ||||
| *	raylib.models | ||||
| * | ||||
| *	Basic functions to draw 3d shapes and load/draw 3d models (.OBJ) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| *	 | ||||
| *	This software is provided "as-is", without any express or implied warranty. In no event  | ||||
| *	will the authors be held liable for any damages arising from the use of this software. | ||||
| * | ||||
| *	Permission is granted to anyone to use this software for any purpose, including commercial  | ||||
| *	applications, and to alter it and redistribute it freely, subject to the following restrictions: | ||||
| * | ||||
| *	  1. The origin of this software must not be misrepresented; you must not claim that you  | ||||
| *	  wrote the original software. If you use this software in a product, an acknowledgment  | ||||
| *	  in the product documentation would be appreciated but is not required. | ||||
| * | ||||
| *	  2. Altered source versions must be plainly marked as such, and must not be misrepresented | ||||
| *	  as being the original software. | ||||
| * | ||||
| *	  3. This notice may not be removed or altered from any source distribution. | ||||
| * | ||||
| **********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| #include <GL/gl.h>		// OpenGL functions | ||||
| #include <stdio.h>		// Standard input/output functions, used to read model files data | ||||
| #include <stdlib.h>		// Declares malloc() and free() for memory management | ||||
| #include <math.h>		// Used for sin, cos, tan | ||||
| #include "vector3.h"	// Basic Vector3 functions | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Defines and Macros | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Nop... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| // ... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Global Variables Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| // It's lonely here... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Declaration | ||||
| //---------------------------------------------------------------------------------- | ||||
| // No private (static) functions in this module | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module Functions Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // Draw cube | ||||
| // NOTE: Cube position is de center position | ||||
| void DrawCube(Vector3 position, float width, float height, float lenght, Color color) | ||||
| { | ||||
| 	glPushMatrix(); | ||||
| 		glTranslatef(position.x, position.y, position.z); | ||||
| 		//glRotatef(rotation, 0.0f, 1.0f, 0.0f); | ||||
| 		//glScalef(1.0f, 1.0f, 1.0f); | ||||
|  | ||||
| 		glBegin(GL_QUADS); | ||||
| 			glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 			 | ||||
| 			// Front Face | ||||
| 			glNormal3f(0.0f, 0.0f, 1.0f);                  // Normal Pointing Towards Viewer | ||||
| 			glTexCoord2f(0.0f, 0.0f); glVertex3f(-width/2, -height/2,  lenght/2);  // Bottom Left Of The Texture and Quad | ||||
| 			glTexCoord2f(1.0f, 0.0f); glVertex3f( width/2, -height/2,  lenght/2);  // Bottom Right Of The Texture and Quad | ||||
| 			glTexCoord2f(1.0f, 1.0f); glVertex3f( width/2,  height/2,  lenght/2);  // Top Right Of The Texture and Quad | ||||
| 			glTexCoord2f(0.0f, 1.0f); glVertex3f(-width/2,  height/2,  lenght/2);  // Top Left Of The Texture and Quad | ||||
| 			// Back Face | ||||
| 			glNormal3f( 0.0f, 0.0f,-1.0f);                  // Normal Pointing Away From Viewer | ||||
| 			glTexCoord2f(1.0f, 0.0f); glVertex3f(-width/2, -height/2, -lenght/2);  // Bottom Right Of The Texture and Quad | ||||
| 			glTexCoord2f(1.0f, 1.0f); glVertex3f(-width/2,  height/2, -lenght/2);  // Top Right Of The Texture and Quad | ||||
| 			glTexCoord2f(0.0f, 1.0f); glVertex3f( width/2,  height/2, -lenght/2);  // Top Left Of The Texture and Quad | ||||
| 			glTexCoord2f(0.0f, 0.0f); glVertex3f( width/2, -height/2, -lenght/2);  // Bottom Left Of The Texture and Quad | ||||
| 			// Top Face | ||||
| 			glNormal3f( 0.0f, 1.0f, 0.0f);                  // Normal Pointing Up | ||||
| 			glTexCoord2f(0.0f, 1.0f); glVertex3f(-width/2,  height/2, -lenght/2);  // Top Left Of The Texture and Quad | ||||
| 			glTexCoord2f(0.0f, 0.0f); glVertex3f(-width/2,  height/2,  lenght/2);  // Bottom Left Of The Texture and Quad | ||||
| 			glTexCoord2f(1.0f, 0.0f); glVertex3f( width/2,  height/2,  lenght/2);  // Bottom Right Of The Texture and Quad | ||||
| 			glTexCoord2f(1.0f, 1.0f); glVertex3f( width/2,  height/2, -lenght/2);  // Top Right Of The Texture and Quad | ||||
| 			// Bottom Face | ||||
| 			glNormal3f( 0.0f,-1.0f, 0.0f);                  // Normal Pointing Down | ||||
| 			glTexCoord2f(1.0f, 1.0f); glVertex3f(-width/2, -height/2, -lenght/2);  // Top Right Of The Texture and Quad | ||||
| 			glTexCoord2f(0.0f, 1.0f); glVertex3f( width/2, -height/2, -lenght/2);  // Top Left Of The Texture and Quad | ||||
| 			glTexCoord2f(0.0f, 0.0f); glVertex3f( width/2, -height/2,  lenght/2);  // Bottom Left Of The Texture and Quad | ||||
| 			glTexCoord2f(1.0f, 0.0f); glVertex3f(-width/2, -height/2,  lenght/2);  // Bottom Right Of The Texture and Quad | ||||
| 			// Right face | ||||
| 			glNormal3f( 1.0f, 0.0f, 0.0f);                  // Normal Pointing Right | ||||
| 			glTexCoord2f(1.0f, 0.0f); glVertex3f( width/2, -height/2, -lenght/2);  // Bottom Right Of The Texture and Quad | ||||
| 			glTexCoord2f(1.0f, 1.0f); glVertex3f( width/2,  height/2, -lenght/2);  // Top Right Of The Texture and Quad | ||||
| 			glTexCoord2f(0.0f, 1.0f); glVertex3f( width/2,  height/2,  lenght/2);  // Top Left Of The Texture and Quad | ||||
| 			glTexCoord2f(0.0f, 0.0f); glVertex3f( width/2, -height/2,  lenght/2);  // Bottom Left Of The Texture and Quad | ||||
| 			// Left Face | ||||
| 			glNormal3f(-1.0f, 0.0f, 0.0f);                  // Normal Pointing Left | ||||
| 			glTexCoord2f(0.0f, 0.0f); glVertex3f(-width/2, -height/2, -lenght/2);  // Bottom Left Of The Texture and Quad | ||||
| 			glTexCoord2f(1.0f, 0.0f); glVertex3f(-width/2, -height/2,  lenght/2);  // Bottom Right Of The Texture and Quad | ||||
| 			glTexCoord2f(1.0f, 1.0f); glVertex3f(-width/2,  height/2,  lenght/2);  // Top Right Of The Texture and Quad | ||||
| 			glTexCoord2f(0.0f, 1.0f); glVertex3f(-width/2,  height/2, -lenght/2);  // Top Left Of The Texture and Quad | ||||
| 		glEnd(); | ||||
| 	glPopMatrix(); | ||||
| } | ||||
|  | ||||
| // Draw cube (Vector version) | ||||
| void DrawCubeV(Vector3 position, Vector3 size, Color color) | ||||
| { | ||||
| 	DrawCube(position, size.x, size.y, size.z, color); | ||||
| } | ||||
|  | ||||
| // Draw cube wires | ||||
| void DrawCubeWires(Vector3 position, float width, float height, float lenght, Color color) | ||||
| { | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); | ||||
| 	DrawCube(position, width, height, lenght, color); | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | ||||
| } | ||||
|  | ||||
| // Draw sphere | ||||
| void DrawSphere(Vector3 centerPos, float radius, Color color) | ||||
| { | ||||
| 	DrawSphereEx(centerPos, radius, 16, 16, color); | ||||
| } | ||||
|  | ||||
| // Draw sphere with extended parameters | ||||
| void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color) | ||||
| { | ||||
| 	float lat0, z0, zr0; | ||||
| 	float lat1, z1, zr1; | ||||
| 	float lng, x, y; | ||||
| 	 | ||||
| 	glPushMatrix(); | ||||
| 		glTranslatef(centerPos.x, centerPos.y, centerPos.z); | ||||
| 		glRotatef(90, 1, 0, 0); | ||||
| 		glScalef(radius, radius, radius); | ||||
| 		 | ||||
| 		glBegin(GL_QUAD_STRIP); | ||||
| 					 | ||||
| 			glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 			 | ||||
| 			for(int i = 0; i <= rings; i++)  | ||||
| 			{ | ||||
| 				lat0 = PI * (-0.5 + (float)(i - 1) / rings); | ||||
| 				z0  = sin(lat0); | ||||
| 				zr0 =  cos(lat0); | ||||
| 			 | ||||
| 				lat1 = PI * (-0.5 + (float)i / rings); | ||||
| 				z1 = sin(lat1); | ||||
| 				zr1 = cos(lat1); | ||||
| 		 | ||||
| 				for(int j = 0; j <= slices; j++)  | ||||
| 				{ | ||||
| 					lng = 2 * PI * (float)(j - 1) / slices; | ||||
| 					x = cos(lng); | ||||
| 					y = sin(lng); | ||||
| 		 | ||||
| 					glNormal3f(x * zr0, y * zr0, z0); | ||||
| 					glVertex3f(x * zr0, y * zr0, z0); | ||||
| 					 | ||||
| 					glNormal3f(x * zr1, y * zr1, z1); | ||||
| 					glVertex3f(x * zr1, y * zr1, z1); | ||||
| 				} | ||||
| 			} | ||||
| 		glEnd(); | ||||
| 	glPopMatrix(); | ||||
| } | ||||
|  | ||||
| // Draw sphere wires | ||||
| void DrawSphereWires(Vector3 centerPos, float radius, Color color) | ||||
| { | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); | ||||
| 	DrawSphere(centerPos, radius, color); | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | ||||
| } | ||||
|  | ||||
| // Draw a cylinder/cone | ||||
| void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color)	// Could be used for pyramid and cone! | ||||
| { | ||||
| 	static int count = 0; | ||||
| 	 | ||||
| 	Vector3 a = { position.x, position.y + height, position.z }; | ||||
| 	Vector3 d = { 0.0f, 1.0f, 0.0f }; | ||||
| 	Vector3 p; | ||||
| 	Vector3 c = { a.x + (-d.x * height), a.y + (-d.y * height), a.z + (-d.z * height) };	//= a + (-d * h); | ||||
| 	Vector3 e0 = VectorPerpendicular(d); | ||||
| 	Vector3 e1 = VectorCrossProduct(e0, d); | ||||
| 	float angInc = 360.0 / slices * DEG2RAD; | ||||
|  | ||||
| 	if (radiusTop == 0)	// Draw pyramid or cone | ||||
| 	{ | ||||
| 		//void drawCone(const Vector3 &d, const Vector3 &a, const float h, const float rd, const int n) | ||||
| 		//d – axis defined as a normalized vector from base to apex | ||||
| 		//a – position of apex (top point) | ||||
| 		//h – height | ||||
| 		//rd – radius of directrix | ||||
| 		//n – number of radial "slices" | ||||
| 		 | ||||
| 		glPushMatrix(); | ||||
| 			//glTranslatef(centerPos.x, centerPos.y, centerPos.z); | ||||
| 			glRotatef(DEG2RAD*count, 0.0f, 1.0f, 0.0f); | ||||
| 			//glScalef(1.0f, 1.0f, 1.0f); | ||||
| 			 | ||||
| 			// Draw cone top | ||||
| 			glBegin(GL_TRIANGLE_FAN); | ||||
| 				glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 				glVertex3f(a.x, a.y, a.z); | ||||
| 				for (int i = 0; i <= slices; i++)  | ||||
| 				{ | ||||
| 					float rad = angInc * i; | ||||
| 					p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusBottom); | ||||
| 					p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusBottom); | ||||
| 					p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusBottom); | ||||
| 					glVertex3f(p.x, p.y, p.z); | ||||
| 				} | ||||
| 			glEnd(); | ||||
| 		  | ||||
| 			// Draw cone bottom | ||||
| 			glBegin(GL_TRIANGLE_FAN); | ||||
| 				glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 				glVertex3f(c.x, c.y, c.z); | ||||
| 				for (int i = slices; i >= 0; i--)  | ||||
| 				{ | ||||
| 					float rad = angInc * i; | ||||
| 					p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusBottom); | ||||
| 					p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusBottom); | ||||
| 					p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusBottom); | ||||
| 					glVertex3f(p.x, p.y, p.z); | ||||
| 				} | ||||
| 			glEnd(); | ||||
| 			 | ||||
| 		glPopMatrix(); | ||||
| 	} | ||||
| 	else	// Draw cylinder | ||||
| 	{ | ||||
| 		glPushMatrix(); | ||||
| 			//glTranslatef(centerPos.x, centerPos.y, centerPos.z); | ||||
| 			glRotatef(DEG2RAD*count, 0.0f, 1.0f, 0.0f); | ||||
| 			//glScalef(1.0f, 1.0f, 1.0f); | ||||
|  | ||||
| 			// Draw cylinder top (pointed cap) | ||||
| 			glBegin(GL_TRIANGLE_FAN); | ||||
| 				glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 				glVertex3f(c.x, c.y + height, c.z); | ||||
| 				for (int i = slices; i >= 0; i--)  | ||||
| 				{ | ||||
| 					float rad = angInc * i; | ||||
| 					p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusTop); | ||||
| 					p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusTop) + height; | ||||
| 					p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusTop); | ||||
| 					glVertex3f(p.x, p.y, p.z); | ||||
| 				} | ||||
| 			glEnd(); | ||||
| 			 | ||||
| 			// Draw cylinder sides | ||||
| 			glBegin(GL_TRIANGLE_STRIP); | ||||
| 				glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 				for (int i = slices; i >= 0; i--) | ||||
| 				{ | ||||
| 					float rad = angInc * i; | ||||
| 					p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusTop); | ||||
| 					p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusTop) + height; | ||||
| 					p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusTop); | ||||
| 					glVertex3f(p.x, p.y, p.z); | ||||
| 					 | ||||
| 					p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusBottom); | ||||
| 					p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusBottom); | ||||
| 					p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusBottom); | ||||
| 					glVertex3f(p.x, p.y, p.z); | ||||
| 				} | ||||
| 			glEnd(); | ||||
| 			 | ||||
| 			// Draw cylinder bottom | ||||
| 			glBegin(GL_TRIANGLE_FAN); | ||||
| 				glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 				glVertex3f(c.x, c.y, c.z); | ||||
| 				for (int i = slices; i >= 0; i--)  | ||||
| 				{ | ||||
| 					float rad = angInc * i; | ||||
| 					p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusBottom); | ||||
| 					p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusBottom); | ||||
| 					p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusBottom); | ||||
| 					glVertex3f(p.x, p.y, p.z); | ||||
| 				} | ||||
| 			glEnd(); | ||||
| 			 | ||||
| 		glPopMatrix(); | ||||
| 	} | ||||
| 	 | ||||
| 	count += 1; | ||||
| } | ||||
|  | ||||
| // Draw a cylinder/cone wires | ||||
| void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color) | ||||
| { | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); | ||||
| 	DrawCylinder(position, radiusTop, radiusBottom, height, slices, color); | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | ||||
| } | ||||
|  | ||||
| // Draw a plane | ||||
| void DrawPlane(Vector3 centerPos, Vector2 size, Vector3 rotation, Color color) | ||||
| { | ||||
| 	// NOTE: Plane is always created on XZ ground and then rotated | ||||
| 	glPushMatrix(); | ||||
| 		glTranslatef(centerPos.x, centerPos.y, centerPos.z); | ||||
| 		 | ||||
| 		// TODO: Review multiples rotations Gimbal-Lock... use matrix or quaternions... | ||||
| 		glRotatef(rotation.x, 1, 0, 0); | ||||
| 		glRotatef(rotation.y, 0, 1, 0); | ||||
| 		glRotatef(rotation.z, 0, 0, 1); | ||||
| 		glScalef(size.x, 1.0f, size.y); | ||||
| 	 | ||||
| 		glBegin(GL_QUADS); | ||||
| 			glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 			glNormal3f(0.0f, 1.0f, 0.0f);  | ||||
| 			glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.0f, -0.5f); | ||||
| 			glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.0f, -0.5f); | ||||
| 			glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.0f, 0.5f); | ||||
| 			glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.0f, 0.5f); | ||||
| 		glEnd(); | ||||
|  | ||||
| 	glPopMatrix(); | ||||
| } | ||||
|  | ||||
| // Draw a plane with divisions | ||||
| void DrawPlaneEx(Vector3 centerPos, Vector2 size, Vector3 rotation, int slicesX, int slicesZ, Color color) | ||||
| { | ||||
| 	float quadWidth = size.x / slicesX; | ||||
| 	float quadLenght = size.y / slicesZ; | ||||
| 	 | ||||
| 	float texPieceW = 1 / size.x; | ||||
| 	float texPieceH = 1 / size.y; | ||||
|  | ||||
| 	// NOTE: Plane is always created on XZ ground and then rotated | ||||
| 	glPushMatrix(); | ||||
| 		glTranslatef(-size.x / 2, 0.0f, -size.y / 2); | ||||
| 		glTranslatef(centerPos.x, centerPos.y, centerPos.z); | ||||
| 		 | ||||
| 		// TODO: Review multiples rotations Gimbal-Lock... use matrix or quaternions... | ||||
| 		glRotatef(rotation.x, 1, 0, 0); | ||||
| 		glRotatef(rotation.y, 0, 1, 0); | ||||
| 		glRotatef(rotation.z, 0, 0, 1); | ||||
| 	 | ||||
| 		glBegin(GL_QUADS); | ||||
| 			glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 			glNormal3f(0.0f, 1.0f, 0.0f); | ||||
| 			 | ||||
| 			for (int z = 0; z < slicesZ; z++) | ||||
| 			{ | ||||
| 				for (int x = 0; x < slicesX; x++) | ||||
| 				{ | ||||
| 					// Draw the plane quad by quad (with textcoords) | ||||
| 					glTexCoord2f((float)x * texPieceW, (float)z * texPieceH); | ||||
| 					glVertex3f((float)x * quadWidth, 0.0f, (float)z * quadLenght); | ||||
| 					 | ||||
| 					glTexCoord2f((float)x * texPieceW + texPieceW, (float)z * texPieceH); | ||||
| 					glVertex3f((float)x * quadWidth  + quadWidth, 0.0f, (float)z * quadLenght); | ||||
| 					 | ||||
| 					glTexCoord2f((float)x * texPieceW + texPieceW, (float)z * texPieceH + texPieceH); | ||||
| 					glVertex3f((float)x * quadWidth + quadWidth, 0.0f, (float)z * quadLenght + quadLenght); | ||||
| 					 | ||||
| 					glTexCoord2f((float)x * texPieceW, (float)z * texPieceH + texPieceH); | ||||
| 					glVertex3f((float)x * quadWidth, 0.0f, (float)z * quadLenght + quadLenght); | ||||
| 				} | ||||
| 			} | ||||
| 		glEnd(); | ||||
|  | ||||
| 	glPopMatrix(); | ||||
| } | ||||
|  | ||||
| // Draw a grid centered at (0, 0, 0) | ||||
| void DrawGrid(int slices, float spacing) | ||||
| { | ||||
| 	int halfSlices = slices / 2; | ||||
| 	 | ||||
| 	//glEnable(GL_LINE_SMOOTH);					// Smoothies circle outline (anti-aliasing applied) | ||||
| 	//glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);		// Best quality for line smooth (anti-aliasing best algorithm) | ||||
|  | ||||
| 	glPushMatrix(); | ||||
| 		glScalef(spacing, 1.0f, spacing); | ||||
|  | ||||
| 		glBegin(GL_LINES); | ||||
| 			for(int i = -halfSlices; i <= halfSlices; i++) | ||||
| 			{ | ||||
| 				if (i == 0) glColor3f(0.5f, 0.5f, 0.5f); | ||||
| 				else glColor3f(0.75f, 0.75f, 0.75f); | ||||
| 				 | ||||
| 				glVertex3f((float)i, 0.0f, (float)-halfSlices); | ||||
| 				glVertex3f((float)i, 0.0f, (float)halfSlices); | ||||
|  | ||||
| 				glVertex3f((float)-halfSlices, 0.0f, (float)i); | ||||
| 				glVertex3f((float)halfSlices, 0.0f, (float)i); | ||||
| 			} | ||||
| 		glEnd(); | ||||
| 		 | ||||
| 	glPopMatrix(); | ||||
| 	 | ||||
| 	//glDisable(GL_LINE_SMOOTH); | ||||
| } | ||||
|  | ||||
| // Draw gizmo (with or without orbits) | ||||
| void DrawGizmo(Vector3 position, bool orbits) | ||||
| { | ||||
| 	// NOTE: RGB = XYZ | ||||
| 	float lenght = 1.0f; | ||||
| 	float radius = 1.0f; | ||||
| 	 | ||||
| 	//glEnable(GL_LINE_SMOOTH);					// Smoothies circle outline (anti-aliasing applied) | ||||
| 	//glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);		// Best quality for line smooth (anti-aliasing best algorithm) | ||||
| 	 | ||||
| 	glPushMatrix(); | ||||
| 		glTranslatef(position.x, position.y, position.z); | ||||
| 		//glRotatef(rotation, 0, 1, 0); | ||||
| 		glScalef(lenght, lenght, lenght); | ||||
| 	 | ||||
| 		glBegin(GL_LINES); | ||||
| 			glColor3f(1.0f, 0.0f, 0.0f); | ||||
| 			glVertex3f(0.0f, 0.0f, 0.0f); | ||||
| 			glVertex3f(1.0f, 0.0f, 0.0f); | ||||
| 			 | ||||
| 			glColor3f(0.0f, 1.0f, 0.0f); | ||||
| 			glVertex3f(0.0f, 0.0f, 0.0f); | ||||
| 			glVertex3f(0.0f, 1.0f, 0.0f); | ||||
| 			 | ||||
| 			glColor3f(0.0f, 0.0f, 1.0f); | ||||
| 			glVertex3f(0.0f, 0.0f, 0.0f); | ||||
| 			glVertex3f(0.0f, 0.0f, 1.0f); | ||||
| 		glEnd(); | ||||
| 		 | ||||
| 		if (orbits) | ||||
| 		{ | ||||
| 			glBegin(GL_LINE_LOOP); | ||||
| 				glColor4f(1.0f, 0.0f, 0.0f, 0.4f); | ||||
| 				for (int i=0; i < 360; i++) glVertex3f(sin(DEG2RAD*i) * radius, 0, cos(DEG2RAD*i) * radius); | ||||
| 			glEnd(); | ||||
| 			 | ||||
| 			glBegin(GL_LINE_LOOP); | ||||
| 				glColor4f(0.0f, 1.0f, 0.0f, 0.4f); | ||||
| 				for (int i=0; i < 360; i++) glVertex3f(sin(DEG2RAD*i) * radius, cos(DEG2RAD*i) * radius, 0); | ||||
| 			glEnd(); | ||||
| 			 | ||||
| 			glBegin(GL_LINE_LOOP); | ||||
| 				glColor4f(0.0f, 0.0f, 1.0f, 0.4f); | ||||
| 				for (int i=0; i < 360; i++) glVertex3f(0, sin(DEG2RAD*i) * radius, cos(DEG2RAD*i) * radius); | ||||
| 			glEnd(); | ||||
| 		} | ||||
| 	 | ||||
| 	glPopMatrix(); | ||||
| 	 | ||||
| 	//glDisable(GL_LINE_SMOOTH); | ||||
| } | ||||
|  | ||||
| // Load a 3d model (.OBJ) | ||||
| // TODO: Add comments explaining this function process | ||||
| Model LoadModel(const char *fileName)                                     | ||||
| { | ||||
| 	Model model; | ||||
| 	 | ||||
| 	char dataType; | ||||
| 	char comments[200]; | ||||
| 	 | ||||
| 	int numVertex = 0; | ||||
| 	int numNormals = 0; | ||||
| 	int numTexCoords = 0; | ||||
| 	int numTriangles = 0; | ||||
|  | ||||
| 	FILE* objfile; | ||||
|  | ||||
|     objfile = fopen(fileName, "rt"); | ||||
| 	 | ||||
| 	while(!feof(objfile)) | ||||
| 	{ | ||||
| 		fscanf(objfile, "%c", &dataType); | ||||
| 		 | ||||
| 		switch(dataType) | ||||
| 		{ | ||||
| 			case '#': 		// It's a comment | ||||
| 			{ | ||||
| 				fgets(comments, 200, objfile);				 | ||||
| 			} break; | ||||
| 			case 'v':  | ||||
| 			{ | ||||
| 				fscanf(objfile, "%c", &dataType); | ||||
| 				 | ||||
| 				if (dataType == 't')	// Read texCoord | ||||
| 				{ | ||||
| 					fgets(comments, 200, objfile); | ||||
| 					fscanf(objfile, "%c", &dataType); | ||||
| 				 | ||||
| 					while (dataType == 'v') | ||||
| 					{ | ||||
| 						fgets(comments, 200, objfile); | ||||
| 						fscanf(objfile, "%c", &dataType); | ||||
| 					} | ||||
| 					 | ||||
| 					if (dataType == '#') | ||||
| 					{ | ||||
| 						fscanf(objfile, "%i", &numTexCoords); | ||||
| 					} | ||||
| 					else printf("Ouch! Something was wrong..."); | ||||
| 					 | ||||
| 					fgets(comments, 200, objfile); | ||||
| 				} | ||||
| 				else if (dataType == 'n')	// Read normals | ||||
| 				{ | ||||
| 					fgets(comments, 200, objfile); | ||||
| 					fscanf(objfile, "%c", &dataType); | ||||
| 				 | ||||
| 					while (dataType == 'v') | ||||
| 					{ | ||||
| 						fgets(comments, 200, objfile); | ||||
| 						fscanf(objfile, "%c", &dataType); | ||||
| 					} | ||||
| 					 | ||||
| 					if (dataType == '#') | ||||
| 					{ | ||||
| 						fscanf(objfile, "%i", &numNormals); | ||||
| 					} | ||||
| 					else printf("Ouch! Something was wrong..."); | ||||
| 				 | ||||
| 					fgets(comments, 200, objfile); | ||||
| 				} | ||||
| 				else	// Read vertex | ||||
| 				{ | ||||
| 					fgets(comments, 200, objfile); | ||||
| 					fscanf(objfile, "%c", &dataType); | ||||
| 				 | ||||
| 					while (dataType == 'v') | ||||
| 					{ | ||||
| 						fgets(comments, 200, objfile); | ||||
| 						fscanf(objfile, "%c", &dataType); | ||||
| 					} | ||||
| 					 | ||||
| 					if (dataType == '#') | ||||
| 					{ | ||||
| 						fscanf(objfile, "%i", &numVertex); | ||||
| 					} | ||||
| 					else printf("Ouch! Something was wrong..."); | ||||
| 					 | ||||
| 					fgets(comments, 200, objfile); | ||||
| 				} | ||||
| 			} break; | ||||
| 			case 'f': | ||||
| 			{ | ||||
| 				fgets(comments, 200, objfile); | ||||
| 				fscanf(objfile, "%c", &dataType); | ||||
| 			 | ||||
| 				while (dataType == 'f') | ||||
| 				{ | ||||
| 					fgets(comments, 200, objfile); | ||||
| 					fscanf(objfile, "%c", &dataType); | ||||
| 				} | ||||
| 				 | ||||
| 				if (dataType == '#') | ||||
| 				{ | ||||
| 					fscanf(objfile, "%i", &numTriangles); | ||||
| 				} | ||||
| 				else printf("Ouch! Something was wrong..."); | ||||
| 				 | ||||
| 				fgets(comments, 200, objfile); | ||||
| 			 | ||||
| 			} break; | ||||
| 			default: break; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	Vector3 midVertices[numVertex]; | ||||
| 	Vector3 midNormals[numNormals]; | ||||
| 	Vector2 midTexCoords[numTexCoords]; | ||||
| 	 | ||||
| 	model.numVertices = numTriangles*3; | ||||
|  | ||||
| 	model.vertices = (Vector3 *)malloc(model.numVertices * sizeof(Vector3)); | ||||
| 	model.normals = (Vector3 *)malloc(model.numVertices * sizeof(Vector3)); | ||||
| 	model.texcoords = (Vector2 *)malloc(model.numVertices * sizeof(Vector2)); | ||||
| 	 | ||||
| 	int countVertex = 0; | ||||
| 	int countNormals = 0; | ||||
| 	int countTexCoords = 0; | ||||
| 	 | ||||
| 	int countMaxVertex = 0; | ||||
| 	 | ||||
| 	rewind(objfile); | ||||
| 	 | ||||
| 	while(!feof(objfile)) | ||||
| 	{ | ||||
| 		fscanf(objfile, "%c", &dataType); | ||||
| 		 | ||||
| 		switch(dataType) | ||||
| 		{ | ||||
| 			case '#':  | ||||
| 			{ | ||||
| 				fgets(comments, 200, objfile);				 | ||||
| 			} break; | ||||
| 			case 'v':  | ||||
| 			{ | ||||
| 				fscanf(objfile, "%c", &dataType); | ||||
| 				 | ||||
| 				if (dataType == 't')	// Read texCoord | ||||
| 				{ | ||||
| 					float useless = 0; | ||||
| 				 | ||||
| 					fscanf(objfile, "%f %f %f", &midTexCoords[countTexCoords].x, &midTexCoords[countTexCoords].y, &useless); | ||||
| 					countTexCoords++; | ||||
| 					 | ||||
| 					fscanf(objfile, "%c", &dataType); | ||||
| 				} | ||||
| 				else if (dataType == 'n')	// Read normals | ||||
| 				{ | ||||
| 					fscanf(objfile, "%f %f %f", &midNormals[countNormals].x, &midNormals[countNormals].y, &midNormals[countNormals].z ); | ||||
| 					countNormals++; | ||||
| 					 | ||||
| 					fscanf(objfile, "%c", &dataType); | ||||
| 				} | ||||
| 				else	// Read vertex | ||||
| 				{ | ||||
| 					fscanf(objfile, "%f %f %f", &midVertices[countVertex].x, &midVertices[countVertex].y, &midVertices[countVertex].z ); | ||||
| 					countVertex++; | ||||
| 					 | ||||
| 					fscanf(objfile, "%c", &dataType); | ||||
| 				} | ||||
| 			} break; | ||||
| 			case 'f': | ||||
| 			{ | ||||
| 				int vNum, vtNum, vnNum; | ||||
| 				fscanf(objfile, "%c", &dataType); | ||||
| 				fscanf(objfile, "%i/%i/%i", &vNum, &vtNum, &vnNum); | ||||
| 				 | ||||
| 				model.vertices[countMaxVertex] = midVertices[vNum-1]; | ||||
| 				model.normals[countMaxVertex] = midNormals[vnNum-1]; | ||||
| 				model.texcoords[countMaxVertex].x = midTexCoords[vtNum-1].x; | ||||
| 				model.texcoords[countMaxVertex].y = -midTexCoords[vtNum-1].y; | ||||
| 				countMaxVertex++; | ||||
| 								 | ||||
| 				fscanf(objfile, "%i/%i/%i", &vNum, &vtNum, &vnNum); | ||||
| 				 | ||||
| 				model.vertices[countMaxVertex] = midVertices[vNum-1]; | ||||
| 				model.normals[countMaxVertex] = midNormals[vnNum-1]; | ||||
| 				model.texcoords[countMaxVertex].x = midTexCoords[vtNum-1].x; | ||||
| 				model.texcoords[countMaxVertex].y = -midTexCoords[vtNum-1].y; | ||||
| 				countMaxVertex++; | ||||
| 				 | ||||
| 				fscanf(objfile, "%i/%i/%i", &vNum, &vtNum, &vnNum); | ||||
| 				 | ||||
| 				model.vertices[countMaxVertex] = midVertices[vNum-1]; | ||||
| 				model.normals[countMaxVertex] = midNormals[vnNum-1]; | ||||
| 				model.texcoords[countMaxVertex].x = midTexCoords[vtNum-1].x; | ||||
| 				model.texcoords[countMaxVertex].y = -midTexCoords[vtNum-1].y; | ||||
| 				countMaxVertex++; | ||||
| 			} break; | ||||
| 			default: break; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	fclose(objfile); | ||||
| 	 | ||||
| 	return model; | ||||
| } | ||||
|  | ||||
| // Unload 3d model from memory | ||||
| void UnloadModel(Model model) | ||||
| { | ||||
| 	free(model.vertices); | ||||
| 	free(model.texcoords); | ||||
| 	free(model.normals); | ||||
| } | ||||
|  | ||||
| // Draw a model | ||||
| void DrawModel(Model model, Vector3 position, float scale, Color color) | ||||
| { | ||||
| 	// NOTE: For models we use Vertex Arrays (OpenGL 1.1) | ||||
| 	static float rotation = 0; | ||||
| 	 | ||||
| 	glEnableClientState(GL_VERTEX_ARRAY);						// Enable vertex array | ||||
| 	glEnableClientState(GL_TEXTURE_COORD_ARRAY);				// Enable texture coords array | ||||
| 	glEnableClientState(GL_NORMAL_ARRAY);						// Enable normals array | ||||
| 		 | ||||
| 	glVertexPointer(3, GL_FLOAT, 0, model.vertices);			// Pointer to vertex coords array | ||||
| 	glTexCoordPointer(2, GL_FLOAT, 0, model.texcoords);  		// Pointer to texture coords array | ||||
| 	glNormalPointer(GL_FLOAT, 0, model.normals);  				// Pointer to normals array | ||||
| 	//glColorPointer(4, GL_UNSIGNED_BYTE, 0, model.colors);  	// Pointer to colors array (NOT USED) | ||||
| 		 | ||||
| 	glPushMatrix(); | ||||
| 		glTranslatef(position.x, position.y, position.z); | ||||
| 		glRotatef(rotation * GetFrameTime(), 0, 1, 0); | ||||
| 		glScalef(scale, scale, scale); | ||||
| 		 | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
|  | ||||
| 		glDrawArrays(GL_TRIANGLES, 0, model.numVertices); | ||||
| 	glPopMatrix(); | ||||
| 	 | ||||
| 	glDisableClientState(GL_VERTEX_ARRAY);            			// Disable vertex array | ||||
| 	glDisableClientState(GL_TEXTURE_COORD_ARRAY);				// Disable texture coords array | ||||
| 	glDisableClientState(GL_NORMAL_ARRAY);						// Disable normals array | ||||
| 	 | ||||
| 	rotation += 10; | ||||
| } | ||||
|  | ||||
| // Draw a textured model | ||||
| void DrawModelEx(Model model, Texture2D texture, Vector3 position, float scale, Color tint) | ||||
| { | ||||
| 	glEnable(GL_TEXTURE_2D); | ||||
| 	 | ||||
| 	glBindTexture(GL_TEXTURE_2D, texture.glId); | ||||
| 	 | ||||
| 	DrawModel(model, position, scale, tint); | ||||
| 	 | ||||
| 	glDisable(GL_TEXTURE_2D); | ||||
| } | ||||
|  | ||||
| // Draw a model wires | ||||
| void DrawModelWires(Model model, Vector3 position, float scale, Color color) | ||||
| { | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); | ||||
| 	DrawModel(model, position, scale, color); | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | ||||
| } | ||||
|  | ||||
| // Draw a billboard | ||||
| void DrawBillboard(Camera camera, Texture2D texture, Vector3 basePos, float size, Color tint) | ||||
| { | ||||
| 	// NOTE: Billboard size will represent the width, height maintains aspect ratio | ||||
| 	Vector3 centerPos = { basePos.x, basePos.y + size * (float)texture.height/(float)texture.width/2, basePos.z }; | ||||
| 	Vector2 sizeRatio = { size, size * (float)texture.height/texture.width }; | ||||
| 	Vector3 rotation = { 90, 0, 0 }; | ||||
| 	 | ||||
| 	// TODO: Calculate Y rotation to face always camera (use matrix) | ||||
| 	// OPTION: Lock Y-axis | ||||
|  | ||||
| 	glEnable(GL_TEXTURE_2D); | ||||
| 	 | ||||
| 	glBindTexture(GL_TEXTURE_2D, texture.glId); | ||||
| 	 | ||||
| 	DrawPlane(centerPos, sizeRatio, rotation, tint);	// TODO: Review this function... | ||||
| 	 | ||||
| 	glDisable(GL_TEXTURE_2D); | ||||
| } | ||||
|  | ||||
| // Draw a billboard (part of a texture defined by a rectangle) | ||||
| void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRec, Vector3 basePos, float size, Color tint) | ||||
| { | ||||
| 	// NOTE: Billboard size will represent the width, height maintains aspect ratio | ||||
| 	Vector3 centerPos = { basePos.x, basePos.y + size * (float)texture.height/(float)texture.width/2, basePos.z }; | ||||
| 	Vector2 sizeRatio = { size, size * (float)texture.height/texture.width }; | ||||
| 	Vector3 rotation = { 90, 0, 0 }; | ||||
| 	 | ||||
| 	// TODO: Calculate Y rotation to face always camera (use matrix) | ||||
| 	// OPTION: Lock Y-axis | ||||
|  | ||||
| 	glEnable(GL_TEXTURE_2D); | ||||
| 	 | ||||
| 	glBindTexture(GL_TEXTURE_2D, texture.glId); | ||||
| 	 | ||||
| 	// TODO: DrawPlane with correct textcoords for source rec. | ||||
| 	 | ||||
| 	glDisable(GL_TEXTURE_2D); | ||||
| } | ||||
|  | ||||
| // Draw a heightmap using a provided image data | ||||
| void DrawHeightmap(Image heightmap, Vector3 centerPos, Vector3 scale, Color color) | ||||
| { | ||||
| 	// NOTE: Pixel-data is interpreted as grey-scale (even being a color image) | ||||
| 	// NOTE: Heightmap resolution will depend on image size (one quad per pixel) | ||||
|  | ||||
| 	// TODO: Review how this function works... probably we need: | ||||
| 	// Model LoadHeightmap(Image image, Vector3 resolution); | ||||
| 	 | ||||
| 	// NOTE: We are allocating and de-allocating vertex data every frame! --> framerate drops 80%! CRAZY! | ||||
| 	Vector3 *terrainVertex = (Vector3 *)malloc(heightmap.width * heightmap.height * sizeof(Vector3)); | ||||
|  | ||||
| 	for (int z = 0; z < heightmap.height; z++) | ||||
| 	{ | ||||
| 		for (int x = 0; x < heightmap.width; x++) | ||||
| 		{ | ||||
| 			terrainVertex[z*heightmap.height + x].x = (float)(x*scale.x); | ||||
| 			terrainVertex[z*heightmap.height + x].y = ((float)heightmap.pixels[z*heightmap.height + x].r + | ||||
| 									(float)heightmap.pixels[z*heightmap.height + x].g + | ||||
| 									(float)heightmap.pixels[z*heightmap.height + x].b) / 3 * scale.y; | ||||
| 			terrainVertex[z*heightmap.height + x].z = (float)(-z*scale.z); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	// TODO: Texture coordinates and normals computing | ||||
| 	 | ||||
| 	for (int z = 0; z < heightmap.height-1; z++) | ||||
| 	{ | ||||
| 		glBegin(GL_TRIANGLE_STRIP); | ||||
| 		for (int x = 0; x < heightmap.width; x++) | ||||
| 		{ | ||||
| 			glColor3f((float)heightmap.pixels[z*heightmap.height + x].r / 255.0f, | ||||
| 					  (float)heightmap.pixels[z*heightmap.height + x].g / 255.0f, | ||||
| 					  (float)heightmap.pixels[z*heightmap.height + x].b / 255.0f); | ||||
| 			 | ||||
| 			glVertex3f(terrainVertex[z*heightmap.height + x].x, terrainVertex[z*heightmap.height + x].y, terrainVertex[z*heightmap.height + x].z); | ||||
| 			glVertex3f(terrainVertex[(z+1)*heightmap.height + x].x, terrainVertex[(z+1)*heightmap.height + x].y, terrainVertex[(z+1)*heightmap.height + x].z); | ||||
| 		} | ||||
| 		glEnd(); | ||||
| 	} | ||||
| 	 | ||||
| 	free(terrainVertex); | ||||
| } | ||||
|  | ||||
| void DrawHeightmapEx(Image heightmap, Texture2D texture, Vector3 centerPos, Vector3 scale, Color tint) | ||||
| { | ||||
| 	glEnable(GL_TEXTURE_2D); | ||||
| 	 | ||||
| 	glBindTexture(GL_TEXTURE_2D, texture.glId); | ||||
| 	 | ||||
| 	// NOTE: No texture coordinates or normals defined at this moment... | ||||
| 	DrawHeightmap(heightmap, centerPos, scale, tint); | ||||
| 	 | ||||
| 	glDisable(GL_TEXTURE_2D); | ||||
| } | ||||
							
								
								
									
										376
									
								
								src/raylib.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,376 @@ | ||||
| /********************************************************************************************* | ||||
| *  | ||||
| *	raylib 1.0.0 (www.raylib.com) | ||||
| *	 | ||||
| *	A simple and easy-to-use library to learn C videogames programming | ||||
| * | ||||
| *	Features: | ||||
| *	  Library written in plain C code (C99) | ||||
| *	  Uses C# PascalCase/camelCase notation | ||||
| *	  Hardware accelerated with OpenGL 1.1 | ||||
| *	  Powerful fonts module with SpriteFonts support | ||||
| *	  Basic 3d support for Shapes and Models | ||||
| *	  Audio loading and playing | ||||
| *	 | ||||
| *	Used external libs: | ||||
| *	  GLFW3 (www.glfw.org) for window/context management and input | ||||
| *	  stb_image (Sean Barret) for images loading (JPEG, PNG, BMP, TGA, PSD, GIF, HDR, PIC) | ||||
| *	  OpenAL Soft for audio device/context management | ||||
| * | ||||
| *	Some design decisions: | ||||
| *	  32bit Colors - All defined color are always RGBA | ||||
| *	  32bit Textures - All loaded images are converted automatically to RGBA textures | ||||
| *	  SpriteFonts - All loaded sprite-font images are converted to RGBA and POT textures | ||||
| *	  One custom default font is loaded automatically when InitWindow() | ||||
| *  | ||||
| *	-- LICENSE (raylib v1.0, November 2013) -- | ||||
| * | ||||
| *	raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified,  | ||||
| *	BSD-like license that allows static linking with closed source software: | ||||
| *	 | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| *	 | ||||
| *	This software is provided "as-is", without any express or implied warranty. In no event  | ||||
| *	will the authors be held liable for any damages arising from the use of this software. | ||||
| * | ||||
| *	Permission is granted to anyone to use this software for any purpose, including commercial  | ||||
| *	applications, and to alter it and redistribute it freely, subject to the following restrictions: | ||||
| * | ||||
| *	  1. The origin of this software must not be misrepresented; you must not claim that you  | ||||
| *	  wrote the original software. If you use this software in a product, an acknowledgment  | ||||
| *	  in the product documentation would be appreciated but is not required. | ||||
| * | ||||
| *	  2. Altered source versions must be plainly marked as such, and must not be misrepresented | ||||
| *	  as being the original software. | ||||
| * | ||||
| *	  3. This notice may not be removed or altered from any source distribution. | ||||
| * | ||||
| **********************************************************************************************/ | ||||
|  | ||||
| #ifndef RAYLIB_H | ||||
| #define RAYLIB_H  | ||||
|  | ||||
| //#define NO_AUDIO	// Audio is still being tested, deactivated by default | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Some basic Defines | ||||
| //---------------------------------------------------------------------------------- | ||||
| #ifndef PI | ||||
| #define PI 3.14159265358979323846 | ||||
| #endif | ||||
|  | ||||
| #define DEG2RAD (PI / 180.0) | ||||
| #define RAD2DEG (180.0 / PI) | ||||
|  | ||||
| // Keyboard Function Keys | ||||
| #define KEY_SPACE            32 | ||||
| #define KEY_ESCAPE          256 | ||||
| #define KEY_ENTER           257 | ||||
| #define KEY_RIGHT           262 | ||||
| #define KEY_LEFT            263 | ||||
| #define KEY_DOWN            264 | ||||
| #define KEY_UP              265 | ||||
| #define KEY_F1              290 | ||||
| #define KEY_F2              291 | ||||
| #define KEY_F3              292 | ||||
| #define KEY_F4              293 | ||||
| #define KEY_F5              294 | ||||
| #define KEY_F6              295 | ||||
| #define KEY_F7              296 | ||||
| #define KEY_F8              297 | ||||
| #define KEY_F9              298 | ||||
| #define KEY_F10             299 | ||||
| #define KEY_LEFT_SHIFT      340 | ||||
| #define KEY_LEFT_CONTROL    341 | ||||
| #define KEY_LEFT_ALT        342 | ||||
| #define KEY_RIGHT_SHIFT     344 | ||||
| #define KEY_RIGHT_CONTROL   345 | ||||
| #define KEY_RIGHT_ALT       346 | ||||
|  | ||||
| // Mouse Buttons | ||||
| #define MOUSE_LEFT_BUTTON	  0 | ||||
| #define MOUSE_RIGHT_BUTTON	  1 | ||||
| #define MOUSE_MIDDLE_BUTTON	  2 | ||||
|  | ||||
| // Gamepad Number | ||||
| #define GAMEPAD_PLAYER1		  0 | ||||
| #define GAMEPAD_PLAYER2		  1 | ||||
| #define GAMEPAD_PLAYER3		  2 | ||||
| #define GAMEPAD_PLAYER4		  3 | ||||
|  | ||||
| // Gamepad Buttons | ||||
| // NOTE: Adjusted for a PS3 USB Controller | ||||
| #define GAMEPAD_BUTTON_A		2 | ||||
| #define GAMEPAD_BUTTON_B		1 | ||||
| #define GAMEPAD_BUTTON_X		3 | ||||
| #define GAMEPAD_BUTTON_Y		4 | ||||
| #define GAMEPAD_BUTTON_R1		7 | ||||
| #define GAMEPAD_BUTTON_R2		5 | ||||
| #define GAMEPAD_BUTTON_L1		6 | ||||
| #define GAMEPAD_BUTTON_L2		8 | ||||
| #define GAMEPAD_BUTTON_SELECT   9 | ||||
| #define GAMEPAD_BUTTON_START   10 | ||||
|  | ||||
| // TODO: Review Xbox360 USB Controller Buttons | ||||
|  | ||||
| // Some Basic Colors | ||||
| // NOTE: Custom raylib color palette for amazing visuals on WHITE background | ||||
| #define LIGHTGRAY 	(Color){ 200, 200, 200, 255 }	// Light Gray | ||||
| #define GRAY 		(Color){ 130, 130, 130, 255 }	// Gray | ||||
| #define DARKGRAY 	(Color){ 80, 80, 80, 255 }		// Dark Gray | ||||
| #define YELLOW 		(Color){ 253, 249, 0, 255 }		// Yellow | ||||
| #define GOLD		(Color){ 255, 203, 0, 255 }		// Gold | ||||
| #define ORANGE		(Color){ 255, 161, 0, 255 }		// Orange | ||||
| #define PINK		(Color){ 255, 109, 194, 255 }	// Pink | ||||
| #define RED			(Color){ 230, 41, 55, 255 }		// Red | ||||
| #define MAROON		(Color){ 190, 33, 55, 255 }		// Maroon | ||||
| #define GREEN 		(Color){ 0, 228, 48, 255 }		// Green | ||||
| #define LIME		(Color){ 0, 158, 47, 255 }		// Lime | ||||
| #define DARKGREEN	(Color){ 0, 117, 44, 255 }		// Dark Green | ||||
| #define SKYBLUE 	(Color){ 102, 191, 255, 255 }	// Sky Blue | ||||
| #define BLUE 		(Color){ 0, 121, 241, 255 }		// Blue | ||||
| #define DARKBLUE	(Color){ 0, 82, 172, 255 }		// Dark Blue | ||||
| #define PURPLE		(Color){ 200, 122, 255, 255 }	// Purple | ||||
| #define VIOLET		(Color){ 135, 60, 190, 255 }	// Violet | ||||
| #define DARKPURPLE	(Color){ 112, 31, 126, 255 }	// Dark Purple | ||||
| #define BEIGE		(Color){ 211, 176, 131, 255 }	// Beige | ||||
| #define BROWN 		(Color){ 127, 106, 79, 255 }	// Brown | ||||
| #define DARKBROWN 	(Color){ 76, 63, 47, 255 }		// Dark Brown | ||||
|  | ||||
| #define WHITE 		(Color){ 255, 255, 255, 255 }	// White | ||||
| #define BLACK 		(Color){ 0, 0, 0, 255 }			// Black | ||||
| #define BLANK		(Color){ 0, 0, 0, 0 }			// Blank (Transparent) | ||||
| #define MAGENTA 	(Color){ 255, 0, 255, 255 }		// Magenta | ||||
| #define RAYWHITE	(Color){ 245, 245, 245, 255 }	// My own White (raylib logo) | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // Boolean type | ||||
| typedef enum { false, true } bool; | ||||
|  | ||||
| // Color type, RGBA (32bit) | ||||
| typedef struct Color { | ||||
| 	unsigned char r; | ||||
| 	unsigned char g; | ||||
| 	unsigned char b; | ||||
| 	unsigned char a; | ||||
| } Color; | ||||
|  | ||||
| // Rectangle type | ||||
| typedef struct Rectangle { | ||||
| 	int x; | ||||
| 	int y; | ||||
| 	int width; | ||||
| 	int height; | ||||
| } Rectangle; | ||||
|  | ||||
| // Image type, bpp always RGBA (32bit) | ||||
| // NOTE: Data stored in CPU memory (RAM) | ||||
| typedef struct Image { | ||||
| 	Color *pixels; | ||||
| 	int width; | ||||
| 	int height; | ||||
| } Image; | ||||
|  | ||||
| // Texture2D type, bpp always RGBA (32bit) | ||||
| // NOTE: Data stored in GPU memory | ||||
| typedef struct Texture2D { | ||||
| 	unsigned int glId; | ||||
| 	int width; | ||||
| 	int height; | ||||
| } Texture2D; | ||||
|  | ||||
| // SpriteFont one Character (Glyph) data, defined in text module | ||||
| typedef struct Character Character; | ||||
|  | ||||
| // SpriteFont type, includes texture and charSet array data | ||||
| typedef struct SpriteFont { | ||||
| 	Texture2D texture; | ||||
| 	int numChars; | ||||
| 	Character *charSet; | ||||
| } SpriteFont; | ||||
|  | ||||
| // Vector2 type | ||||
| typedef struct Vector2 { | ||||
| 	float x; | ||||
| 	float y; | ||||
| } Vector2; | ||||
|  | ||||
| // Vector3 type | ||||
| typedef struct Vector3 { | ||||
| 	float x; | ||||
| 	float y; | ||||
| 	float z; | ||||
| } Vector3; | ||||
|  | ||||
| // Camera type, defines a camera position/orientation in 3d space | ||||
| typedef struct Camera { | ||||
| 	Vector3 position; | ||||
| 	Vector3 target; | ||||
| 	Vector3 up; | ||||
| } Camera; | ||||
|  | ||||
| // Basic 3d Model type | ||||
| typedef struct Model { | ||||
| 	int numVertices; | ||||
| 	Vector3 *vertices; | ||||
| 	Vector2 *texcoords; | ||||
| 	Vector3 *normals; | ||||
| } Model; | ||||
|  | ||||
| // Basic Sound source and buffer | ||||
| typedef struct Sound { | ||||
| 	unsigned int source; | ||||
| 	unsigned int buffer; | ||||
| } Sound; | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" {			// Prevents name mangling of functions | ||||
| #endif | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Global Variables Definition | ||||
| //------------------------------------------------------------------------------------ | ||||
| // It's lonely here... | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Window and Graphics Device Functions (Module: core) | ||||
| //------------------------------------------------------------------------------------ | ||||
| void InitWindow(int width, int height, char* title);	// Initialize Window and Graphics Context (OpenGL) | ||||
| void CloseWindow();										// Close Window and Terminate Context | ||||
| bool WindowShouldClose();								// Detect if KEY_ESCAPE pressed or Close icon pressed | ||||
| void ToggleFullscreen();								// Fullscreen toggle (by default F11) | ||||
|  | ||||
| void ClearBackground(Color color);						// Sets Background Color | ||||
| void BeginDrawing();									// Setup drawing canvas to start drawing | ||||
| void EndDrawing();										// End canvas drawing and Swap Buffers (Double Buffering) | ||||
|  | ||||
| void Begin3dMode(Camera cam);							// Initializes 3D mode for drawing (Camera setup) | ||||
| void End3dMode();										// Ends 3D mode and returns to default 2D orthographic mode | ||||
|  | ||||
| void SetTargetFPS(int fps);								// Set target FPS (maximum) | ||||
| float GetFPS();											// Returns current FPS | ||||
| float GetFrameTime();									// Returns time in seconds for one frame | ||||
|  | ||||
| Color GetColor(int hexValue);							// Returns a Color struct from hexadecimal value | ||||
| int GetHexValue(Color color);							// Returns hexadecimal value for a Color | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Input Handling Functions (Module: core) | ||||
| //------------------------------------------------------------------------------------ | ||||
| bool IsKeyPressed(int key);								// Detect if a key is being pressed | ||||
| bool IsKeyReleased(int key);							// Detect if a key is NOT being pressed | ||||
|  | ||||
| bool IsMouseButtonPressed(int button);					// Detect if a mouse button is being pressed | ||||
| bool IsMouseButtonReleased(int button);					// Detect if a mouse button is NOT being pressed | ||||
| int GetMouseX();										// Returns mouse position X | ||||
| int GetMouseY();										// Returns mouse position Y | ||||
| Vector2 GetMousePosition();								// Returns mouse position XY | ||||
|  | ||||
| bool IsGamepadAvailable(int gamepad);					// Detect if a gamepad is available | ||||
| Vector2 GetGamepadMovement(int gamepad);				// Return axis movement vector for a gamepad | ||||
| bool IsGamepadButtonPressed(int gamepad, int button);	// Detect if a gamepad button is being pressed | ||||
| bool IsGamepadButtonReleased(int gamepad, int button);	// Detect if a gamepad button is NOT being pressed | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Basic Shapes Drawing Functions (Module: shapes) | ||||
| //------------------------------------------------------------------------------------ | ||||
| void DrawPixel(int posX, int posY, Color color);													// Draw a pixel | ||||
| void DrawPixelV(Vector2 position, Color color);														// Draw a pixel (Vector version) | ||||
| void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color);					// Draw a line | ||||
| void DrawLineV(Vector2 startPos, Vector2 endPos, Color color);										// Draw a line (Vector version) | ||||
| void DrawCircle(int centerX, int centerY, float radius, Color color);								// Draw a color-filled circle | ||||
| void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2);		// Draw a gradient-filled circle | ||||
| void DrawCircleV(Vector2 center, float radius, Color color);										// Draw a color-filled circle (Vector version) | ||||
| void DrawCircleLines(int centerX, int centerY, float radius, Color color);							// Draw circle outline | ||||
| void DrawRectangle(int posX, int posY, int width, int height, Color color);							// Draw a color-filled rectangle | ||||
| void DrawRectangleRec(Rectangle rec, Color color);													// Draw a color-filled rectangle | ||||
| void DrawRectangleGradient(int posX, int posY, int width, int height, Color color1, Color color2);	// Draw a gradient-filled rectangle | ||||
| void DrawRectangleV(Vector2 position, Vector2 size, Color color);									// Draw a color-filled rectangle (Vector version) | ||||
| void DrawRectangleLines(int posX, int posY, int width, int height, Color color);					// Draw rectangle outline | ||||
| void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color);									// Draw a color-filled triangle | ||||
| void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color);							// Draw triangle outline | ||||
| void DrawPoly(Vector2 *points, int numPoints, Color color);											// Draw a closed polygon defined by points | ||||
| void DrawPolyLine(Vector2 *points, int numPoints, Color color);										// Draw polygon lines | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Texture Loading and Drawing Functions (Module: textures) | ||||
| //------------------------------------------------------------------------------------ | ||||
| Image LoadImage(const char *fileName);																// Load an image into CPU memory (RAM) | ||||
| void UnloadImage(Image image);																		// Unload image from CPU memory (RAM) | ||||
| Texture2D LoadTexture(const char *fileName);														// Load an image as texture into GPU memory | ||||
| //Texture2D LoadTextureEx(const char *fileName, bool createPOT, bool mipmaps);						// Load an image as texture (and convert to POT with mipmaps) (raylib 1.x) | ||||
| void UnloadTexture(Texture2D texture);																// Unload texture from GPU memory | ||||
| void DrawTexture(Texture2D texture, int posX, int posY, Color tint);								// Draw a Texture2D | ||||
| void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint);	// Draw a Texture2D with extended parameters | ||||
| void DrawTextureRec(Texture2D texture, Rectangle sourceRec, Vector2 position, float scale, Color tint);		// Draw a part of a texture defined by a rectangle | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Font Loading and Text Drawing Functions (Module: text) | ||||
| //------------------------------------------------------------------------------------ | ||||
| SpriteFont LoadSpriteFont(const char *fileName);													// Load a SpriteFont image into GPU memory | ||||
| void UnloadSpriteFont(SpriteFont spriteFont);														// Unload SpriteFont from GPU memory | ||||
| void DrawText(const char *text, int posX, int posY, int fontSize, int spacing, Color color);			// Draw text (using default font) | ||||
| void DrawTextEx(SpriteFont spriteFont, const char* text, Vector2 position, int fontSize, int spacing, Color tint);	// Draw text using SpriteFont | ||||
| int MeasureText(const char *text, int fontSize, int spacing);										// Measure string width for default font | ||||
| Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, int fontSize, int spacing);			// Measure string size for SpriteFont | ||||
| int GetFontBaseSize(SpriteFont spriteFont);															// Returns the base size for a SpriteFont (chars height) | ||||
| void DrawFps(int posX, int posY);																	// Shows current FPS on top-left corner | ||||
| const char *FormatText(const char *text, ...);														// Formatting of text with variables to 'embed' | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Basic 3d Shapes Drawing Functions (Module: models) | ||||
| //------------------------------------------------------------------------------------ | ||||
| void DrawCube(Vector3 position, float width, float height, float lenght, Color color);				// Draw cube | ||||
| void DrawCubeV(Vector3 position, Vector3 size, Color color);										// Draw cube (Vector version) | ||||
| void DrawCubeWires(Vector3 position, float width, float height, float lenght, Color color);			// Draw cube wires | ||||
| void DrawSphere(Vector3 centerPos, float radius, Color color);										// Draw sphere | ||||
| void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color);				// Draw sphere with extended parameters | ||||
| void DrawSphereWires(Vector3 centerPos, float radius, Color color);									// Draw sphere wires | ||||
| void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color);			// Draw a cylinder/cone | ||||
| void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color);		// Draw a cylinder/cone wires | ||||
| void DrawPlane(Vector3 centerPos, Vector2 size, Vector3 rotation, Color color);						// Draw a plane | ||||
| void DrawPlaneEx(Vector3 centerPos, Vector2 size, Vector3 rotation, int slicesX, int slicesZ, Color color);	// Draw a plane with divisions | ||||
| void DrawGrid(int slices, float spacing);															// Draw a grid (centered at (0, 0, 0)) | ||||
| void DrawGizmo(Vector3 position, bool orbits);														// Draw gizmo (with or without orbits) | ||||
| //DrawTorus(), DrawTeapot() are useless... | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Model 3d Loading and Drawing Functions (Module: models) | ||||
| //------------------------------------------------------------------------------------ | ||||
| Model LoadModel(const char *fileName);																// Load a 3d model (.OBJ) | ||||
| void UnloadModel(Model model);																		// Unload 3d model from memory | ||||
| void DrawModel(Model model, Vector3 position, float scale, Color color);							// Draw a model | ||||
| void DrawModelEx(Model model, Texture2D texture, Vector3 position, float scale, Color tint);		// Draw a textured model | ||||
| void DrawModelWires(Model model, Vector3 position, float scale, Color color);						// Draw a model wires | ||||
|  | ||||
| // NOTE: The following functions work but are incomplete or require some revision | ||||
| // DrawHeightmap is extremely inefficient and can impact performance up to 60% | ||||
| void DrawBillboard(Camera camera, Texture2D texture, Vector3 basePos, float size, Color tint);							// REVIEW: Draw a billboard (raylib 1.x) | ||||
| void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRec, Vector3 basePos, float size, Color tint);	// REVIEW: Draw a billboard (raylib 1.x) | ||||
| void DrawHeightmap(Image heightmap, Vector3 centerPos, Vector3 scale, Color color);								// REVIEW: Draw heightmap using image map (raylib 1.x) | ||||
| void DrawHeightmapEx(Image heightmap, Texture2D texture, Vector3 centerPos, Vector3 scale, Color tint);			// REVIEW: Draw textured heightmap (raylib 1.x) | ||||
|  | ||||
| #ifndef NO_AUDIO | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Audio Loading and Playing Functions (Module: audio) | ||||
| //------------------------------------------------------------------------------------ | ||||
| void InitAudioDevice();												// Initialize audio device and context | ||||
| void CloseAudioDevice();											// Close the audio device and context | ||||
| Sound LoadSound(char *fileName);									// Load sound to memory | ||||
| void UnloadSound(Sound sound);										// Unload sound | ||||
| void PlaySound(Sound sound);										// Play a sound | ||||
| void PlaySoundEx(Sound sound, float timePosition, bool loop);		// Play a sound with extended parameters | ||||
| void PauseSound(Sound sound);										// Pause a sound | ||||
| void StopSound(Sound sound);										// Stop playing a sound | ||||
|  | ||||
| #endif	// NO_AUDIO | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif // RAYLIB_H | ||||
							
								
								
									
										326
									
								
								src/shapes.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,326 @@ | ||||
| /********************************************************************************************* | ||||
| * | ||||
| *	raylib.shapes | ||||
| * | ||||
| *	Basic functions to draw 2d Shapes | ||||
| *	  | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| *	 | ||||
| *	This software is provided "as-is", without any express or implied warranty. In no event  | ||||
| *	will the authors be held liable for any damages arising from the use of this software. | ||||
| * | ||||
| *	Permission is granted to anyone to use this software for any purpose, including commercial  | ||||
| *	applications, and to alter it and redistribute it freely, subject to the following restrictions: | ||||
| * | ||||
| *	  1. The origin of this software must not be misrepresented; you must not claim that you  | ||||
| *	  wrote the original software. If you use this software in a product, an acknowledgment  | ||||
| *	  in the product documentation would be appreciated but is not required. | ||||
| * | ||||
| *	  2. Altered source versions must be plainly marked as such, and must not be misrepresented | ||||
| *	  as being the original software. | ||||
| * | ||||
| *	  3. This notice may not be removed or altered from any source distribution. | ||||
| * | ||||
| **********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| #include <GL/gl.h>		// OpenGL functions | ||||
| #include <math.h>		// Math related functions, sin() and cos() used on DrawCircle* | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Defines and Macros | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Nop... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Not here... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Global Variables Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| // It's lonely here... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Declaration | ||||
| //---------------------------------------------------------------------------------- | ||||
| // No private (static) functions in this module (.c file) | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module Functions Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // Draw a pixel | ||||
| void DrawPixel(int posX, int posY, Color color) | ||||
| { | ||||
| 	glBegin(GL_POINTS); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		glVertex2i(posX, posY); | ||||
| 	glEnd(); | ||||
| 	 | ||||
| 	// NOTE: Alternative method to draw a pixel (point) | ||||
| /* | ||||
| 	glEnable(GL_POINT_SMOOTH); | ||||
| 	glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);	// Deprecated on OGL 3.0 | ||||
| 	 | ||||
| 	glPointSize(1.0f); | ||||
| 	glPoint((float)posX, (float)posY, 0.0f); | ||||
| */ | ||||
| } | ||||
|  | ||||
| // Draw a pixel (Vector version) | ||||
| void DrawPixelV(Vector2 position, Color color) | ||||
| { | ||||
| 	glBegin(GL_POINTS); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		glVertex2f(position.x, position.y); | ||||
| 	glEnd(); | ||||
| } | ||||
|  | ||||
| // Draw a line | ||||
| void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color) | ||||
| { | ||||
| 	glBegin(GL_LINES); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		glVertex2i(startPosX, startPosY); | ||||
| 		glVertex2i(endPosX, endPosY); | ||||
| 	glEnd(); | ||||
| } | ||||
|  | ||||
| // Draw a line  (Vector version) | ||||
| void DrawLineV(Vector2 startPos, Vector2 endPos, Color color) | ||||
| { | ||||
| 	glBegin(GL_LINES); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		glVertex2f(startPos.x, startPos.y); | ||||
| 		glVertex2f(endPos.x, endPos.y); | ||||
| 	glEnd(); | ||||
| } | ||||
|  | ||||
| // Draw a color-filled circle | ||||
| void DrawCircle(int centerX, int centerY, float radius, Color color) | ||||
| { | ||||
| 	glEnable(GL_POLYGON_SMOOTH); | ||||
| 	glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); | ||||
| 	 | ||||
| 	glBegin(GL_TRIANGLE_FAN); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		glVertex2i(centerX, centerY); | ||||
|  | ||||
| 		for (int i=0; i <= 360; i++)		//i++ --> Step = 1.0 pixels | ||||
| 		{ | ||||
| 			float degInRad = i*DEG2RAD; | ||||
| 			//glVertex2f(cos(degInRad)*radius,sin(degInRad)*radius); | ||||
|  | ||||
| 			glVertex2f(centerX + sin(degInRad) * radius, centerY + cos(degInRad) * radius); | ||||
| 		} | ||||
| 	glEnd(); | ||||
| 	 | ||||
| 	glDisable(GL_POLYGON_SMOOTH); | ||||
| 	 | ||||
| 	// NOTE: Alternative method to draw a circle (point) | ||||
| /* | ||||
| 	glEnable(GL_POINT_SMOOTH); | ||||
| 	glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);	// Deprecated on OGL 3.0 | ||||
| 	 | ||||
| 	glPointSize(radius); | ||||
| 	glPoint((float)centerX, (float)centerY, 0.0f); | ||||
| */ | ||||
| } | ||||
|  | ||||
| // Draw a gradient-filled circle | ||||
| // NOTE: Gradient goes from center (color1) to border (color2) | ||||
| void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2) | ||||
| { | ||||
| 	glBegin(GL_TRIANGLE_FAN); | ||||
| 		glColor4ub(color1.r, color1.g, color1.b, color1.a); | ||||
| 		glVertex2i(centerX, centerY); | ||||
| 		glColor4ub(color2.r, color2.g, color2.b, color2.a); | ||||
| 		 | ||||
| 		for (int i=0; i <= 360; i++)		//i++ --> Step = 1.0 pixels | ||||
| 		{ | ||||
| 			glVertex2f(centerX + sin(DEG2RAD*i) * radius, centerY + cos(DEG2RAD*i) * radius); | ||||
| 		} | ||||
| 	glEnd(); | ||||
| } | ||||
|  | ||||
| // Draw a color-filled circle (Vector version) | ||||
| void DrawCircleV(Vector2 center, float radius, Color color) | ||||
| { | ||||
| 	glEnable(GL_POLYGON_SMOOTH); | ||||
| 	glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); | ||||
| 	 | ||||
| 	glBegin(GL_TRIANGLE_FAN); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		glVertex2f(center.x, center.y); | ||||
|  | ||||
| 		for (int i=0; i <= 360; i++)		//i++ --> Step = 1.0 pixels | ||||
| 		{ | ||||
| 			glVertex2f(center.x + sin(DEG2RAD*i) * radius, center.y + cos(DEG2RAD*i) * radius); | ||||
| 		} | ||||
| 	glEnd(); | ||||
| 	 | ||||
| 	glDisable(GL_POLYGON_SMOOTH); | ||||
| } | ||||
|  | ||||
| // Draw circle outline | ||||
| void DrawCircleLines(int centerX, int centerY, float radius, Color color) | ||||
| { | ||||
| 	glEnable(GL_LINE_SMOOTH);					// Smoothies circle outline (anti-aliasing applied) | ||||
| 	glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);		// Best quality for line smooth (anti-aliasing best algorithm) | ||||
| 	 | ||||
| 	glBegin(GL_LINE_LOOP); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		 | ||||
| 		// NOTE: Circle outline is drawn pixel by pixel every degree (0 to 360) | ||||
| 		for (int i=0; i < 360; i++) | ||||
| 		{ | ||||
| 			glVertex2f(centerX + sin(DEG2RAD*i) * radius, centerY + cos(DEG2RAD*i) * radius); | ||||
| 		} | ||||
|    glEnd(); | ||||
|     | ||||
| // NOTE: Alternative method to draw circle outline | ||||
| /* | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); | ||||
| 	DrawCircle(centerX, centerY, radius, color); | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | ||||
| */ | ||||
|    glDisable(GL_LINE_SMOOTH); | ||||
| } | ||||
|  | ||||
| // Draw a color-filled rectangle | ||||
| void DrawRectangle(int posX, int posY, int width, int height, Color color) | ||||
| { | ||||
| 	glBegin(GL_QUADS); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		glVertex2i(posX, posY); | ||||
| 		glVertex2i(posX + width, posY); | ||||
| 		glVertex2i(posX + width, posY + height); | ||||
| 		glVertex2i(posX, posY + height); | ||||
| 	glEnd(); | ||||
| } | ||||
|  | ||||
| // Draw a color-filled rectangle | ||||
| void DrawRectangleRec(Rectangle rec, Color color) | ||||
| { | ||||
| 	DrawRectangle(rec.x, rec.y, rec.width, rec.height, color); | ||||
| }											 | ||||
|  | ||||
| // Draw a gradient-filled rectangle | ||||
| // NOTE: Gradient goes from bottom (color1) to top (color2) | ||||
| void DrawRectangleGradient(int posX, int posY, int width, int height, Color color1, Color color2) | ||||
| { | ||||
| 	glBegin(GL_QUADS); | ||||
| 		glColor4ub(color1.r, color1.g, color1.b, color1.a); | ||||
| 		glVertex2i(posX, posY); | ||||
| 		glVertex2i(posX + width, posY); | ||||
| 		glColor4ub(color2.r, color2.g, color2.b, color2.a); | ||||
| 		glVertex2i(posX + width, posY + height); | ||||
| 		glVertex2i(posX, posY + height); | ||||
| 	glEnd(); | ||||
| } | ||||
|  | ||||
| // Draw a color-filled rectangle (Vector version) | ||||
| void DrawRectangleV(Vector2 position, Vector2 size, Color color) | ||||
| { | ||||
| 	glBegin(GL_QUADS); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		glVertex2i(position.x, position.y); | ||||
| 		glVertex2i(position.x + size.x, position.y); | ||||
| 		glVertex2i(position.x + size.x, position.y + size.y); | ||||
| 		glVertex2i(position.x, position.y + size.y); | ||||
| 	glEnd(); | ||||
| } | ||||
|  | ||||
| // Draw rectangle outline | ||||
| void DrawRectangleLines(int posX, int posY, int width, int height, Color color) | ||||
| { | ||||
| 	//glEnable(GL_LINE_SMOOTH);						// Smoothies circle outline (anti-aliasing applied) | ||||
| 	//glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);		// Best quality for line smooth (anti-aliasing best algorithm) | ||||
| 	 | ||||
| 	// NOTE: Lines are rasterized using the "Diamond Exit" rule so, it's nearly impossible to obtain a pixel-perfect engine | ||||
| 	// NOTE: Recommended trying to avoid using lines, at least >1.0f pixel lines with anti-aliasing (glLineWidth function) | ||||
|  | ||||
| 	glBegin(GL_LINE_LOOP); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		glVertex2i(posX, posY); | ||||
| 		glVertex2i(posX + width - 1, posY); | ||||
| 		glVertex2i(posX + width - 1, posY + height - 1); | ||||
| 		glVertex2i(posX, posY + height - 1); | ||||
| 	glEnd(); | ||||
|  | ||||
| // NOTE: Alternative method to draw rectangle outline | ||||
| /* | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); | ||||
| 	DrawRectangle(posX, posY, width - 1, height - 1, color); | ||||
| 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | ||||
| */ | ||||
| 	//glDisable(GL_LINE_SMOOTH); | ||||
| } | ||||
|  | ||||
| // Draw a triangle | ||||
| void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color) | ||||
| { | ||||
| 	glBegin(GL_TRIANGLES); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		glVertex2f(v1.x, v1.y); | ||||
| 		glVertex2f(v2.x, v2.y); | ||||
| 		glVertex2f(v3.x, v3.y); | ||||
| 	glEnd(); | ||||
| } | ||||
|  | ||||
| void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color) | ||||
| { | ||||
| 	glBegin(GL_LINE_LOOP); | ||||
| 		glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 		glVertex2f(v1.x, v1.y); | ||||
| 		glVertex2f(v2.x, v2.y); | ||||
| 		glVertex2f(v3.x, v3.y); | ||||
| 	glEnd(); | ||||
| } | ||||
|  | ||||
| // Draw a closed polygon defined by points | ||||
| // NOTE: Array num elements MUST be passed as parameter to function | ||||
| void DrawPoly(Vector2 *points, int numPoints, Color color) | ||||
| { | ||||
| 	if (numPoints >= 3) | ||||
| 	{ | ||||
| 		glEnable(GL_POLYGON_SMOOTH); | ||||
| 		glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); | ||||
| 	 | ||||
| 		glBegin(GL_POLYGON); | ||||
| 			glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 			 | ||||
| 			for (int i = 0; i < numPoints; i++) | ||||
| 			{ | ||||
| 				glVertex2f(points[i].x, points[i].y); | ||||
| 			} | ||||
| 		glEnd(); | ||||
| 		 | ||||
| 		glDisable(GL_POLYGON_SMOOTH); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Draw polygon lines | ||||
| // NOTE: Array num elements MUST be passed as parameter to function												 | ||||
| void DrawPolyLine(Vector2 *points, int numPoints, Color color) | ||||
| { | ||||
| 	if (numPoints >= 2) | ||||
| 	{ | ||||
| 		//glEnable(GL_LINE_SMOOTH);						// Smoothies circle outline (anti-aliasing applied) | ||||
| 		//glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);		// Best quality for line smooth (anti-aliasing best algorithm) | ||||
| 	 | ||||
| 		glBegin(GL_LINE_LOOP); | ||||
| 			glColor4ub(color.r, color.g, color.b, color.a); | ||||
| 			 | ||||
| 			for (int i = 0; i < numPoints; i++) | ||||
| 			{ | ||||
| 				glVertex2f(points[i].x, points[i].y); | ||||
| 			} | ||||
| 		glEnd(); | ||||
| 		 | ||||
| 		//glDisable(GL_LINE_SMOOTH); | ||||
| 	} | ||||
| }												 | ||||
							
								
								
									
										4341
									
								
								src/stb_image.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										334
									
								
								src/stb_image.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,334 @@ | ||||
| /* stbi-1.33 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c | ||||
|    when you control the images you're loading | ||||
|                                      no warranty implied; use at your own risk | ||||
|  | ||||
|    QUICK NOTES: | ||||
|       Primarily of interest to game developers and other people who can | ||||
|           avoid problematic images and only need the trivial interface | ||||
|  | ||||
|       JPEG baseline (no JPEG progressive) | ||||
|       PNG 8-bit-per-channel only | ||||
|  | ||||
|       TGA (not sure what subset, if a subset) | ||||
|       BMP non-1bpp, non-RLE | ||||
|       PSD (composited view only, no extra channels) | ||||
|  | ||||
|       GIF (*comp always reports as 4-channel) | ||||
|       HDR (radiance rgbE format) | ||||
|       PIC (Softimage PIC) | ||||
|  | ||||
|       - decode from memory or through FILE (define STBI_NO_STDIO to remove code) | ||||
|       - decode from arbitrary I/O callbacks | ||||
|       - overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) | ||||
|  | ||||
|    Latest revisions: | ||||
|       1.33 (2011-07-14) minor fixes suggested by Dave Moore | ||||
|       1.32 (2011-07-13) info support for all filetypes (SpartanJ) | ||||
|       1.31 (2011-06-19) a few more leak fixes, bug in PNG handling (SpartanJ) | ||||
|       1.30 (2011-06-11) added ability to load files via io callbacks (Ben Wenger) | ||||
|       1.29 (2010-08-16) various warning fixes from Aurelien Pocheville  | ||||
|       1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ) | ||||
|       1.27 (2010-08-01) cast-to-uint8 to fix warnings (Laurent Gomila) | ||||
|                         allow trailing 0s at end of image data (Laurent Gomila) | ||||
|       1.26 (2010-07-24) fix bug in file buffering for PNG reported by SpartanJ | ||||
|  | ||||
|    See end of file for full revision history. | ||||
|  | ||||
|    TODO: | ||||
|       stbi_info support for BMP,PSD,HDR,PIC | ||||
|  | ||||
|  | ||||
|  ============================    Contributors    ========================= | ||||
|                | ||||
|  Image formats                                Optimizations & bugfixes | ||||
|     Sean Barrett (jpeg, png, bmp)                Fabian "ryg" Giesen | ||||
|     Nicolas Schulz (hdr, psd)                                                  | ||||
|     Jonathan Dummer (tga)                     Bug fixes & warning fixes            | ||||
|     Jean-Marc Lienher (gif)                      Marc LeBlanc                | ||||
|     Tom Seddon (pic)                             Christpher Lloyd            | ||||
|     Thatcher Ulrich (psd)                        Dave Moore                  | ||||
|                                                  Won Chun                    | ||||
|                                                  the Horde3D community       | ||||
|  Extensions, features                            Janez Zemva                 | ||||
|     Jetro Lauha (stbi_info)                      Jonathan Blow               | ||||
|     James "moose2000" Brown (iPhone PNG)         Laurent Gomila                              | ||||
|     Ben "Disch" Wenger (io callbacks)            Aruelien Pocheville | ||||
|     Martin "SpartanJ" Golini                     Ryamond Barbiero | ||||
|                                                  David Woo | ||||
|                                                   | ||||
|  | ||||
|  If your name should be here but isn't, let Sean know. | ||||
|  | ||||
| */ | ||||
|  | ||||
| #ifndef STBI_INCLUDE_STB_IMAGE_H | ||||
| #define STBI_INCLUDE_STB_IMAGE_H | ||||
|  | ||||
| // To get a header file for this, either cut and paste the header, | ||||
| // or create stb_image.h, #define STBI_HEADER_FILE_ONLY, and | ||||
| // then include stb_image.c from it. | ||||
|  | ||||
| ////   begin header file  //////////////////////////////////////////////////// | ||||
| // | ||||
| // Limitations: | ||||
| //    - no jpeg progressive support | ||||
| //    - non-HDR formats support 8-bit samples only (jpeg, png) | ||||
| //    - no delayed line count (jpeg) -- IJG doesn't support either | ||||
| //    - no 1-bit BMP | ||||
| //    - GIF always returns *comp=4 | ||||
| // | ||||
| // Basic usage (see HDR discussion below): | ||||
| //    int x,y,n; | ||||
| //    unsigned char *data = stbi_load(filename, &x, &y, &n, 0); | ||||
| //    // ... process data if not NULL ...  | ||||
| //    // ... x = width, y = height, n = # 8-bit components per pixel ... | ||||
| //    // ... replace '0' with '1'..'4' to force that many components per pixel | ||||
| //    // ... but 'n' will always be the number that it would have been if you said 0 | ||||
| //    stbi_image_free(data) | ||||
| // | ||||
| // Standard parameters: | ||||
| //    int *x       -- outputs image width in pixels | ||||
| //    int *y       -- outputs image height in pixels | ||||
| //    int *comp    -- outputs # of image components in image file | ||||
| //    int req_comp -- if non-zero, # of image components requested in result | ||||
| // | ||||
| // The return value from an image loader is an 'unsigned char *' which points | ||||
| // to the pixel data. The pixel data consists of *y scanlines of *x pixels, | ||||
| // with each pixel consisting of N interleaved 8-bit components; the first | ||||
| // pixel pointed to is top-left-most in the image. There is no padding between | ||||
| // image scanlines or between pixels, regardless of format. The number of | ||||
| // components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. | ||||
| // If req_comp is non-zero, *comp has the number of components that _would_ | ||||
| // have been output otherwise. E.g. if you set req_comp to 4, you will always | ||||
| // get RGBA output, but you can check *comp to easily see if it's opaque. | ||||
| // | ||||
| // An output image with N components has the following components interleaved | ||||
| // in this order in each pixel: | ||||
| // | ||||
| //     N=#comp     components | ||||
| //       1           grey | ||||
| //       2           grey, alpha | ||||
| //       3           red, green, blue | ||||
| //       4           red, green, blue, alpha | ||||
| // | ||||
| // If image loading fails for any reason, the return value will be NULL, | ||||
| // and *x, *y, *comp will be unchanged. The function stbi_failure_reason() | ||||
| // can be queried for an extremely brief, end-user unfriendly explanation | ||||
| // of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid | ||||
| // compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly | ||||
| // more user-friendly ones. | ||||
| // | ||||
| // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. | ||||
| // | ||||
| // =========================================================================== | ||||
| // | ||||
| // iPhone PNG support: | ||||
| // | ||||
| // By default we convert iphone-formatted PNGs back to RGB; nominally they | ||||
| // would silently load as BGR, except the existing code should have just | ||||
| // failed on such iPhone PNGs. But you can disable this conversion by | ||||
| // by calling stbi_convert_iphone_png_to_rgb(0), in which case | ||||
| // you will always just get the native iphone "format" through. | ||||
| // | ||||
| // Call stbi_set_unpremultiply_on_load(1) as well to force a divide per | ||||
| // pixel to remove any premultiplied alpha *only* if the image file explicitly | ||||
| // says there's premultiplied data (currently only happens in iPhone images, | ||||
| // and only if iPhone convert-to-rgb processing is on). | ||||
| // | ||||
| // =========================================================================== | ||||
| // | ||||
| // HDR image support   (disable by defining STBI_NO_HDR) | ||||
| // | ||||
| // stb_image now supports loading HDR images in general, and currently | ||||
| // the Radiance .HDR file format, although the support is provided | ||||
| // generically. You can still load any file through the existing interface; | ||||
| // if you attempt to load an HDR file, it will be automatically remapped to | ||||
| // LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; | ||||
| // both of these constants can be reconfigured through this interface: | ||||
| // | ||||
| //     stbi_hdr_to_ldr_gamma(2.2f); | ||||
| //     stbi_hdr_to_ldr_scale(1.0f); | ||||
| // | ||||
| // (note, do not use _inverse_ constants; stbi_image will invert them | ||||
| // appropriately). | ||||
| // | ||||
| // Additionally, there is a new, parallel interface for loading files as | ||||
| // (linear) floats to preserve the full dynamic range: | ||||
| // | ||||
| //    float *data = stbi_loadf(filename, &x, &y, &n, 0); | ||||
| //  | ||||
| // If you load LDR images through this interface, those images will | ||||
| // be promoted to floating point values, run through the inverse of | ||||
| // constants corresponding to the above: | ||||
| // | ||||
| //     stbi_ldr_to_hdr_scale(1.0f); | ||||
| //     stbi_ldr_to_hdr_gamma(2.2f); | ||||
| // | ||||
| // Finally, given a filename (or an open file or memory block--see header | ||||
| // file for details) containing image data, you can query for the "most | ||||
| // appropriate" interface to use (that is, whether the image is HDR or | ||||
| // not), using: | ||||
| // | ||||
| //     stbi_is_hdr(char *filename); | ||||
| // | ||||
| // =========================================================================== | ||||
| // | ||||
| // I/O callbacks | ||||
| // | ||||
| // I/O callbacks allow you to read from arbitrary sources, like packaged | ||||
| // files or some other source. Data read from callbacks are processed | ||||
| // through a small internal buffer (currently 128 bytes) to try to reduce | ||||
| // overhead.  | ||||
| // | ||||
| // The three functions you must define are "read" (reads some bytes of data), | ||||
| // "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). | ||||
|  | ||||
|  | ||||
| #define STBI_NO_HDR		// RaySan: not required by raylib | ||||
|  | ||||
| #ifndef STBI_NO_STDIO | ||||
|  | ||||
| #if defined(_MSC_VER) && _MSC_VER >= 0x1400 | ||||
| #define _CRT_SECURE_NO_WARNINGS // suppress bogus warnings about fopen() | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #endif | ||||
|  | ||||
| #define STBI_VERSION 1 | ||||
|  | ||||
| enum | ||||
| { | ||||
|    STBI_default = 0, // only used for req_comp | ||||
|  | ||||
|    STBI_grey       = 1, | ||||
|    STBI_grey_alpha = 2, | ||||
|    STBI_rgb        = 3, | ||||
|    STBI_rgb_alpha  = 4 | ||||
| }; | ||||
|  | ||||
| typedef unsigned char stbi_uc; | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| // | ||||
| // PRIMARY API - works on images of any type | ||||
| // | ||||
|  | ||||
| // | ||||
| // load image by filename, open file, or memory buffer | ||||
| // | ||||
|  | ||||
| extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); | ||||
|  | ||||
| #ifndef STBI_NO_STDIO | ||||
| extern stbi_uc *stbi_load            (char const *filename,     int *x, int *y, int *comp, int req_comp); | ||||
| extern stbi_uc *stbi_load_from_file  (FILE *f,                  int *x, int *y, int *comp, int req_comp); | ||||
| // for stbi_load_from_file, file pointer is left pointing immediately after image | ||||
| #endif | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|    int      (*read)  (void *user,char *data,int size);   // fill 'data' with 'size' bytes.  return number of bytes actually read  | ||||
|    void     (*skip)  (void *user,unsigned n);            // skip the next 'n' bytes | ||||
|    int      (*eof)   (void *user);                       // returns nonzero if we are at end of file/data | ||||
| } stbi_io_callbacks; | ||||
|  | ||||
| extern stbi_uc *stbi_load_from_callbacks  (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); | ||||
|  | ||||
| #ifndef STBI_NO_HDR | ||||
|    extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); | ||||
|  | ||||
|    #ifndef STBI_NO_STDIO | ||||
|    extern float *stbi_loadf            (char const *filename,   int *x, int *y, int *comp, int req_comp); | ||||
|    extern float *stbi_loadf_from_file  (FILE *f,                int *x, int *y, int *comp, int req_comp); | ||||
|    #endif | ||||
|     | ||||
|    extern float *stbi_loadf_from_callbacks  (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); | ||||
|  | ||||
|    extern void   stbi_hdr_to_ldr_gamma(float gamma); | ||||
|    extern void   stbi_hdr_to_ldr_scale(float scale); | ||||
|  | ||||
|    extern void   stbi_ldr_to_hdr_gamma(float gamma); | ||||
|    extern void   stbi_ldr_to_hdr_scale(float scale); | ||||
| #endif // STBI_NO_HDR | ||||
|  | ||||
| // stbi_is_hdr is always defined | ||||
| extern int    stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); | ||||
| extern int    stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); | ||||
| #ifndef STBI_NO_STDIO | ||||
| extern int      stbi_is_hdr          (char const *filename); | ||||
| extern int      stbi_is_hdr_from_file(FILE *f); | ||||
| #endif // STBI_NO_STDIO | ||||
|  | ||||
|  | ||||
| // get a VERY brief reason for failure | ||||
| // NOT THREADSAFE | ||||
| extern const char *stbi_failure_reason  (void);  | ||||
|  | ||||
| // free the loaded image -- this is just free() | ||||
| extern void     stbi_image_free      (void *retval_from_stbi_load); | ||||
|  | ||||
| // get image dimensions & components without fully decoding | ||||
| extern int      stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); | ||||
| extern int      stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); | ||||
|  | ||||
| #ifndef STBI_NO_STDIO | ||||
| extern int      stbi_info            (char const *filename,     int *x, int *y, int *comp); | ||||
| extern int      stbi_info_from_file  (FILE *f,                  int *x, int *y, int *comp); | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
| // for image formats that explicitly notate that they have premultiplied alpha, | ||||
| // we just return the colors as stored in the file. set this flag to force | ||||
| // unpremultiplication. results are undefined if the unpremultiply overflow. | ||||
| extern void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); | ||||
|  | ||||
| // indicate whether we should process iphone images back to canonical format, | ||||
| // or just pass them through "as-is" | ||||
| extern void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); | ||||
|  | ||||
|  | ||||
| // ZLIB client - used by PNG, available for other purposes | ||||
|  | ||||
| extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); | ||||
| extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); | ||||
| extern int   stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); | ||||
|  | ||||
| extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); | ||||
| extern int   stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); | ||||
|  | ||||
|  | ||||
| // define faster low-level operations (typically SIMD support) | ||||
| #ifdef STBI_SIMD | ||||
| typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize); | ||||
| // compute an integer IDCT on "input" | ||||
| //     input[x] = data[x] * dequantize[x] | ||||
| //     write results to 'out': 64 samples, each run of 8 spaced by 'out_stride' | ||||
| //                             CLAMP results to 0..255 | ||||
| typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const  *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step); | ||||
| // compute a conversion from YCbCr to RGB | ||||
| //     'count' pixels | ||||
| //     write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B | ||||
| //     y: Y input channel | ||||
| //     cb: Cb input channel; scale/biased to be 0..255 | ||||
| //     cr: Cr input channel; scale/biased to be 0..255 | ||||
|  | ||||
| extern void stbi_install_idct(stbi_idct_8x8 func); | ||||
| extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); | ||||
| #endif // STBI_SIMD | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| // | ||||
| // | ||||
| ////   end header file   ///////////////////////////////////////////////////// | ||||
| #endif // STBI_INCLUDE_STB_IMAGE_H | ||||
							
								
								
									
										5039
									
								
								src/stb_vorbis.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										352
									
								
								src/stb_vorbis.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,352 @@ | ||||
| // Ogg Vorbis I audio decoder  -- version 0.99996 | ||||
| // | ||||
| // Written in April 2007 by Sean Barrett, sponsored by RAD Game Tools. | ||||
| // | ||||
| // Placed in the public domain April 2007 by the author: no copyright is | ||||
| // claimed, and you may use it for any purpose you like. | ||||
| // | ||||
| // No warranty for any purpose is expressed or implied by the author (nor | ||||
| // by RAD Game Tools). Report bugs and send enhancements to the author. | ||||
| // | ||||
| // Get the latest version and other information at: | ||||
| //     http://nothings.org/stb_vorbis/ | ||||
|  | ||||
| // Todo: | ||||
| // | ||||
| //   - seeking (note you can seek yourself using the pushdata API) | ||||
| // | ||||
| // Limitations: | ||||
| // | ||||
| //   - floor 0 not supported (used in old ogg vorbis files) | ||||
| //   - lossless sample-truncation at beginning ignored | ||||
| //   - cannot concatenate multiple vorbis streams | ||||
| //   - sample positions are 32-bit, limiting seekable 192Khz | ||||
| //       files to around 6 hours (Ogg supports 64-bit) | ||||
| //  | ||||
| // All of these limitations may be removed in future versions. | ||||
|  | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| // | ||||
| //  HEADER BEGINS HERE | ||||
| // | ||||
|  | ||||
| #ifndef STB_VORBIS_INCLUDE_STB_VORBIS_H | ||||
| #define STB_VORBIS_INCLUDE_STB_VORBIS_H | ||||
|  | ||||
| #if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO) | ||||
| #define STB_VORBIS_NO_STDIO 1 | ||||
| #endif | ||||
|  | ||||
| #ifndef STB_VORBIS_NO_STDIO | ||||
| #include <stdio.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| ///////////   THREAD SAFETY | ||||
|  | ||||
| // Individual stb_vorbis* handles are not thread-safe; you cannot decode from | ||||
| // them from multiple threads at the same time. However, you can have multiple | ||||
| // stb_vorbis* handles and decode from them independently in multiple thrads. | ||||
|  | ||||
|  | ||||
| ///////////   MEMORY ALLOCATION | ||||
|  | ||||
| // normally stb_vorbis uses malloc() to allocate memory at startup, | ||||
| // and alloca() to allocate temporary memory during a frame on the | ||||
| // stack. (Memory consumption will depend on the amount of setup | ||||
| // data in the file and how you set the compile flags for speed | ||||
| // vs. size. In my test files the maximal-size usage is ~150KB.) | ||||
| // | ||||
| // You can modify the wrapper functions in the source (setup_malloc, | ||||
| // setup_temp_malloc, temp_malloc) to change this behavior, or you | ||||
| // can use a simpler allocation model: you pass in a buffer from | ||||
| // which stb_vorbis will allocate _all_ its memory (including the | ||||
| // temp memory). "open" may fail with a VORBIS_outofmem if you | ||||
| // do not pass in enough data; there is no way to determine how | ||||
| // much you do need except to succeed (at which point you can | ||||
| // query get_info to find the exact amount required. yes I know | ||||
| // this is lame). | ||||
| // | ||||
| // If you pass in a non-NULL buffer of the type below, allocation | ||||
| // will occur from it as described above. Otherwise just pass NULL | ||||
| // to use malloc()/alloca() | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|    char *alloc_buffer; | ||||
|    int   alloc_buffer_length_in_bytes; | ||||
| } stb_vorbis_alloc; | ||||
|  | ||||
|  | ||||
| ///////////   FUNCTIONS USEABLE WITH ALL INPUT MODES | ||||
|  | ||||
| typedef struct stb_vorbis stb_vorbis; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|    unsigned int sample_rate; | ||||
|    int channels; | ||||
|  | ||||
|    unsigned int setup_memory_required; | ||||
|    unsigned int setup_temp_memory_required; | ||||
|    unsigned int temp_memory_required; | ||||
|  | ||||
|    int max_frame_size; | ||||
| } stb_vorbis_info; | ||||
|  | ||||
| // get general information about the file | ||||
| extern stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f); | ||||
|  | ||||
| // get the last error detected (clears it, too) | ||||
| extern int stb_vorbis_get_error(stb_vorbis *f); | ||||
|  | ||||
| // close an ogg vorbis file and free all memory in use | ||||
| extern void stb_vorbis_close(stb_vorbis *f); | ||||
|  | ||||
| // this function returns the offset (in samples) from the beginning of the | ||||
| // file that will be returned by the next decode, if it is known, or -1 | ||||
| // otherwise. after a flush_pushdata() call, this may take a while before | ||||
| // it becomes valid again. | ||||
| // NOT WORKING YET after a seek with PULLDATA API | ||||
| extern int stb_vorbis_get_sample_offset(stb_vorbis *f); | ||||
|  | ||||
| // returns the current seek point within the file, or offset from the beginning | ||||
| // of the memory buffer. In pushdata mode it returns 0. | ||||
| extern unsigned int stb_vorbis_get_file_offset(stb_vorbis *f); | ||||
|  | ||||
| ///////////   PUSHDATA API | ||||
|  | ||||
| #ifndef STB_VORBIS_NO_PUSHDATA_API | ||||
|  | ||||
| // this API allows you to get blocks of data from any source and hand | ||||
| // them to stb_vorbis. you have to buffer them; stb_vorbis will tell | ||||
| // you how much it used, and you have to give it the rest next time; | ||||
| // and stb_vorbis may not have enough data to work with and you will | ||||
| // need to give it the same data again PLUS more. Note that the Vorbis | ||||
| // specification does not bound the size of an individual frame. | ||||
|  | ||||
| extern stb_vorbis *stb_vorbis_open_pushdata( | ||||
|          unsigned char *datablock, int datablock_length_in_bytes, | ||||
|          int *datablock_memory_consumed_in_bytes, | ||||
|          int *error, | ||||
|          stb_vorbis_alloc *alloc_buffer); | ||||
| // create a vorbis decoder by passing in the initial data block containing | ||||
| //    the ogg&vorbis headers (you don't need to do parse them, just provide | ||||
| //    the first N bytes of the file--you're told if it's not enough, see below) | ||||
| // on success, returns an stb_vorbis *, does not set error, returns the amount of | ||||
| //    data parsed/consumed on this call in *datablock_memory_consumed_in_bytes; | ||||
| // on failure, returns NULL on error and sets *error, does not change *datablock_memory_consumed | ||||
| // if returns NULL and *error is VORBIS_need_more_data, then the input block was | ||||
| //       incomplete and you need to pass in a larger block from the start of the file | ||||
|  | ||||
| extern int stb_vorbis_decode_frame_pushdata( | ||||
|          stb_vorbis *f, unsigned char *datablock, int datablock_length_in_bytes, | ||||
|          int *channels,             // place to write number of float * buffers | ||||
|          float ***output,           // place to write float ** array of float * buffers | ||||
|          int *samples               // place to write number of output samples | ||||
|      ); | ||||
| // decode a frame of audio sample data if possible from the passed-in data block | ||||
| // | ||||
| // return value: number of bytes we used from datablock | ||||
| // possible cases: | ||||
| //     0 bytes used, 0 samples output (need more data) | ||||
| //     N bytes used, 0 samples output (resynching the stream, keep going) | ||||
| //     N bytes used, M samples output (one frame of data) | ||||
| // note that after opening a file, you will ALWAYS get one N-bytes,0-sample | ||||
| // frame, because Vorbis always "discards" the first frame. | ||||
| // | ||||
| // Note that on resynch, stb_vorbis will rarely consume all of the buffer, | ||||
| // instead only datablock_length_in_bytes-3 or less. This is because it wants | ||||
| // to avoid missing parts of a page header if they cross a datablock boundary, | ||||
| // without writing state-machiney code to record a partial detection. | ||||
| // | ||||
| // The number of channels returned are stored in *channels (which can be | ||||
| // NULL--it is always the same as the number of channels reported by | ||||
| // get_info). *output will contain an array of float* buffers, one per | ||||
| // channel. In other words, (*output)[0][0] contains the first sample from | ||||
| // the first channel, and (*output)[1][0] contains the first sample from | ||||
| // the second channel. | ||||
|  | ||||
| extern void stb_vorbis_flush_pushdata(stb_vorbis *f); | ||||
| // inform stb_vorbis that your next datablock will not be contiguous with | ||||
| // previous ones (e.g. you've seeked in the data); future attempts to decode | ||||
| // frames will cause stb_vorbis to resynchronize (as noted above), and | ||||
| // once it sees a valid Ogg page (typically 4-8KB, as large as 64KB), it | ||||
| // will begin decoding the _next_ frame. | ||||
| // | ||||
| // if you want to seek using pushdata, you need to seek in your file, then | ||||
| // call stb_vorbis_flush_pushdata(), then start calling decoding, then once | ||||
| // decoding is returning you data, call stb_vorbis_get_sample_offset, and | ||||
| // if you don't like the result, seek your file again and repeat. | ||||
| #endif | ||||
|  | ||||
|  | ||||
| //////////   PULLING INPUT API | ||||
|  | ||||
| #ifndef STB_VORBIS_NO_PULLDATA_API | ||||
| // This API assumes stb_vorbis is allowed to pull data from a source-- | ||||
| // either a block of memory containing the _entire_ vorbis stream, or a | ||||
| // FILE * that you or it create, or possibly some other reading mechanism | ||||
| // if you go modify the source to replace the FILE * case with some kind | ||||
| // of callback to your code. (But if you don't support seeking, you may | ||||
| // just want to go ahead and use pushdata.) | ||||
|  | ||||
| #if !defined(STB_VORBIS_NO_STDIO) && !defined(STB_VORBIS_NO_INTEGER_CONVERSION) | ||||
| extern int stb_vorbis_decode_filename(char *filename, int *channels, short **output); | ||||
| #endif | ||||
| extern int stb_vorbis_decode_memory(unsigned char *mem, int len, int *channels, short **output); | ||||
| // decode an entire file and output the data interleaved into a malloc()ed | ||||
| // buffer stored in *output. The return value is the number of samples | ||||
| // decoded, or -1 if the file could not be opened or was not an ogg vorbis file. | ||||
| // When you're done with it, just free() the pointer returned in *output. | ||||
|  | ||||
| extern stb_vorbis * stb_vorbis_open_memory(unsigned char *data, int len, | ||||
|                                   int *error, stb_vorbis_alloc *alloc_buffer); | ||||
| // create an ogg vorbis decoder from an ogg vorbis stream in memory (note | ||||
| // this must be the entire stream!). on failure, returns NULL and sets *error | ||||
|  | ||||
| #ifndef STB_VORBIS_NO_STDIO | ||||
| extern stb_vorbis * stb_vorbis_open_filename(char *filename, | ||||
|                                   int *error, stb_vorbis_alloc *alloc_buffer); | ||||
| // create an ogg vorbis decoder from a filename via fopen(). on failure, | ||||
| // returns NULL and sets *error (possibly to VORBIS_file_open_failure). | ||||
|  | ||||
| extern stb_vorbis * stb_vorbis_open_file(FILE *f, int close_handle_on_close, | ||||
|                                   int *error, stb_vorbis_alloc *alloc_buffer); | ||||
| // create an ogg vorbis decoder from an open FILE *, looking for a stream at | ||||
| // the _current_ seek point (ftell). on failure, returns NULL and sets *error. | ||||
| // note that stb_vorbis must "own" this stream; if you seek it in between | ||||
| // calls to stb_vorbis, it will become confused. Morever, if you attempt to | ||||
| // perform stb_vorbis_seek_*() operations on this file, it will assume it | ||||
| // owns the _entire_ rest of the file after the start point. Use the next | ||||
| // function, stb_vorbis_open_file_section(), to limit it. | ||||
|  | ||||
| extern stb_vorbis * stb_vorbis_open_file_section(FILE *f, int close_handle_on_close, | ||||
|                 int *error, stb_vorbis_alloc *alloc_buffer, unsigned int len); | ||||
| // create an ogg vorbis decoder from an open FILE *, looking for a stream at | ||||
| // the _current_ seek point (ftell); the stream will be of length 'len' bytes. | ||||
| // on failure, returns NULL and sets *error. note that stb_vorbis must "own" | ||||
| // this stream; if you seek it in between calls to stb_vorbis, it will become | ||||
| // confused. | ||||
| #endif | ||||
|  | ||||
| extern int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number); | ||||
| extern int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number); | ||||
| // NOT WORKING YET | ||||
| // these functions seek in the Vorbis file to (approximately) 'sample_number'. | ||||
| // after calling seek_frame(), the next call to get_frame_*() will include | ||||
| // the specified sample. after calling stb_vorbis_seek(), the next call to | ||||
| // stb_vorbis_get_samples_* will start with the specified sample. If you | ||||
| // do not need to seek to EXACTLY the target sample when using get_samples_*, | ||||
| // you can also use seek_frame(). | ||||
|  | ||||
| extern void stb_vorbis_seek_start(stb_vorbis *f); | ||||
| // this function is equivalent to stb_vorbis_seek(f,0), but it | ||||
| // actually works | ||||
|  | ||||
| extern unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f); | ||||
| extern float        stb_vorbis_stream_length_in_seconds(stb_vorbis *f); | ||||
| // these functions return the total length of the vorbis stream | ||||
|  | ||||
| extern int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output); | ||||
| // decode the next frame and return the number of samples. the number of | ||||
| // channels returned are stored in *channels (which can be NULL--it is always | ||||
| // the same as the number of channels reported by get_info). *output will | ||||
| // contain an array of float* buffers, one per channel. These outputs will | ||||
| // be overwritten on the next call to stb_vorbis_get_frame_*. | ||||
| // | ||||
| // You generally should not intermix calls to stb_vorbis_get_frame_*() | ||||
| // and stb_vorbis_get_samples_*(), since the latter calls the former. | ||||
|  | ||||
| #ifndef STB_VORBIS_NO_INTEGER_CONVERSION | ||||
| extern int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts); | ||||
| extern int stb_vorbis_get_frame_short            (stb_vorbis *f, int num_c, short **buffer, int num_samples); | ||||
| #endif | ||||
| // decode the next frame and return the number of samples per channel. the | ||||
| // data is coerced to the number of channels you request according to the | ||||
| // channel coercion rules (see below). You must pass in the size of your | ||||
| // buffer(s) so that stb_vorbis will not overwrite the end of the buffer. | ||||
| // The maximum buffer size needed can be gotten from get_info(); however, | ||||
| // the Vorbis I specification implies an absolute maximum of 4096 samples | ||||
| // per channel. Note that for interleaved data, you pass in the number of | ||||
| // shorts (the size of your array), but the return value is the number of | ||||
| // samples per channel, not the total number of samples. | ||||
|  | ||||
| // Channel coercion rules: | ||||
| //    Let M be the number of channels requested, and N the number of channels present, | ||||
| //    and Cn be the nth channel; let stereo L be the sum of all L and center channels, | ||||
| //    and stereo R be the sum of all R and center channels (channel assignment from the | ||||
| //    vorbis spec). | ||||
| //        M    N       output | ||||
| //        1    k      sum(Ck) for all k | ||||
| //        2    *      stereo L, stereo R | ||||
| //        k    l      k > l, the first l channels, then 0s | ||||
| //        k    l      k <= l, the first k channels | ||||
| //    Note that this is not _good_ surround etc. mixing at all! It's just so | ||||
| //    you get something useful. | ||||
|  | ||||
| extern int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats); | ||||
| extern int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples); | ||||
| // gets num_samples samples, not necessarily on a frame boundary--this requires | ||||
| // buffering so you have to supply the buffers. DOES NOT APPLY THE COERCION RULES. | ||||
| // Returns the number of samples stored per channel; it may be less than requested | ||||
| // at the end of the file. If there are no more samples in the file, returns 0. | ||||
|  | ||||
| #ifndef STB_VORBIS_NO_INTEGER_CONVERSION | ||||
| extern int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts); | ||||
| extern int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int num_samples); | ||||
| #endif | ||||
| // gets num_samples samples, not necessarily on a frame boundary--this requires | ||||
| // buffering so you have to supply the buffers. Applies the coercion rules above | ||||
| // to produce 'channels' channels. Returns the number of samples stored per channel; | ||||
| // it may be less than requested at the end of the file. If there are no more | ||||
| // samples in the file, returns 0. | ||||
|  | ||||
| #endif | ||||
|  | ||||
| ////////   ERROR CODES | ||||
|  | ||||
| enum STBVorbisError | ||||
| { | ||||
|    VORBIS__no_error, | ||||
|  | ||||
|    VORBIS_need_more_data=1,             // not a real error | ||||
|  | ||||
|    VORBIS_invalid_api_mixing,           // can't mix API modes | ||||
|    VORBIS_outofmem,                     // not enough memory | ||||
|    VORBIS_feature_not_supported,        // uses floor 0 | ||||
|    VORBIS_too_many_channels,            // STB_VORBIS_MAX_CHANNELS is too small | ||||
|    VORBIS_file_open_failure,            // fopen() failed | ||||
|    VORBIS_seek_without_length,          // can't seek in unknown-length file | ||||
|  | ||||
|    VORBIS_unexpected_eof=10,            // file is truncated? | ||||
|    VORBIS_seek_invalid,                 // seek past EOF | ||||
|  | ||||
|    // decoding errors (corrupt/invalid stream) -- you probably | ||||
|    // don't care about the exact details of these | ||||
|  | ||||
|    // vorbis errors: | ||||
|    VORBIS_invalid_setup=20, | ||||
|    VORBIS_invalid_stream, | ||||
|  | ||||
|    // ogg errors: | ||||
|    VORBIS_missing_capture_pattern=30, | ||||
|    VORBIS_invalid_stream_structure_version, | ||||
|    VORBIS_continued_packet_flag_invalid, | ||||
|    VORBIS_incorrect_stream_serial_number, | ||||
|    VORBIS_invalid_first_page, | ||||
|    VORBIS_bad_packet_type, | ||||
|    VORBIS_cant_find_last_page, | ||||
|    VORBIS_seek_failed, | ||||
| }; | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif // STB_VORBIS_INCLUDE_STB_VORBIS_H | ||||
							
								
								
									
										515
									
								
								src/text.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,515 @@ | ||||
| /********************************************************************************************* | ||||
| * | ||||
| *	raylib.text | ||||
| * | ||||
| *	Basic functions to load SpriteFonts and draw Text | ||||
| *	 | ||||
| *	Uses external lib: | ||||
| *		stb_image - Multiple formats image loading (JPEG, PNG, BMP, TGA, PSD, GIF, HDR, PIC) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| *	 | ||||
| *	This software is provided "as-is", without any express or implied warranty. In no event  | ||||
| *	will the authors be held liable for any damages arising from the use of this software. | ||||
| * | ||||
| *	Permission is granted to anyone to use this software for any purpose, including commercial  | ||||
| *	applications, and to alter it and redistribute it freely, subject to the following restrictions: | ||||
| * | ||||
| *	  1. The origin of this software must not be misrepresented; you must not claim that you  | ||||
| *	  wrote the original software. If you use this software in a product, an acknowledgment  | ||||
| *	  in the product documentation would be appreciated but is not required. | ||||
| * | ||||
| *	  2. Altered source versions must be plainly marked as such, and must not be misrepresented | ||||
| *	  as being the original software. | ||||
| * | ||||
| *	  3. This notice may not be removed or altered from any source distribution. | ||||
| * | ||||
| **********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| #include <GL/gl.h>			// OpenGL functions | ||||
| #include <stdlib.h>			// Declares malloc() and free() for memory management | ||||
| #include <string.h>			// String management functions (just strlen() is used) | ||||
| #include <stdarg.h>			// Used for functions with variable number of parameters (FormatText()) | ||||
| #include "stb_image.h"		// Used to read image data (multiple formats support) | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Defines and Macros | ||||
| //---------------------------------------------------------------------------------- | ||||
| #define FIRST_CHAR 		32 | ||||
| #define MAX_FONTCHARS  128 | ||||
|  | ||||
| #define BIT_CHECK(a,b) ((a) & (1<<(b))) | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| typedef unsigned char byte; | ||||
|  | ||||
| // SpriteFont one Character (Glyph) data | ||||
| struct Character { | ||||
| 	int value;		//char value = ' '; (int)value = 32; | ||||
| 	int x; | ||||
| 	int y; | ||||
| 	int w; | ||||
| 	int h; | ||||
| }; | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Global variables | ||||
| //---------------------------------------------------------------------------------- | ||||
| static SpriteFont defaultFont;				// Default font provided by raylib | ||||
| 											// NOTE: defaultFont is loaded on InitWindow and disposed on CloseWindow [module: core] | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Declaration | ||||
| //---------------------------------------------------------------------------------- | ||||
| static bool PixelIsMagenta(Color p);		// Check if a pixel is magenta | ||||
| static int ParseImageData(Color *imgDataPixel, int imgWidth, int imgHeight, Character **charSet);	// Parse image pixel data to obtain character set measures | ||||
| static int GetNextPOT(int num);				// Calculate next power-of-two value for a given value | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module Functions Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| extern void LoadDefaultFont()  | ||||
| { | ||||
| 	defaultFont.numChars = 96;				// We know our default font has 94 chars | ||||
| 	defaultFont.texture.width = 128;		// We know our default font texture is 128 pixels width | ||||
| 	defaultFont.texture.height = 64;		// We know our default font texture is 64 pixels height | ||||
| 	 | ||||
| 	// Default font is directly defined here (data generated from a sprite font image) | ||||
| 	// This way, we reconstruct SpriteFont without creating large global variables | ||||
| 	// This data is automatically allocated to Stack and automatically deallocated at the end of this function | ||||
| 	int defaultFontData[256] = { | ||||
| 		0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200020, 0x0001b000, 0x00000000, 0x00000000, 0x8ef92520, 0x00020a00, 0x7dbe8000, 0x1f7df45f, | ||||
| 		0x4a2bf2a0, 0x0852091e, 0x41224000, 0x10041450, 0x2e292020, 0x08220812, 0x41222000, 0x10041450, 0x10f92020, 0x3efa084c, 0x7d22103c, 0x107df7de, | ||||
| 		0xe8a12020, 0x08220832, 0x05220800, 0x10450410, 0xa4a3f000, 0x08520832, 0x05220400, 0x10450410, 0xe2f92020, 0x0002085e, 0x7d3e0281, 0x107df41f, | ||||
| 		0x00200000, 0x8001b000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, | ||||
| 		0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xc0000fbe, 0xfbf7e00f, 0x5fbf7e7d, 0x0050bee8, 0x440808a2, 0x0a142fe8, 0x50810285, 0x0050a048, | ||||
| 		0x49e428a2, 0x0a142828, 0x40810284, 0x0048a048, 0x10020fbe, 0x09f7ebaf, 0xd89f3e84, 0x0047a04f, 0x09e48822, 0x0a142aa1, 0x50810284, 0x0048a048, | ||||
| 		0x04082822, 0x0a142fa0, 0x50810285, 0x0050a248, 0x00008fbe, 0xfbf42021, 0x5f817e7d, 0x07d09ce8, 0x00008000, 0x00000fe0, 0x00000000, 0x00000000, | ||||
| 		0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000c0180, | ||||
| 		0xdfbf4282, 0x0bfbf7ef, 0x42850505, 0x004804bf, 0x50a142c6, 0x08401428, 0x42852505, 0x00a808a0, 0x50a146aa, 0x08401428, 0x42852505, 0x00081090, | ||||
| 		0x5fa14a92, 0x0843f7e8, 0x7e792505, 0x00082088, 0x40a15282, 0x08420128, 0x40852489, 0x00084084, 0x40a16282, 0x0842022a, 0x40852451, 0x00088082, | ||||
| 		0xc0bf4282, 0xf843f42f, 0x7e85fc21, 0x3e0900bf, 0x00000000, 0x00000004, 0x00000000, 0x000c0180, 0x00000000, 0x00000000, 0x00000000, 0x00000000, | ||||
| 		0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000402, 0x41482000, 0x00000000, 0x00000800, | ||||
| 		0x04000404, 0x4100203c, 0x00000000, 0x00000800, 0xf7df7df0, 0x514bef85, 0xbefbefbe, 0x04513bef, 0x14414500, 0x494a2885, 0xa28a28aa, 0x04510820, | ||||
| 		0xf44145f0, 0x474a289d, 0xa28a28aa, 0x04510be0, 0x14414510, 0x494a2884, 0xa28a28aa, 0x02910a00, 0xf7df7df0, 0xd14a2f85, 0xbefbe8aa, 0x011f7be0, | ||||
| 		0x00000000, 0x00400804, 0x20080000, 0x00000000, 0x00000000, 0x00600f84, 0x20080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, | ||||
| 		0xac000000, 0x00000f01, 0x00000000, 0x00000000, 0x24000000, 0x00000901, 0x00000000, 0x00000000, 0x24000000, 0x00000901, 0x00000000, 0x00000000, | ||||
| 		0x24fa28a2, 0x00000901, 0x00000000, 0x00000000, 0x2242252a, 0x00000952, 0x00000000, 0x00000000, 0x2422222a, 0x00000929, 0x00000000, 0x00000000, | ||||
| 		0x2412252a, 0x00000901, 0x00000000, 0x00000000, 0x24fbe8be, 0x00000901, 0x00000000, 0x00000000, 0xac020000, 0x00000f01, 0x00000000, 0x00000000, | ||||
| 		0x0003e000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, | ||||
| 		0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, | ||||
| 		0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, | ||||
| 		0x00000000, 0x00000000, 0x00000000, 0x00000000 }; | ||||
|  | ||||
| 	int charsHeight = 10; | ||||
| 	int charsDivisor = 1;	// Every char is separated from the consecutive by a 1 pixel divisor, horizontally and vertically | ||||
| 	 | ||||
| 	int charsWidth[96] = { 3, 1, 4, 6, 5, 7, 6, 2, 3, 3, 5, 5, 2, 4, 1, 7, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 3, 4, 3, 6, | ||||
| 						   7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 5, 6, 5, 7, 6, 6, 6, 6, 6, 6, 7, 6, 7, 7, 6, 6, 6, 2, 7, 2, 3, 5,  | ||||
| 						   2, 5, 5, 5, 5, 5, 4, 5, 5, 1, 2, 5, 2, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 3, 1, 3, 4, 4 }; | ||||
|  | ||||
|  | ||||
| 	// Reconstruct charSet using charsWidth[], charsHeight, charsDivisor, numChars | ||||
| 	//------------------------------------------------------------------------------ | ||||
| 	defaultFont.charSet = (Character *)malloc(defaultFont.numChars * sizeof(Character)); 	// Allocate space for our character data | ||||
| 																							// This memory should be freed at end! --> Done on CloseWindow() | ||||
| 	int currentLine = 0; | ||||
| 	int currentPosX = charsDivisor; | ||||
| 	int testPosX = charsDivisor; | ||||
| 	 | ||||
| 	for (int i = 0; i < defaultFont.numChars; i++) | ||||
| 	{ | ||||
| 		defaultFont.charSet[i].value = FIRST_CHAR + i; | ||||
| 		defaultFont.charSet[i].x = currentPosX; | ||||
| 		defaultFont.charSet[i].y = charsDivisor + currentLine * (charsHeight + charsDivisor); | ||||
| 		defaultFont.charSet[i].w = charsWidth[i]; | ||||
| 		defaultFont.charSet[i].h = charsHeight; | ||||
| 		 | ||||
| 		testPosX += (defaultFont.charSet[i].w + charsDivisor); | ||||
| 		 | ||||
| 		if (testPosX >= defaultFont.texture.width) | ||||
| 		{ | ||||
| 			currentLine++; | ||||
| 			currentPosX = 2 * charsDivisor + charsWidth[i]; | ||||
| 			testPosX = currentPosX; | ||||
| 			 | ||||
| 			defaultFont.charSet[i].x = charsDivisor; | ||||
| 			defaultFont.charSet[i].y = charsDivisor + currentLine * (charsHeight + charsDivisor); | ||||
| 		} | ||||
| 		else currentPosX = testPosX; | ||||
| 	} | ||||
| 	 | ||||
| 	// Re-construct image from defaultFontData and generate OpenGL texture | ||||
| 	//---------------------------------------------------------------------- | ||||
| 	Color *imgDataPixel = (Color *)malloc(defaultFont.texture.width * defaultFont.texture.height * sizeof(Color)); | ||||
| 	 | ||||
| 	for (int i = 0; i < defaultFont.texture.width * defaultFont.texture.height; i++) imgDataPixel[i] = BLANK;		// Initialize array | ||||
|  | ||||
| 	int counter = 0;		// Font data elements counter | ||||
| 	 | ||||
| 	// Fill imgData with defaultFontData (convert from bit to pixel!) | ||||
| 	for (int i = 0; i < defaultFont.texture.width * defaultFont.texture.height; i += 32) | ||||
| 	{ | ||||
| 		for (int j = 31; j >= 0; j--) | ||||
| 		{ | ||||
| 			if (BIT_CHECK(defaultFontData[counter], j)) imgDataPixel[i+j] = WHITE; | ||||
| 		} | ||||
| 		 | ||||
| 		counter++; | ||||
| 		 | ||||
| 		if (counter > 256) counter = 0;		// Security check... | ||||
| 	} | ||||
| 	 | ||||
| 	// Convert loaded data to OpenGL texture | ||||
| 	//---------------------------------------- | ||||
| 	GLuint id; | ||||
| 	glGenTextures(1, &id);					// Generate pointer to the texture | ||||
| 	 | ||||
| 	glBindTexture(GL_TEXTURE_2D, id); | ||||
| 	 | ||||
| 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);			// Set texture to clamp on x-axis | ||||
| 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);			// Set texture to clamp on y-axis | ||||
| 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  	// Filter for pixel-perfect drawing, alternative: GL_LINEAR  | ||||
| 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  	// Filter for pixel-perfect drawing, alternative: GL_LINEAR  | ||||
| 	 | ||||
| 	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, defaultFont.texture.width, defaultFont.texture.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgDataPixel); | ||||
| 	 | ||||
| 	// NOTE: Not using mipmappings (texture for 2D drawing) | ||||
| 	// At this point we have the image converted to texture and uploaded to GPU | ||||
| 	 | ||||
| 	free(imgDataPixel);					// Now we can free loaded data from RAM memory | ||||
| 	 | ||||
| 	defaultFont.texture.glId = id; | ||||
| } | ||||
|  | ||||
| extern void UnloadDefaultFont() | ||||
| { | ||||
| 	glDeleteTextures(1, &defaultFont.texture.glId); | ||||
| 	free(defaultFont.charSet); | ||||
| } | ||||
|  | ||||
| // Load a SpriteFont image into GPU memory | ||||
| SpriteFont LoadSpriteFont(const char* fileName)       | ||||
| { | ||||
| 	SpriteFont spriteFont; | ||||
| 	 | ||||
| 	// Use stb_image to load image data! | ||||
| 	int imgWidth; | ||||
| 	int imgHeight; | ||||
| 	int imgBpp; | ||||
| 	 | ||||
| 	byte *imgData = stbi_load(fileName, &imgWidth, &imgHeight, &imgBpp, 4);	// Force loading to 4 components (RGBA) | ||||
| 	 | ||||
| 	// Convert array to pixel array for working convenience | ||||
| 	Color *imgDataPixel = (Color *)malloc(imgWidth * imgHeight * sizeof(Color)); | ||||
| 	Color *imgDataPixelPOT = NULL; | ||||
| 	 | ||||
|     int pix = 0; | ||||
| 	 | ||||
| 	for (int i = 0; i < (imgWidth * imgHeight * 4); i += 4) | ||||
| 	{ | ||||
| 		imgDataPixel[pix].r = imgData[i]; | ||||
| 		imgDataPixel[pix].g = imgData[i+1]; | ||||
| 		imgDataPixel[pix].b = imgData[i+2]; | ||||
| 		imgDataPixel[pix].a = imgData[i+3]; | ||||
| 		pix++; | ||||
| 	} | ||||
| 	 | ||||
| 	stbi_image_free(imgData); | ||||
| 	 | ||||
| 	// At this point we have a pixel array with all the data... | ||||
| 	 | ||||
| 	// Process bitmap Font pixel data to get measures (Character array) | ||||
| 	// spriteFont.charSet data is filled inside the function and memory is allocated! | ||||
| 	int numChars = ParseImageData(imgDataPixel, imgWidth, imgHeight, &spriteFont.charSet); | ||||
| 	 | ||||
| 	spriteFont.numChars = numChars; | ||||
| 	 | ||||
| 	// Convert image font to POT image before conversion to texture | ||||
| 	// Just add the required amount of pixels at the right and bottom sides of image... | ||||
|     int potWidth = GetNextPOT(imgWidth); | ||||
|     int potHeight = GetNextPOT(imgHeight); | ||||
| 	 | ||||
| 	// Check if POT texture generation is required (if texture is not already POT) | ||||
| 	if ((potWidth != imgWidth) || (potHeight != imgWidth)) | ||||
| 	{ | ||||
| 		// Generate POT array from NPOT data | ||||
| 		imgDataPixelPOT = (Color *)malloc(potWidth * potHeight * sizeof(Color)); | ||||
| 		 | ||||
| 		for (int j = 0; j < potHeight; j++) | ||||
| 		{ | ||||
| 			for (int i = 0; i < potWidth; i++) | ||||
| 			{ | ||||
| 				if ((j < imgHeight) && (i < imgWidth)) imgDataPixelPOT[j*potWidth + i] = imgDataPixel[j*imgWidth + i]; | ||||
| 				else imgDataPixelPOT[j*potWidth + i] = MAGENTA; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	free(imgDataPixel); | ||||
|  | ||||
| 	// Convert loaded data to OpenGL texture | ||||
| 	//---------------------------------------- | ||||
| 	GLuint id; | ||||
| 	glGenTextures(1, &id);					// Generate pointer to the texture | ||||
| 	 | ||||
| 	glBindTexture(GL_TEXTURE_2D, id); | ||||
| 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  		// Filter for pixel-perfect drawing, alternative: GL_LINEAR  | ||||
| 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  		// Filter for pixel-perfect drawing, alternative: GL_LINEAR  | ||||
| 	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, potWidth, potHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgDataPixelPOT); | ||||
| 	 | ||||
| 	// NOTE: Not using mipmappings (texture for 2D drawing) | ||||
| 	// At this point we have the image converted to texture and uploaded to GPU | ||||
| 	 | ||||
| 	free(imgDataPixelPOT);					// Now we can free loaded data from RAM memory | ||||
| 	 | ||||
| 	spriteFont.texture.glId = id; | ||||
| 	spriteFont.texture.width = potWidth; | ||||
| 	spriteFont.texture.height = potHeight; | ||||
|  | ||||
|     return spriteFont; | ||||
| } | ||||
|  | ||||
| // Unload SpriteFont from GPU memory | ||||
| void UnloadSpriteFont(SpriteFont spriteFont) | ||||
| { | ||||
| 	glDeleteTextures(1, &spriteFont.texture.glId); | ||||
| 	free(spriteFont.charSet); | ||||
| } | ||||
|  | ||||
| // Draw text (using default font) | ||||
| // NOTE: fontSize work like in any drawing program but if fontSize is lower than font-base-size, then font-base-size is used | ||||
| void DrawText(const char* text, int posX, int posY, int fontSize, int spacing, Color color) | ||||
| { | ||||
| 	Vector2 position = { (float)posX, (float)posY }; | ||||
| 	 | ||||
| 	DrawTextEx(defaultFont, text, position, fontSize, spacing, color); | ||||
| } | ||||
|  | ||||
| // Formatting of text with variables to 'embed' | ||||
| const char *FormatText(const char *text, ...) | ||||
| { | ||||
| 	int length = strlen(text); | ||||
| 	char *buffer = malloc(length + 20);		// We add 20 extra characters, should be enough... :P | ||||
|  | ||||
| 	va_list args; | ||||
| 	va_start(args, text); | ||||
| 	vsprintf(buffer, text, args);		// NOTE: We use vsprintf() defined in <stdarg.h> | ||||
| 	va_end(args); | ||||
| 	 | ||||
| 	//strcat(buffer, "\0");		// We add a end-of-string mark at the end (not needed) | ||||
| 	 | ||||
| 	return buffer; | ||||
| } | ||||
|  | ||||
| // Draw text using SpriteFont | ||||
| // NOTE: If font size is lower than base size, base size is used | ||||
| void DrawTextEx(SpriteFont spriteFont, const char* text, Vector2 position, int fontSize, int spacing, Color tint) | ||||
| { | ||||
| 	int length = strlen(text); | ||||
| 	int positionX = (int)position.x; | ||||
| 	float scaleFactor; | ||||
| 	 | ||||
| 	Character c; | ||||
| 	 | ||||
| 	if (fontSize <= spriteFont.charSet[0].h) scaleFactor = 1.0f; | ||||
| 	else scaleFactor = (float)fontSize / spriteFont.charSet[0].h; | ||||
|  | ||||
| 	glDisable(GL_LIGHTING);		// When drawing text, disable LIGHTING | ||||
| 	glEnable(GL_TEXTURE_2D); | ||||
|  | ||||
| 	glBindTexture(GL_TEXTURE_2D, spriteFont.texture.glId); | ||||
|  | ||||
| 	glPushMatrix(); | ||||
| 	 | ||||
| 		// Optimized to use one draw call per string | ||||
| 		glBegin(GL_QUADS); | ||||
| 			for(int i = 0; i < length; i++) | ||||
| 			{ | ||||
| 				c = spriteFont.charSet[(int)text[i] - FIRST_CHAR]; | ||||
| 				 | ||||
| 				glColor4ub(tint.r, tint.g, tint.b, tint.a); | ||||
| 				glNormal3f(0.0f, 0.0f, 1.0f);                  // Normal Pointing Towards Viewer | ||||
| 				glTexCoord2f((float)c.x / spriteFont.texture.width, (float)c.y / spriteFont.texture.height); 					glVertex2f(positionX, position.y); | ||||
| 				glTexCoord2f((float)c.x / spriteFont.texture.width, (float)(c.y + c.h) / spriteFont.texture.height); 			glVertex2f(positionX, position.y + (c.h) * scaleFactor); | ||||
| 				glTexCoord2f((float)(c.x + c.w) / spriteFont.texture.width, (float)(c.y + c.h) / spriteFont.texture.height); 	glVertex2f(positionX + (c.w) * scaleFactor, position.y + (c.h) * scaleFactor); | ||||
| 				glTexCoord2f((float)(c.x + c.w) / spriteFont.texture.width, (float)c.y / spriteFont.texture.height); 			glVertex2f(positionX + (c.w) * scaleFactor, position.y); | ||||
| 				 | ||||
| 				positionX += (spriteFont.charSet[(int)text[i] - FIRST_CHAR].w + spacing) * scaleFactor; | ||||
| 			} | ||||
| 		glEnd(); | ||||
| 		 | ||||
| 	glPopMatrix(); | ||||
| 		 | ||||
| 	glDisable(GL_TEXTURE_2D); | ||||
| } | ||||
|  | ||||
| // Measure string width for default font | ||||
| int MeasureText(const char *text, int fontSize, int spacing) | ||||
| { | ||||
| 	Vector2 vec; | ||||
|  | ||||
| 	vec = MeasureTextEx(defaultFont, text, fontSize, spacing); | ||||
|  | ||||
| 	return (int)vec.x; | ||||
| } | ||||
|  | ||||
|  | ||||
| // Measure string size for SpriteFont | ||||
| Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, int fontSize, int spacing) | ||||
| { | ||||
| 	int len = strlen(text); | ||||
| 	int textWidth = 0; | ||||
| 	float scaleFactor; | ||||
| 	 | ||||
| 	for (int i = 0; i < len; i++) | ||||
| 	{ | ||||
| 		textWidth += spriteFont.charSet[(int)text[i] - FIRST_CHAR].w; | ||||
| 	} | ||||
| 	 | ||||
| 	textWidth += (int)((len - 1) * spacing);	// Adds chars spacing to measure | ||||
| 	 | ||||
| 	if (fontSize <= spriteFont.charSet[0].h) scaleFactor = 1.0f; | ||||
| 	else scaleFactor = (float)fontSize / spriteFont.charSet[0].h; | ||||
| 	 | ||||
| 	Vector2 vec; | ||||
| 	vec.x = (float)textWidth * scaleFactor; | ||||
| 	vec.y = (float)spriteFont.charSet[0].h * scaleFactor; | ||||
| 	 | ||||
| 	return vec; | ||||
| } | ||||
|  | ||||
| // Returns the base size for a SpriteFont (chars height) | ||||
| int GetFontBaseSize(SpriteFont spriteFont) | ||||
| { | ||||
| 	return spriteFont.charSet[0].h; | ||||
| } | ||||
|  | ||||
| // Shows current FPS on top-left corner | ||||
| // NOTE: Uses default font | ||||
| void DrawFps(int posX, int posY) | ||||
| { | ||||
| 	// NOTE: We are rendering fps every second for better viewing on high framerates | ||||
| 	static float fps; | ||||
| 	static int counter = 0; | ||||
| 	static int refreshRate = 0; | ||||
| 	 | ||||
| 	char buffer[20]; | ||||
| 	 | ||||
| 	if (counter < refreshRate) | ||||
| 	{ | ||||
| 		sprintf(buffer, "%2.0f FPS", fps); | ||||
| 		DrawText(buffer, posX, posY, 20, 1, LIME); | ||||
| 		 | ||||
| 		counter++; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		fps = GetFPS(); | ||||
| 		refreshRate = fps; | ||||
| 		sprintf(buffer, "%2.0f FPS", fps); | ||||
| 		DrawText(buffer, posX, posY, 20, 1, LIME); | ||||
| 		 | ||||
| 		counter = 0; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // Check if a pixel is magenta | ||||
| static bool PixelIsMagenta(Color p) | ||||
| { | ||||
| 	return ((p.r == 255) && (p.g == 0) && (p.b == 255) && (p.a == 255)); | ||||
| } | ||||
|  | ||||
| // Parse image pixel data to obtain character set measures | ||||
| static int ParseImageData(Color *imgDataPixel, int imgWidth, int imgHeight, Character **charSet) | ||||
| { | ||||
| 	int charSpacing = 0; | ||||
| 	int lineSpacing = 0; | ||||
| 	 | ||||
| 	int x = 0; | ||||
| 	int y = 0; | ||||
| 	 | ||||
| 	Character tempCharSet[MAX_FONTCHARS];	// We allocate a temporal array for charData, once we get the actual charNumber we copy data to a sized array. | ||||
| 	 | ||||
| 	for(y = 0; y < imgHeight; y++) | ||||
| 	{	 | ||||
| 		for(x = 0; x < imgWidth; x++) | ||||
| 		{	 | ||||
| 			if (!PixelIsMagenta(imgDataPixel[y*imgWidth + x])) break; | ||||
| 		} | ||||
| 		if (!PixelIsMagenta(imgDataPixel[y*imgWidth + x])) break; | ||||
| 	} | ||||
| 	 | ||||
| 	charSpacing = x; | ||||
| 	lineSpacing = y; | ||||
| 	 | ||||
| 	int charHeight = 0; | ||||
| 	int j = 0; | ||||
| 	 | ||||
| 	while(!PixelIsMagenta(imgDataPixel[(lineSpacing + j)*imgWidth + charSpacing])) j++; | ||||
| 	 | ||||
| 	charHeight = j; | ||||
| 	 | ||||
| 	// Check array values to get characters: value, x, y, w, h | ||||
| 	int index = 0; | ||||
| 	int lineToRead = 0; | ||||
| 	int xPosToRead = charSpacing; | ||||
| 	 | ||||
| 	while((lineSpacing + lineToRead * (charHeight + lineSpacing)) < imgHeight) | ||||
| 	{ | ||||
| 		while((xPosToRead < imgWidth) && | ||||
| 			  !PixelIsMagenta((imgDataPixel[(lineSpacing + (charHeight+lineSpacing)*lineToRead)*imgWidth + xPosToRead]))) | ||||
| 		{ | ||||
| 			tempCharSet[index].value = FIRST_CHAR + index; | ||||
| 			tempCharSet[index].x = xPosToRead; | ||||
| 			tempCharSet[index].y = lineSpacing + lineToRead * (charHeight + lineSpacing); | ||||
| 			tempCharSet[index].h = charHeight; | ||||
| 			 | ||||
| 			int charWidth = 0; | ||||
| 			 | ||||
| 			while(!PixelIsMagenta(imgDataPixel[(lineSpacing + (charHeight+lineSpacing)*lineToRead)*imgWidth + xPosToRead + charWidth])) charWidth++; | ||||
| 	 | ||||
| 			tempCharSet[index].w = charWidth; | ||||
| 			 | ||||
| 			index++; | ||||
| 			 | ||||
| 			xPosToRead += (charWidth + charSpacing); | ||||
| 		} | ||||
| 		 | ||||
| 		lineToRead++; | ||||
| 		xPosToRead = charSpacing; | ||||
| 	} | ||||
| 	 | ||||
| 	// We got tempCharSet populated with char data and the number of chars (index) | ||||
| 	// Now we move temp data to real charSet (passed as parameter to the function) | ||||
| 	(*charSet) = (Character *)malloc(index * sizeof(Character));		// BE CAREFUL! This memory should be freed! | ||||
|  | ||||
| 	for (int i = 0; i < index; i++) (*charSet)[i] = tempCharSet[i]; | ||||
|  | ||||
| 	return index; | ||||
| } | ||||
|  | ||||
| // Calculate next power-of-two value for a given num | ||||
| static int GetNextPOT(int num) | ||||
| { | ||||
|     if (num != 0) | ||||
|     { | ||||
|         num--; | ||||
|         num |= (num >> 1);	// Or first 2 bits | ||||
|         num |= (num >> 2); 	// Or next 2 bits | ||||
|         num |= (num >> 4); 	// Or next 4 bits | ||||
|         num |= (num >> 8); 	// Or next 8 bits | ||||
|         num |= (num >> 16); // Or next 16 bits | ||||
|         num++; | ||||
|     } | ||||
|  | ||||
| 	return num; | ||||
| } | ||||
							
								
								
									
										275
									
								
								src/textures.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,275 @@ | ||||
| /********************************************************************************************* | ||||
| * | ||||
| *	raylib.textures | ||||
| * | ||||
| *	Basic functions to load and draw Textures (2d) | ||||
| *	 | ||||
| *	Uses external lib: | ||||
| *		stb_image - Multiple formats image loading (JPEG, PNG, BMP, TGA, PSD, GIF, PIC) | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| *	 | ||||
| *	This software is provided "as-is", without any express or implied warranty. In no event  | ||||
| *	will the authors be held liable for any damages arising from the use of this software. | ||||
| * | ||||
| *	Permission is granted to anyone to use this software for any purpose, including commercial  | ||||
| *	applications, and to alter it and redistribute it freely, subject to the following restrictions: | ||||
| * | ||||
| *	  1. The origin of this software must not be misrepresented; you must not claim that you  | ||||
| *	  wrote the original software. If you use this software in a product, an acknowledgment  | ||||
| *	  in the product documentation would be appreciated but is not required. | ||||
| * | ||||
| *	  2. Altered source versions must be plainly marked as such, and must not be misrepresented | ||||
| *	  as being the original software. | ||||
| * | ||||
| *	  3. This notice may not be removed or altered from any source distribution. | ||||
| * | ||||
| **********************************************************************************************/ | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| #include <GL/gl.h>			// OpenGL functions | ||||
| #include <stdlib.h>			// Declares malloc() and free() for memory management | ||||
| #include "stb_image.h"		// Used to read image data (multiple formats support) | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Defines and Macros | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Nop... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| typedef unsigned char byte; | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Global Variables Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| // It's lonely here... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Declaration | ||||
| //---------------------------------------------------------------------------------- | ||||
| // No private (static) functions in this module (.c file) | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module Functions Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // Load an image into CPU memory (RAM) | ||||
| Image LoadImage(const char *fileName) | ||||
| { | ||||
| 	Image image; | ||||
| 	 | ||||
| 	int imgWidth; | ||||
| 	int imgHeight; | ||||
| 	int imgBpp; | ||||
| 	 | ||||
| 	// NOTE: Using stb_image to load images (Supports: BMP, TGA, PNG, JPG, ...) | ||||
| 	byte *imgData = stbi_load(fileName, &imgWidth, &imgHeight, &imgBpp, 4);	// Force loading to 4 components (RGBA) | ||||
| 	 | ||||
| 	// Convert array to pixel array for working convenience | ||||
| 	image.pixels = (Color *)malloc(imgWidth * imgHeight * sizeof(Color)); | ||||
| 	 | ||||
|     int pix = 0; | ||||
| 	 | ||||
| 	for (int i = 0; i < (imgWidth * imgHeight * 4); i += 4) | ||||
| 	{ | ||||
| 		image.pixels[pix].r = imgData[i]; | ||||
| 		image.pixels[pix].g = imgData[i+1]; | ||||
| 		image.pixels[pix].b = imgData[i+2]; | ||||
| 		image.pixels[pix].a = imgData[i+3]; | ||||
| 		pix++; | ||||
| 	} | ||||
| 	 | ||||
| 	stbi_image_free(imgData); | ||||
| 	 | ||||
| 	image.width = imgWidth; | ||||
| 	image.height = imgHeight; | ||||
| 	 | ||||
| 	// ALTERNATIVE: We can load pixel data directly into Color struct pixels array,  | ||||
| 	// to do that struct data alignment should be the right one (4 byte); it is. | ||||
| 	//image.pixels = stbi_load(fileName, &imgWidth, &imgHeight, &imgBpp, 4); | ||||
|  | ||||
| 	return image; | ||||
| } | ||||
|  | ||||
| // Unload image from CPU memory (RAM) | ||||
| void UnloadImage(Image image) | ||||
| { | ||||
| 	free(image.pixels); | ||||
| } | ||||
|  | ||||
| // Load an image as texture into GPU memory | ||||
| Texture2D LoadTexture(const char *fileName) | ||||
| { | ||||
| 	Texture2D texture; | ||||
|  | ||||
| 	int imgWidth; | ||||
| 	int imgHeight; | ||||
| 	int imgBpp; | ||||
| 	 | ||||
| 	// NOTE: Using stb_image to load images (Supports: BMP, TGA, PNG, JPG, ...) | ||||
| 	byte *imgData = stbi_load(fileName, &imgWidth, &imgHeight, &imgBpp, 4);	// Force loading to 4 components (RGBA) | ||||
| 	 | ||||
| 	// Convert loaded data to OpenGL texture | ||||
| 	//---------------------------------------- | ||||
| 	GLuint id; | ||||
| 	glGenTextures(1, &id);					// Generate Pointer to the Texture | ||||
| 	 | ||||
| 	glBindTexture(GL_TEXTURE_2D, id); | ||||
| 	 | ||||
| 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);			// Set texture to repead on x-axis | ||||
| 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);			// Set texture to repead on y-axis | ||||
| 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 		// Filter for pixel-perfect drawing, alternative: GL_LINEAR  | ||||
| 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 		// Filter for pixel-perfect drawing, alternative: GL_LINEAR | ||||
| 	 | ||||
| 	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imgWidth, imgHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgData); | ||||
| 	 | ||||
| 	// NOTE: Not using mipmappings (texture for 2D drawing) | ||||
| 	// At this point we have the image converted to texture and uploaded to GPU | ||||
| 	 | ||||
| 	stbi_image_free(imgData);		// Now we can free loaded data from RAM memory | ||||
| 	 | ||||
| 	texture.glId = id; | ||||
| 	texture.width = imgWidth; | ||||
| 	texture.height = imgHeight; | ||||
| 	 | ||||
| 	return texture; | ||||
| } | ||||
|  | ||||
| // Load an image as texture (and convert to POT with mipmaps) | ||||
| Texture2D LoadTextureEx(const char *fileName, bool createPOT, bool mipmaps) | ||||
| { | ||||
| 	Texture2D texture; | ||||
| 	 | ||||
| 	// TODO: Load and image and convert to Power-Of-Two | ||||
| 	// NOTE: Conversion could be done just adding extra space to image or by scaling image | ||||
| 	// NOTE: If scaling image, be careful with scaling algorithm (aproximation, bilinear, bicubic...) | ||||
| 	 | ||||
| 	// TODO: Generate all required mipmap levels from image and convert to testure (not that easy) | ||||
| 	// NOTE: If using OpenGL 1.1, the only option is doing mipmap generation on CPU side (i.e. gluBuild2DMipmaps) | ||||
| 	// NOTE: raylib tries to minimize external dependencies so, we are not using GLU | ||||
| 	// NOTE: Re-implement some function similar to gluBuild2DMipmaps (not that easy...) | ||||
| 	 | ||||
| 	return texture; | ||||
| } | ||||
|  | ||||
| // Unload texture from GPU memory | ||||
| void UnloadTexture(Texture2D texture) | ||||
| { | ||||
| 	glDeleteTextures(1, &texture.glId); | ||||
| } | ||||
|  | ||||
| // Draw a Texture2D | ||||
| void DrawTexture(Texture2D texture, int posX, int posY, Color tint) | ||||
| { | ||||
| 	DrawTextureEx(texture, (Vector2){ (float)posX, (float)posY}, 0, 1.0f, tint); | ||||
| } | ||||
|  | ||||
| // Draw a Texture2D with extended parameters | ||||
| void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint) | ||||
| { | ||||
| 	glEnable(GL_TEXTURE_2D);	// Enable textures usage | ||||
| 	 | ||||
| 	glBindTexture(GL_TEXTURE_2D, texture.glId); | ||||
| 	 | ||||
| 	glPushMatrix(); | ||||
| 		// NOTE: Rotation is applied before translation and scaling, even being called in inverse order... | ||||
| 		// NOTE: Rotation point is upper-left corner | ||||
| 		glTranslatef(position.x, position.y, 0); | ||||
| 		glScalef(scale, scale, 1.0f); | ||||
| 		glRotatef(rotation, 0, 0, 1); | ||||
| 		 | ||||
| 		glBegin(GL_QUADS); | ||||
| 			glColor4ub(tint.r, tint.g, tint.b, tint.a); | ||||
| 			glNormal3f(0.0f, 0.0f, 1.0f);                  							// Normal vector pointing towards viewer | ||||
| 			glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);  						// Bottom-left corner for texture and quad | ||||
| 			glTexCoord2f(1.0f, 0.0f); glVertex2f(texture.width, 0.0f);  			// Bottom-right corner for texture and quad | ||||
| 			glTexCoord2f(1.0f, 1.0f); glVertex2f(texture.width, texture.height);  	// Top-right corner for texture and quad | ||||
| 			glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, texture.height);  			// Top-left corner for texture and quad | ||||
| 		glEnd(); | ||||
| 	glPopMatrix(); | ||||
| 	 | ||||
| 	glDisable(GL_TEXTURE_2D);	// Disable textures usage | ||||
| } | ||||
|  | ||||
| // Draw a part of a texture (defined by a rectangle) | ||||
| void DrawTextureRec(Texture2D texture, Rectangle sourceRec, Vector2 position, float scale, Color tint) | ||||
| { | ||||
| 	glEnable(GL_TEXTURE_2D);	// Enable textures usage | ||||
| 	 | ||||
| 	glBindTexture(GL_TEXTURE_2D, texture.glId); | ||||
| 	 | ||||
| 	glPushMatrix(); | ||||
| 		glTranslatef(position.x, position.y, 0); | ||||
| 		glScalef(scale, scale, 1.0f); | ||||
| 		//glRotatef(rotation, 0, 0, 1); | ||||
| 		 | ||||
| 		glBegin(GL_QUADS); | ||||
| 			glColor4ub(tint.r, tint.g, tint.b, tint.a); | ||||
| 			glNormal3f(0.0f, 0.0f, 1.0f);                  		// Normal vector pointing towards viewer | ||||
| 			 | ||||
| 			// Bottom-left corner for texture and quad | ||||
| 			glTexCoord2f((float)sourceRec.x / texture.width, (float)sourceRec.y / texture.height);  | ||||
| 			glVertex2f(0.0f, 0.0f); | ||||
| 			 | ||||
| 			// Bottom-right corner for texture and quad | ||||
| 			glTexCoord2f((float)(sourceRec.x + sourceRec.width) / texture.width, (float)sourceRec.y / texture.height); | ||||
| 			glVertex2f(sourceRec.width, 0.0f); | ||||
| 			 | ||||
| 			// Top-right corner for texture and quad | ||||
| 			glTexCoord2f((float)(sourceRec.x + sourceRec.width) / texture.width, (float)(sourceRec.y + sourceRec.height) / texture.height);  | ||||
| 			glVertex2f(sourceRec.width, sourceRec.height); | ||||
| 			 | ||||
| 			// Top-left corner for texture and quad | ||||
| 			glTexCoord2f((float)sourceRec.x / texture.width, (float)(sourceRec.y + sourceRec.height) / texture.height); | ||||
| 			glVertex2f(0.0f, sourceRec.height); | ||||
| 		glEnd(); | ||||
| 	glPopMatrix(); | ||||
| 	 | ||||
| 	glDisable(GL_TEXTURE_2D);	// Disable textures usage | ||||
| } | ||||
|  | ||||
| // Creates a bitmap (BMP) file from an array of pixel data | ||||
| // NOTE: This function is only used by module [core], not explicitly available to raylib users | ||||
| extern void WriteBitmap(const char *fileName, const Color *imgDataPixel, int width, int height) | ||||
| { | ||||
| 	int filesize = 54 + 3*width*height; | ||||
| 	 | ||||
| 	unsigned char bmpFileHeader[14] = {'B','M', 0,0,0,0, 0,0, 0,0, 54,0,0,0};	// Standard BMP file header | ||||
| 	unsigned char bmpInfoHeader[40] = {40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 24,0};	// Standard BMP info header | ||||
|  | ||||
| 	bmpFileHeader[2] = (unsigned char)(filesize); | ||||
| 	bmpFileHeader[3] = (unsigned char)(filesize>>8); | ||||
| 	bmpFileHeader[4] = (unsigned char)(filesize>>16); | ||||
| 	bmpFileHeader[5] = (unsigned char)(filesize>>24); | ||||
|  | ||||
| 	bmpInfoHeader[4] = (unsigned char)(width); | ||||
| 	bmpInfoHeader[5] = (unsigned char)(width>>8); | ||||
| 	bmpInfoHeader[6] = (unsigned char)(width>>16); | ||||
| 	bmpInfoHeader[7] = (unsigned char)(width>>24); | ||||
| 	bmpInfoHeader[8] = (unsigned char)(height); | ||||
| 	bmpInfoHeader[9] = (unsigned char)(height>>8); | ||||
| 	bmpInfoHeader[10] = (unsigned char)(height>>16); | ||||
| 	bmpInfoHeader[11] = (unsigned char)(height>>24); | ||||
|  | ||||
| 	FILE *bmpFile = fopen(fileName, "wb");	// Define a pointer to bitmap file and open it in write-binary mode | ||||
| 	 | ||||
| 	// NOTE: fwrite parameters are: data pointer, size in bytes of each element to be written, number of elements, file-to-write pointer | ||||
| 	fwrite(bmpFileHeader, sizeof(unsigned char), 14, bmpFile);	// Write BMP file header data | ||||
| 	fwrite(bmpInfoHeader, sizeof(unsigned char), 40, bmpFile);	// Write BMP info header data | ||||
| 	 | ||||
| 	// Write pixel data to file | ||||
|     for (int y = 0; y < height ; y++) | ||||
|     { | ||||
|         for (int x = 0; x < width; x++) | ||||
|         { | ||||
|             fputc(imgDataPixel[x + y*width].b, bmpFile); | ||||
|             fputc(imgDataPixel[x + y*width].g, bmpFile); | ||||
|             fputc(imgDataPixel[x + y*width].r, bmpFile); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fclose(bmpFile);	    // Close bitmap file | ||||
| } | ||||
							
								
								
									
										140
									
								
								src/vector3.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,140 @@ | ||||
| /********************************************************************************************* | ||||
| * | ||||
| *	raylib.vector3 | ||||
| * | ||||
| *	Vector3 Functions Definition | ||||
| * | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| *	 | ||||
| *	This software is provided "as-is", without any express or implied warranty. In no event  | ||||
| *	will the authors be held liable for any damages arising from the use of this software. | ||||
| * | ||||
| *	Permission is granted to anyone to use this software for any purpose, including commercial  | ||||
| *	applications, and to alter it and redistribute it freely, subject to the following restrictions: | ||||
| * | ||||
| *	  1. The origin of this software must not be misrepresented; you must not claim that you  | ||||
| *	  wrote the original software. If you use this software in a product, an acknowledgment  | ||||
| *	  in the product documentation would be appreciated but is not required. | ||||
| * | ||||
| *	  2. Altered source versions must be plainly marked as such, and must not be misrepresented | ||||
| *	  as being the original software. | ||||
| * | ||||
| *	  3. This notice may not be removed or altered from any source distribution. | ||||
| * | ||||
| **********************************************************************************************/ | ||||
|  | ||||
| #include "vector3.h" | ||||
|  | ||||
| #include <math.h> | ||||
|  | ||||
| // Add two vectors | ||||
| Vector3 VectorAdd(Vector3 v1, Vector3 v2) | ||||
| { | ||||
| 	Vector3 out; | ||||
|  | ||||
| 	out.x = v1.x + v2.x; | ||||
| 	out.y = v1.y + v2.y; | ||||
| 	out.z = v1.z + v2.z; | ||||
| 	 | ||||
| 	return out; | ||||
| } | ||||
|  | ||||
| // Substract two vectors | ||||
| Vector3 VectorSubtract(Vector3 v1, Vector3 v2) | ||||
| { | ||||
| 	Vector3 out; | ||||
|  | ||||
| 	out.x = v1.x - v2.x; | ||||
| 	out.y = v1.y - v2.y; | ||||
| 	out.z = v1.z - v2.z; | ||||
| 	 | ||||
| 	return out; | ||||
| } | ||||
|  | ||||
| // Calculate two vectors cross product | ||||
| Vector3 VectorCrossProduct(Vector3 v1, Vector3 v2) | ||||
| { | ||||
| 	Vector3 cross; | ||||
|  | ||||
| 	cross.x = v1.y*v2.z - v1.z*v2.y; | ||||
| 	cross.y = v1.z*v2.x - v1.x*v2.z; | ||||
| 	cross.z = v1.x*v2.y - v1.y*v2.x; | ||||
| 	 | ||||
| 	return cross; | ||||
| } | ||||
|  | ||||
| // Calculate one vector perpendicular vector | ||||
| Vector3 VectorPerpendicular(Vector3 v)  | ||||
| { | ||||
| 	Vector3 out; | ||||
| 	 | ||||
|     float min = fabs(v.x); | ||||
|     Vector3 cardinalAxis = {1.0, 0.0, 0.0}; | ||||
|   | ||||
|     if (fabs(v.y) < min)  | ||||
| 	{ | ||||
|         min = fabs(v.y); | ||||
|         cardinalAxis = (Vector3){0.0, 1.0, 0.0}; | ||||
|     } | ||||
|   | ||||
|     if(fabs(v.z) < min)  | ||||
| 	{ | ||||
|         cardinalAxis = (Vector3){0.0, 0.0, 1.0}; | ||||
|     } | ||||
| 	 | ||||
| 	out = VectorCrossProduct(v, cardinalAxis); | ||||
|   | ||||
|     return out; | ||||
| } | ||||
|  | ||||
| // Calculate two vectors dot product | ||||
| float VectorDotProduct(Vector3 v1, Vector3 v2) | ||||
| { | ||||
| 	float dot; | ||||
| 	 | ||||
| 	dot = v1.x*v2.x + v1.y*v2.y + v1.z*v2.z; | ||||
| 	 | ||||
| 	return dot; | ||||
| } | ||||
|  | ||||
| // Calculate vector lenght | ||||
| float VectorLength(const Vector3 v) | ||||
| { | ||||
| 	float length; | ||||
| 	 | ||||
| 	length = sqrt(v.x*v.x + v.y*v.y + v.z*v.z); | ||||
| 	 | ||||
| 	return length; | ||||
| } | ||||
|  | ||||
| // Scale provided vector | ||||
| void VectorScale(Vector3 *v, float scale) | ||||
| { | ||||
| 	v->x *= scale; | ||||
| 	v->y *= scale; | ||||
| 	v->z *= scale; | ||||
| } | ||||
|  | ||||
| // Invert provided vector (direction) | ||||
| void VectorInverse(Vector3 *v) | ||||
| { | ||||
| 	v->x = -v->x; | ||||
| 	v->y = -v->y; | ||||
| 	v->z = -v->z; | ||||
| } | ||||
|  | ||||
| // Normalize provided vector | ||||
| void VectorNormalize(Vector3 *v) | ||||
| { | ||||
| 	float length, ilength; | ||||
|  | ||||
| 	length = VectorLength(*v); | ||||
| 	 | ||||
| 	if (length == 0) length = 1; | ||||
|  | ||||
| 	ilength = 1.0/length; | ||||
| 	 | ||||
| 	v->x *= ilength; | ||||
| 	v->y *= ilength; | ||||
| 	v->z *= ilength; | ||||
| } | ||||
							
								
								
									
										57
									
								
								src/vector3.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,57 @@ | ||||
| /********************************************************************************************* | ||||
| *  | ||||
| *	raylib.vector3 | ||||
| *	 | ||||
| *	Some useful functions to work with Vector3 | ||||
| *  | ||||
| *	Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) | ||||
| *	 | ||||
| *	This software is provided "as-is", without any express or implied warranty. In no event  | ||||
| *	will the authors be held liable for any damages arising from the use of this software. | ||||
| * | ||||
| *	Permission is granted to anyone to use this software for any purpose, including commercial  | ||||
| *	applications, and to alter it and redistribute it freely, subject to the following restrictions: | ||||
| * | ||||
| *	  1. The origin of this software must not be misrepresented; you must not claim that you  | ||||
| *	  wrote the original software. If you use this software in a product, an acknowledgment  | ||||
| *	  in the product documentation would be appreciated but is not required. | ||||
| * | ||||
| *	  2. Altered source versions must be plainly marked as such, and must not be misrepresented | ||||
| *	  as being the original software. | ||||
| * | ||||
| *	  3. This notice may not be removed or altered from any source distribution. | ||||
| * | ||||
| **********************************************************************************************/ | ||||
|  | ||||
| #ifndef VECTOR3_H | ||||
| #define VECTOR3_H | ||||
|  | ||||
| #include "raylib.h"		// Defines Vector3 structure | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" {			// Prevents name mangling of functions | ||||
| #endif | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Global Variables Definition | ||||
| //------------------------------------------------------------------------------------ | ||||
| // It's lonely here... | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Functions Declaration to work with Vector3 | ||||
| //------------------------------------------------------------------------------------ | ||||
| Vector3 VectorAdd(Vector3 v1, Vector3 v2);				// Add two vectors | ||||
| Vector3 VectorSubtract(Vector3 v1, Vector3 v2);			// Substract two vectors | ||||
| Vector3 VectorCrossProduct(Vector3 v1, Vector3 v2);		// Calculate two vectors cross product | ||||
| Vector3 VectorPerpendicular(Vector3 v);					// Calculate one vector perpendicular vector | ||||
| float VectorDotProduct(Vector3 v1, Vector3 v2);			// Calculate two vectors dot product | ||||
| float VectorLength(const Vector3 v);					// Calculate vector lenght | ||||
| void VectorScale(Vector3 *v, float scale);				// Scale provided vector | ||||
| void VectorInverse(Vector3 *v);							// Invert provided vector (direction) | ||||
| void VectorNormalize(Vector3 *v);						// Normalize provided vector | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif // VECTOR3_H | ||||
 Ray
					Ray