Merge remote-tracking branch 'upstream/develop' into develop

This commit is contained in:
Teodor Stoenescu 2016-08-31 09:32:08 +03:00
commit 384602e5b5
22 changed files with 1353 additions and 1253 deletions

2
.gitignore vendored
View file

@ -49,7 +49,7 @@ ipch/
# Ignore compiled binaries # Ignore compiled binaries
*.o *.o
*.exe *.exe
!tools/rrem.exe !tools/rREM/rrem.exe
# Ignore files build by xcode # Ignore files build by xcode
*.mode*v* *.mode*v*

View file

@ -5,9 +5,16 @@
* This example has been created using raylib 1.5 (www.raylib.com) * This example has been created using raylib 1.5 (www.raylib.com)
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
* *
* NOTE:
* Physac requires multi-threading, when InitPhysics() a second thread is created to manage
* physics calculations. To accomplish that, physac uses pthread Win32 library that can be
* found inside raylib/src/external/pthread directory.
* *
* Compile example using: * Add pthread library when compiling physac example:
* cmd /c IF NOT EXIST pthreadGC2.dll copy C:\raylib\raylib\src\external\pthread\pthreadGC2.dll $(CURRENT_DIRECTORY) /Y * gcc -o $(NAME_PART).exe $(FILE_NAME) $(RAYLIB_DIR)\raylib_icon -L../src/external/pthread/lib \
* -I../src -I../src/external/pthread/include -lraylib -lglfw3 -lopengl32 -lgdi32 -lpthreadGC2 -std=c99 -Wall
*
* Note that pthreadGC2.dll must be also copied to project directory!
* *
* Copyright (c) 2016 Victor Fisac and Ramon Santamaria (@raysan5) * Copyright (c) 2016 Victor Fisac and Ramon Santamaria (@raysan5)
* *

View file

@ -5,10 +5,16 @@
* This example has been created using raylib 1.5 (www.raylib.com) * This example has been created using raylib 1.5 (www.raylib.com)
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
* *
* NOTE: This example requires raylib module [rlgl] * NOTE:
* Physac requires multi-threading, when InitPhysics() a second thread is created to manage
* physics calculations. To accomplish that, physac uses pthread Win32 library that can be
* found inside raylib/src/external/pthread directory.
* *
* Compile example using: * Add pthread library when compiling physac example:
* cmd /c IF NOT EXIST pthreadGC2.dll copy C:\raylib\raylib\src\external\pthread\pthreadGC2.dll $(CURRENT_DIRECTORY) /Y * gcc -o $(NAME_PART).exe $(FILE_NAME) $(RAYLIB_DIR)\raylib_icon -L../src/external/pthread/lib \
* -I../src -I../src/external/pthread/include -lraylib -lglfw3 -lopengl32 -lgdi32 -lpthreadGC2 -std=c99 -Wall
*
* Note that pthreadGC2.dll must be also copied to project directory!
* *
* Copyright (c) 2016 Victor Fisac and Ramon Santamaria (@raysan5) * Copyright (c) 2016 Victor Fisac and Ramon Santamaria (@raysan5)
* *

View file

@ -81,7 +81,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\..\src\audio.c" /> <ClCompile Include="..\..\..\src\audio.c" />
<ClCompile Include="..\..\..\src\camera.c" />
<ClCompile Include="..\..\..\src\core.c" /> <ClCompile Include="..\..\..\src\core.c" />
<ClCompile Include="..\..\..\src\external\stb_vorbis.c" /> <ClCompile Include="..\..\..\src\external\stb_vorbis.c" />
<ClCompile Include="..\..\..\src\models.c" /> <ClCompile Include="..\..\..\src\models.c" />
@ -92,6 +91,7 @@
<ClCompile Include="..\..\..\src\utils.c" /> <ClCompile Include="..\..\..\src\utils.c" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\..\src\camera.h" />
<ClInclude Include="..\..\..\src\external\glad.h" /> <ClInclude Include="..\..\..\src\external\glad.h" />
<ClInclude Include="..\..\..\src\external\jar_mod.h" /> <ClInclude Include="..\..\..\src\external\jar_mod.h" />
<ClInclude Include="..\..\..\src\external\jar_xm.h" /> <ClInclude Include="..\..\..\src\external\jar_xm.h" />

View file

@ -35,7 +35,7 @@
# possible platforms: PLATFORM_DESKTOP PLATFORM_RPI PLATFORM_WEB # possible platforms: PLATFORM_DESKTOP PLATFORM_RPI PLATFORM_WEB
PLATFORM ?= PLATFORM_DESKTOP PLATFORM ?= PLATFORM_DESKTOP
# define if you want shared or static version of library. # define YES if you want shared/dynamic version of library instead of static (default)
SHARED ?= NO SHARED ?= NO
# determine if the file has root access (only for installing raylib) # determine if the file has root access (only for installing raylib)
@ -95,8 +95,11 @@ endif
# -Wno-missing-braces ignore invalid warning (GCC bug 53119) # -Wno-missing-braces ignore invalid warning (GCC bug 53119)
CFLAGS = -O1 -Wall -std=gnu99 -fgnu89-inline -Wno-missing-braces CFLAGS = -O1 -Wall -std=gnu99 -fgnu89-inline -Wno-missing-braces
# if shared library required, make sure code is compiled as position independent
ifeq ($(SHARED),YES) ifeq ($(SHARED),YES)
CFLAGS += -fPIC CFLAGS += -fPIC
SHAREDFLAG = BUILDING_DLL
SHAREDLIBS = -Lexternal/glfw3/lib/win32 -Lexternal/openal_soft/lib/win32 -lglfw3 -lopenal32 -lgdi32
endif endif
#CFLAGSEXTRA = -Wextra -Wmissing-prototypes -Wstrict-prototypes #CFLAGSEXTRA = -Wextra -Wmissing-prototypes -Wstrict-prototypes
@ -152,12 +155,16 @@ ifeq ($(PLATFORM),PLATFORM_WEB)
@echo "libraylib.bc generated (web version)!" @echo "libraylib.bc generated (web version)!"
else else
ifeq ($(SHARED),YES) ifeq ($(SHARED),YES)
ifeq ($(PLATFORM_OS),LINUX) ifeq ($(PLATFORM_OS),LINUX)
# compile raylib to shared library version for GNU/Linux. # compile raylib to shared library version for GNU/Linux.
# WARNING: you should type "make clean" before doing this target # WARNING: you should type "make clean" before doing this target
$(CC) -shared -o $(OUTPUT_PATH)/libraylib.so $(OBJS) $(CC) -shared -o $(OUTPUT_PATH)/libraylib.so $(OBJS)
@echo "libraylib.so generated (shared library)!" @echo "raylib shared library (libraylib.so) generated!"
endif endif
ifeq ($(PLATFORM_OS),WINDOWS)
$(CC) -shared -o $(OUTPUT_PATH)/raylib.dll $(OBJS) $(SHAREDLIBS) -Wl,--out-implib,$(OUTPUT_PATH)/libraylibdll.a
@echo "raylib dynamic library (raylib.dll) and MSVC required import library (libraylibdll.a) generated!"
endif
else else
# compile raylib static library for desktop platforms. # compile raylib static library for desktop platforms.
ar rcs $(OUTPUT_PATH)/libraylib.a $(OBJS) ar rcs $(OUTPUT_PATH)/libraylib.a $(OBJS)
@ -169,7 +176,7 @@ endif
# compile core module # compile core module
core.o : core.c raylib.h rlgl.h utils.h raymath.h gestures.h core.o : core.c raylib.h rlgl.h utils.h raymath.h gestures.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG)
# compile rlgl module # compile rlgl module
rlgl.o : rlgl.c rlgl.h raymath.h rlgl.o : rlgl.c rlgl.h raymath.h
@ -177,23 +184,23 @@ rlgl.o : rlgl.c rlgl.h raymath.h
# compile shapes module # compile shapes module
shapes.o : shapes.c raylib.h rlgl.h shapes.o : shapes.c raylib.h rlgl.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(SHAREDFLAG)
# compile textures module # compile textures module
textures.o : textures.c rlgl.h utils.h textures.o : textures.c rlgl.h utils.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(GRAPHICS) $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(GRAPHICS) -D$(SHAREDFLAG)
# compile text module # compile text module
text.o : text.c raylib.h utils.h text.o : text.c raylib.h utils.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(SHAREDFLAG)
# compile models module # compile models module
models.o : models.c raylib.h rlgl.h raymath.h models.o : models.c raylib.h rlgl.h raymath.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG)
# compile audio module # compile audio module
audio.o : audio.c raylib.h audio.o : audio.c raylib.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG)
# compile stb_vorbis library # compile stb_vorbis library
external/stb_vorbis.o: external/stb_vorbis.c external/stb_vorbis.h external/stb_vorbis.o: external/stb_vorbis.c external/stb_vorbis.h
@ -201,7 +208,7 @@ external/stb_vorbis.o: external/stb_vorbis.c external/stb_vorbis.h
# compile utils module # compile utils module
utils.o : utils.c utils.h utils.o : utils.c utils.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) $(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG)
# It installs generated and needed files to compile projects using raylib. # It installs generated and needed files to compile projects using raylib.
# The installation works manually. # The installation works manually.

View file

@ -4,7 +4,7 @@
# #
# Static library compilation # Static library compilation
# #
# Copyright (c) 2014 Ramon Santamaria (Ray San - raysan@raysanweb.com) # Copyright (c) 2014-2016 Ramon Santamaria (@raysan5)
# #
# This software is provided "as-is", without any express or implied warranty. In no event # 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. # will the authors be held liable for any damages arising from the use of this software.
@ -42,7 +42,6 @@ LOCAL_SRC_FILES :=\
../../textures.c \ ../../textures.c \
../../text.c \ ../../text.c \
../../shapes.c \ ../../shapes.c \
../../gestures.c \
../../models.c \ ../../models.c \
../../utils.c \ ../../utils.c \
../../audio.c \ ../../audio.c \

View file

@ -183,7 +183,7 @@ void CloseAudioDevice(void)
alcMakeContextCurrent(NULL); alcMakeContextCurrent(NULL);
alcDestroyContext(context); alcDestroyContext(context);
alcCloseDevice(device); alcCloseDevice(device);
TraceLog(INFO, "Audio device closed successfully"); TraceLog(INFO, "Audio device closed successfully");
} }
@ -217,7 +217,7 @@ Sound LoadSound(char *fileName)
else TraceLog(WARNING, "[%s] Sound extension not recognized, it can't be loaded", fileName); else TraceLog(WARNING, "[%s] Sound extension not recognized, it can't be loaded", fileName);
Sound sound = LoadSoundFromWave(wave); Sound sound = LoadSoundFromWave(wave);
// Sound is loaded, we can unload wave // Sound is loaded, we can unload wave
UnloadWave(wave); UnloadWave(wave);
@ -233,17 +233,29 @@ Sound LoadSoundFromWave(Wave wave)
if (wave.data != NULL) if (wave.data != NULL)
{ {
ALenum format = 0; ALenum format = 0;
// The OpenAL format is worked out by looking at the number of channels and the bits per sample
// The OpenAL format is worked out by looking at the number of channels and the sample size (bits per sample)
if (wave.channels == 1) if (wave.channels == 1)
{ {
if (wave.bitsPerSample == 8 ) format = AL_FORMAT_MONO8; switch (wave.sampleSize)
else if (wave.bitsPerSample == 16) format = AL_FORMAT_MONO16; {
case 8: format = AL_FORMAT_MONO8; break;
case 16: format = AL_FORMAT_MONO16; break;
case 32: format = AL_FORMAT_MONO_FLOAT32; break;
default: TraceLog(WARNING, "Wave sample size not supported: %i", wave.sampleSize); break;
}
} }
else if (wave.channels == 2) else if (wave.channels == 2)
{ {
if (wave.bitsPerSample == 8 ) format = AL_FORMAT_STEREO8; switch (wave.sampleSize)
else if (wave.bitsPerSample == 16) format = AL_FORMAT_STEREO16; {
case 8: format = AL_FORMAT_STEREO8; break;
case 16: format = AL_FORMAT_STEREO16; break;
case 32: format = AL_FORMAT_STEREO_FLOAT32; break;
default: TraceLog(WARNING, "Wave sample size not supported: %i", wave.sampleSize); break;
}
} }
else TraceLog(WARNING, "Wave number of channels not supported: %i", wave.channels);
// Create an audio source // Create an audio source
ALuint source; ALuint source;
@ -260,16 +272,19 @@ Sound LoadSoundFromWave(Wave wave)
ALuint buffer; ALuint buffer;
alGenBuffers(1, &buffer); // Generate pointer to buffer alGenBuffers(1, &buffer); // Generate pointer to buffer
unsigned int dataSize = wave.sampleCount*wave.sampleSize/8; // Size in bytes
// Upload sound data to buffer // Upload sound data to buffer
alBufferData(buffer, format, wave.data, wave.dataSize, wave.sampleRate); alBufferData(buffer, format, wave.data, dataSize, wave.sampleRate);
// Attach sound buffer to source // Attach sound buffer to source
alSourcei(source, AL_BUFFER, buffer); alSourcei(source, AL_BUFFER, buffer);
TraceLog(INFO, "[SND ID %i][BUFR ID %i] Sound data loaded successfully (SampleRate: %i, BitRate: %i, Channels: %i)", source, buffer, wave.sampleRate, wave.bitsPerSample, wave.channels); TraceLog(INFO, "[SND ID %i][BUFR ID %i] Sound data loaded successfully (SampleRate: %i, SampleSize: %i, Channels: %i)", source, buffer, wave.sampleRate, wave.sampleSize, wave.channels);
sound.source = source; sound.source = source;
sound.buffer = buffer; sound.buffer = buffer;
sound.format = format;
} }
return sound; return sound;
@ -341,8 +356,7 @@ Sound LoadSoundFromRES(const char *rresName, int resId)
fread(&reserved, 1, 1, rresFile); // <reserved> fread(&reserved, 1, 1, rresFile); // <reserved>
wave.sampleRate = sampleRate; wave.sampleRate = sampleRate;
wave.dataSize = infoHeader.srcSize; wave.sampleSize = bps;
wave.bitsPerSample = bps;
wave.channels = (short)channels; wave.channels = (short)channels;
unsigned char *data = malloc(infoHeader.size); unsigned char *data = malloc(infoHeader.size);
@ -354,7 +368,7 @@ Sound LoadSoundFromRES(const char *rresName, int resId)
free(data); free(data);
sound = LoadSoundFromWave(wave); sound = LoadSoundFromWave(wave);
// Sound is loaded, we can unload wave data // Sound is loaded, we can unload wave data
UnloadWave(wave); UnloadWave(wave);
} }
@ -396,6 +410,33 @@ void UnloadSound(Sound sound)
TraceLog(INFO, "[SND ID %i][BUFR ID %i] Unloaded sound data from RAM", sound.source, sound.buffer); TraceLog(INFO, "[SND ID %i][BUFR ID %i] Unloaded sound data from RAM", sound.source, sound.buffer);
} }
// Update sound buffer with new data
// NOTE: data must match sound.format
void UpdateSound(Sound sound, void *data, int numSamples)
{
ALint sampleRate, sampleSize, channels;
alGetBufferi(sound.buffer, AL_FREQUENCY, &sampleRate);
alGetBufferi(sound.buffer, AL_BITS, &sampleSize); // It could also be retrieved from sound.format
alGetBufferi(sound.buffer, AL_CHANNELS, &channels); // It could also be retrieved from sound.format
TraceLog(DEBUG, "UpdateSound() : AL_FREQUENCY: %i", sampleRate);
TraceLog(DEBUG, "UpdateSound() : AL_BITS: %i", sampleSize);
TraceLog(DEBUG, "UpdateSound() : AL_CHANNELS: %i", channels);
unsigned int dataSize = numSamples*sampleSize/8; // Size of data in bytes
alSourceStop(sound.source); // Stop sound
alSourcei(sound.source, AL_BUFFER, 0); // Unbind buffer from sound to update
//alDeleteBuffers(1, &sound.buffer); // Delete current buffer data
//alGenBuffers(1, &sound.buffer); // Generate new buffer
// Upload new data to sound buffer
alBufferData(sound.buffer, sound.format, data, dataSize, sampleRate);
// Attach sound buffer to source again
alSourcei(sound.source, AL_BUFFER, sound.buffer);
}
// Play a sound // Play a sound
void PlaySound(Sound sound) void PlaySound(Sound sound)
{ {
@ -493,13 +534,13 @@ Music LoadMusicStream(char *fileName)
TraceLog(DEBUG, "[%s] OGG sample rate: %i", fileName, info.sample_rate); TraceLog(DEBUG, "[%s] OGG sample rate: %i", fileName, info.sample_rate);
TraceLog(DEBUG, "[%s] OGG channels: %i", fileName, info.channels); TraceLog(DEBUG, "[%s] OGG channels: %i", fileName, info.channels);
TraceLog(DEBUG, "[%s] OGG memory required: %i", fileName, info.temp_memory_required); TraceLog(DEBUG, "[%s] OGG memory required: %i", fileName, info.temp_memory_required);
} }
} }
else if (strcmp(GetExtension(fileName), "xm") == 0) else if (strcmp(GetExtension(fileName), "xm") == 0)
{ {
int result = jar_xm_create_context_from_file(&music->ctxXm, 48000, fileName); int result = jar_xm_create_context_from_file(&music->ctxXm, 48000, fileName);
if (!result) // XM context created successfully if (!result) // XM context created successfully
{ {
jar_xm_set_max_loop_count(music->ctxXm, 0); // Set infinite number of loops jar_xm_set_max_loop_count(music->ctxXm, 0); // Set infinite number of loops
@ -510,7 +551,7 @@ Music LoadMusicStream(char *fileName)
music->samplesLeft = music->totalSamples; music->samplesLeft = music->totalSamples;
music->ctxType = MUSIC_MODULE_XM; music->ctxType = MUSIC_MODULE_XM;
music->loop = true; music->loop = true;
TraceLog(DEBUG, "[%s] XM number of samples: %i", fileName, music->totalSamples); TraceLog(DEBUG, "[%s] XM number of samples: %i", fileName, music->totalSamples);
TraceLog(DEBUG, "[%s] XM track length: %11.6f sec", fileName, (float)music->totalSamples/48000.0f); TraceLog(DEBUG, "[%s] XM track length: %11.6f sec", fileName, (float)music->totalSamples/48000.0f);
} }
@ -542,11 +583,11 @@ Music LoadMusicStream(char *fileName)
void UnloadMusicStream(Music music) void UnloadMusicStream(Music music)
{ {
CloseAudioStream(music->stream); CloseAudioStream(music->stream);
if (music->ctxType == MUSIC_AUDIO_OGG) stb_vorbis_close(music->ctxOgg); if (music->ctxType == MUSIC_AUDIO_OGG) stb_vorbis_close(music->ctxOgg);
else if (music->ctxType == MUSIC_MODULE_XM) jar_xm_free_context(music->ctxXm); else if (music->ctxType == MUSIC_MODULE_XM) jar_xm_free_context(music->ctxXm);
else if (music->ctxType == MUSIC_MODULE_MOD) jar_mod_unload(&music->ctxMod); else if (music->ctxType == MUSIC_MODULE_MOD) jar_mod_unload(&music->ctxMod);
free(music); free(music);
} }
@ -584,58 +625,58 @@ void UpdateMusicStream(Music music)
// Determine if music stream is ready to be written // Determine if music stream is ready to be written
alGetSourcei(music->stream.source, AL_BUFFERS_PROCESSED, &processed); alGetSourcei(music->stream.source, AL_BUFFERS_PROCESSED, &processed);
int numBuffersToProcess = processed; int numBuffersToProcess = processed;
if (processed > 0) if (processed > 0)
{ {
bool active = true; bool active = true;
short pcm[AUDIO_BUFFER_SIZE]; short pcm[AUDIO_BUFFER_SIZE];
float pcmf[AUDIO_BUFFER_SIZE]; float pcmf[AUDIO_BUFFER_SIZE];
int numSamples = 0; // Total size of data steamed in L+R samples for xm floats, int numSamples = 0; // Total size of data steamed in L+R samples for xm floats,
// individual L or R for ogg shorts // individual L or R for ogg shorts
for (int i = 0; i < numBuffersToProcess; i++) for (int i = 0; i < numBuffersToProcess; i++)
{ {
switch (music->ctxType) switch (music->ctxType)
{ {
case MUSIC_AUDIO_OGG: case MUSIC_AUDIO_OGG:
{ {
if (music->samplesLeft >= AUDIO_BUFFER_SIZE) numSamples = AUDIO_BUFFER_SIZE; if (music->samplesLeft >= AUDIO_BUFFER_SIZE) numSamples = AUDIO_BUFFER_SIZE;
else numSamples = music->samplesLeft; else numSamples = music->samplesLeft;
// NOTE: Returns the number of samples to process (should be the same as numSamples -> it is) // NOTE: Returns the number of samples to process (should be the same as numSamples -> it is)
int numSamplesOgg = stb_vorbis_get_samples_short_interleaved(music->ctxOgg, music->stream.channels, pcm, numSamples); int numSamplesOgg = stb_vorbis_get_samples_short_interleaved(music->ctxOgg, music->stream.channels, pcm, numSamples);
// TODO: Review stereo channels Ogg, not enough samples served! // TODO: Review stereo channels Ogg, not enough samples served!
UpdateAudioStream(music->stream, pcm, numSamplesOgg*music->stream.channels); UpdateAudioStream(music->stream, pcm, numSamplesOgg*music->stream.channels);
music->samplesLeft -= (numSamplesOgg*music->stream.channels); music->samplesLeft -= (numSamplesOgg*music->stream.channels);
} break; } break;
case MUSIC_MODULE_XM: case MUSIC_MODULE_XM:
{ {
if (music->samplesLeft >= AUDIO_BUFFER_SIZE/2) numSamples = AUDIO_BUFFER_SIZE/2; if (music->samplesLeft >= AUDIO_BUFFER_SIZE/2) numSamples = AUDIO_BUFFER_SIZE/2;
else numSamples = music->samplesLeft; else numSamples = music->samplesLeft;
// NOTE: Output buffer is 2*numsamples elements (left and right value for each sample) // NOTE: Output buffer is 2*numsamples elements (left and right value for each sample)
jar_xm_generate_samples(music->ctxXm, pcmf, numSamples); jar_xm_generate_samples(music->ctxXm, pcmf, numSamples);
UpdateAudioStream(music->stream, pcmf, numSamples*2); // Using 32bit PCM data UpdateAudioStream(music->stream, pcmf, numSamples*2); // Using 32bit PCM data
music->samplesLeft -= numSamples; music->samplesLeft -= numSamples;
//TraceLog(INFO, "Samples left: %i", music->samplesLeft); //TraceLog(INFO, "Samples left: %i", music->samplesLeft);
} break; } break;
case MUSIC_MODULE_MOD: case MUSIC_MODULE_MOD:
{ {
if (music->samplesLeft >= AUDIO_BUFFER_SIZE/2) numSamples = AUDIO_BUFFER_SIZE/2; if (music->samplesLeft >= AUDIO_BUFFER_SIZE/2) numSamples = AUDIO_BUFFER_SIZE/2;
else numSamples = music->samplesLeft; else numSamples = music->samplesLeft;
// NOTE: Output buffer size is nbsample*channels (default: 48000Hz, 16bit, Stereo) // NOTE: Output buffer size is nbsample*channels (default: 48000Hz, 16bit, Stereo)
jar_mod_fillbuffer(&music->ctxMod, pcm, numSamples, 0); jar_mod_fillbuffer(&music->ctxMod, pcm, numSamples, 0);
UpdateAudioStream(music->stream, pcm, numSamples*2); UpdateAudioStream(music->stream, pcm, numSamples*2);
music->samplesLeft -= numSamples; music->samplesLeft -= numSamples;
} break; } break;
default: break; default: break;
} }
@ -646,15 +687,15 @@ void UpdateMusicStream(Music music)
break; break;
} }
} }
// Reset audio stream for looping // Reset audio stream for looping
if (!active && music->loop) if (!active && music->loop)
{ {
// Restart music context (if required) // Restart music context (if required)
//if (music->ctxType == MUSIC_MODULE_XM) //if (music->ctxType == MUSIC_MODULE_XM)
if (music->ctxType == MUSIC_MODULE_MOD) jar_mod_seek_start(&music->ctxMod); if (music->ctxType == MUSIC_MODULE_MOD) jar_mod_seek_start(&music->ctxMod);
else if (music->ctxType == MUSIC_AUDIO_OGG) stb_vorbis_seek_start(music->ctxOgg); else if (music->ctxType == MUSIC_AUDIO_OGG) stb_vorbis_seek_start(music->ctxOgg);
// Reset samples left to total samples // Reset samples left to total samples
music->samplesLeft = music->totalSamples; music->samplesLeft = music->totalSamples;
} }
@ -700,7 +741,7 @@ void SetMusicPitch(Music music, float pitch)
float GetMusicTimeLength(Music music) float GetMusicTimeLength(Music music)
{ {
float totalSeconds = (float)music->totalSamples/music->stream.sampleRate; float totalSeconds = (float)music->totalSamples/music->stream.sampleRate;
return totalSeconds; return totalSeconds;
} }
@ -719,7 +760,7 @@ float GetMusicTimePlayed(Music music)
AudioStream InitAudioStream(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels) AudioStream InitAudioStream(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels)
{ {
AudioStream stream = { 0 }; AudioStream stream = { 0 };
stream.sampleRate = sampleRate; stream.sampleRate = sampleRate;
stream.sampleSize = sampleSize; stream.sampleSize = sampleSize;
stream.channels = channels; stream.channels = channels;
@ -778,7 +819,7 @@ AudioStream InitAudioStream(unsigned int sampleRate, unsigned int sampleSize, un
} }
alSourceQueueBuffers(stream.source, MAX_STREAM_BUFFERS, stream.buffers); alSourceQueueBuffers(stream.source, MAX_STREAM_BUFFERS, stream.buffers);
TraceLog(INFO, "[AUD ID %i] Audio stream loaded successfully", stream.source); TraceLog(INFO, "[AUD ID %i] Audio stream loaded successfully", stream.source);
return stream; return stream;
@ -793,9 +834,9 @@ void CloseAudioStream(AudioStream stream)
// Flush out all queued buffers // Flush out all queued buffers
int queued = 0; int queued = 0;
alGetSourcei(stream.source, AL_BUFFERS_QUEUED, &queued); alGetSourcei(stream.source, AL_BUFFERS_QUEUED, &queued);
ALuint buffer = 0; ALuint buffer = 0;
while (queued > 0) while (queued > 0)
{ {
alSourceUnqueueBuffers(stream.source, 1, &buffer); alSourceUnqueueBuffers(stream.source, 1, &buffer);
@ -805,7 +846,7 @@ void CloseAudioStream(AudioStream stream)
// Delete source and buffers // Delete source and buffers
alDeleteSources(1, &stream.source); alDeleteSources(1, &stream.source);
alDeleteBuffers(MAX_STREAM_BUFFERS, stream.buffers); alDeleteBuffers(MAX_STREAM_BUFFERS, stream.buffers);
TraceLog(INFO, "[AUD ID %i] Unloaded audio stream data", stream.source); TraceLog(INFO, "[AUD ID %i] Unloaded audio stream data", stream.source);
} }
@ -815,14 +856,14 @@ void UpdateAudioStream(AudioStream stream, void *data, int numSamples)
{ {
ALuint buffer = 0; ALuint buffer = 0;
alSourceUnqueueBuffers(stream.source, 1, &buffer); alSourceUnqueueBuffers(stream.source, 1, &buffer);
// Check if any buffer was available for unqueue // Check if any buffer was available for unqueue
if (alGetError() != AL_INVALID_VALUE) if (alGetError() != AL_INVALID_VALUE)
{ {
if (stream.sampleSize == 8) alBufferData(buffer, stream.format, (unsigned char *)data, numSamples*sizeof(unsigned char), stream.sampleRate); if (stream.sampleSize == 8) alBufferData(buffer, stream.format, (unsigned char *)data, numSamples*sizeof(unsigned char), stream.sampleRate);
else if (stream.sampleSize == 16) alBufferData(buffer, stream.format, (short *)data, numSamples*sizeof(short), stream.sampleRate); else if (stream.sampleSize == 16) alBufferData(buffer, stream.format, (short *)data, numSamples*sizeof(short), stream.sampleRate);
else if (stream.sampleSize == 32) alBufferData(buffer, stream.format, (float *)data, numSamples*sizeof(float), stream.sampleRate); else if (stream.sampleSize == 32) alBufferData(buffer, stream.format, (float *)data, numSamples*sizeof(float), stream.sampleRate);
alSourceQueueBuffers(stream.source, 1, &buffer); alSourceQueueBuffers(stream.source, 1, &buffer);
} }
} }
@ -948,18 +989,18 @@ static Wave LoadWAV(const char *fileName)
else else
{ {
// Allocate memory for data // Allocate memory for data
wave.data = (unsigned char *)malloc(sizeof(unsigned char) * waveData.subChunkSize); wave.data = (unsigned char *)malloc(sizeof(unsigned char)*waveData.subChunkSize);
// Read in the sound data into the soundData variable // Read in the sound data into the soundData variable
fread(wave.data, waveData.subChunkSize, 1, wavFile); fread(wave.data, waveData.subChunkSize, 1, wavFile);
// Now we set the variables that we need later // Now we set the variables that we need later
wave.dataSize = waveData.subChunkSize; wave.sampleCount = waveData.subChunkSize;
wave.sampleRate = waveFormat.sampleRate; wave.sampleRate = waveFormat.sampleRate;
wave.sampleSize = waveFormat.bitsPerSample;
wave.channels = waveFormat.numChannels; wave.channels = waveFormat.numChannels;
wave.bitsPerSample = waveFormat.bitsPerSample;
TraceLog(INFO, "[%s] WAV file loaded successfully (SampleRate: %i, BitRate: %i, Channels: %i)", fileName, wave.sampleRate, wave.bitsPerSample, wave.channels); TraceLog(INFO, "[%s] WAV file loaded successfully (SampleRate: %i, SampleSize: %i, Channels: %i)", fileName, wave.sampleRate, wave.sampleSize, wave.channels);
} }
} }
} }
@ -988,35 +1029,24 @@ static Wave LoadOGG(char *fileName)
stb_vorbis_info info = stb_vorbis_get_info(oggFile); stb_vorbis_info info = stb_vorbis_get_info(oggFile);
wave.sampleRate = info.sample_rate; wave.sampleRate = info.sample_rate;
wave.bitsPerSample = 16; wave.sampleSize = 16; // 16 bit per sample (short)
wave.channels = info.channels; wave.channels = info.channels;
TraceLog(DEBUG, "[%s] Ogg sample rate: %i", fileName, info.sample_rate);
TraceLog(DEBUG, "[%s] Ogg channels: %i", fileName, info.channels);
int totalSamplesLength = (stb_vorbis_stream_length_in_samples(oggFile)*info.channels); int totalSamplesLength = (stb_vorbis_stream_length_in_samples(oggFile)*info.channels);
wave.dataSize = totalSamplesLength*sizeof(short); // Size must be in bytes
TraceLog(DEBUG, "[%s] Samples length: %i", fileName, totalSamplesLength);
float totalSeconds = stb_vorbis_stream_length_in_seconds(oggFile); float totalSeconds = stb_vorbis_stream_length_in_seconds(oggFile);
TraceLog(DEBUG, "[%s] Total seconds: %f", fileName, totalSeconds);
if (totalSeconds > 10) TraceLog(WARNING, "[%s] Ogg audio lenght is larger than 10 seconds (%f), that's a big file in memory, consider music streaming", fileName, totalSeconds); if (totalSeconds > 10) TraceLog(WARNING, "[%s] Ogg audio lenght is larger than 10 seconds (%f), that's a big file in memory, consider music streaming", fileName, totalSeconds);
int totalSamples = totalSeconds*info.sample_rate*info.channels; int totalSamples = totalSeconds*info.sample_rate*info.channels;
wave.sampleCount = totalSamples;
TraceLog(DEBUG, "[%s] Total samples calculated: %i", fileName, totalSamples); wave.data = (short *)malloc(totalSamplesLength*sizeof(short));
wave.data = malloc(sizeof(short)*totalSamplesLength); int samplesObtained = stb_vorbis_get_samples_short_interleaved(oggFile, info.channels, (short *)wave.data, totalSamplesLength);
int samplesObtained = stb_vorbis_get_samples_short_interleaved(oggFile, info.channels, wave.data, totalSamplesLength);
TraceLog(DEBUG, "[%s] Samples obtained: %i", fileName, samplesObtained); TraceLog(DEBUG, "[%s] Samples obtained: %i", fileName, samplesObtained);
TraceLog(INFO, "[%s] OGG file loaded successfully (SampleRate: %i, BitRate: %i, Channels: %i)", fileName, wave.sampleRate, wave.bitsPerSample, wave.channels); TraceLog(INFO, "[%s] OGG file loaded successfully (SampleRate: %i, SampleSize: %i, Channels: %i)", fileName, wave.sampleRate, wave.sampleSize, wave.channels);
stb_vorbis_close(oggFile); stb_vorbis_close(oggFile);
} }

View file

@ -68,11 +68,11 @@ typedef struct Sound {
// Wave type, defines audio wave data // Wave type, defines audio wave data
typedef struct Wave { typedef struct Wave {
unsigned int sampleCount; // Number of samples
unsigned int sampleRate; // Frequency (samples per second)
unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported)
unsigned int channels; // Number of channels (1-mono, 2-stereo)
void *data; // Buffer data pointer void *data; // Buffer data pointer
unsigned int dataSize; // Data size in bytes
unsigned int sampleRate; // Samples per second to be played
short bitsPerSample; // Sample size in bits
short channels;
} Wave; } Wave;
// Music type (file streaming from memory) // Music type (file streaming from memory)
@ -110,6 +110,7 @@ bool IsAudioDeviceReady(void); // Check if audi
Sound LoadSound(char *fileName); // Load sound to memory Sound LoadSound(char *fileName); // Load sound to memory
Sound LoadSoundFromWave(Wave wave); // Load sound to memory from wave data Sound LoadSoundFromWave(Wave wave); // Load sound to memory from wave data
Sound LoadSoundFromRES(const char *rresName, int resId); // Load sound to memory from rRES file (raylib Resource) Sound LoadSoundFromRES(const char *rresName, int resId); // Load sound to memory from rRES file (raylib Resource)
void UpdateSound(Sound sound, void *data, int numSamples); // Update sound buffer with new data
void UnloadSound(Sound sound); // Unload sound void UnloadSound(Sound sound); // Unload sound
void PlaySound(Sound sound); // Play a sound void PlaySound(Sound sound); // Play a sound
void PauseSound(Sound sound); // Pause a sound void PauseSound(Sound sound); // Pause a sound

View file

@ -348,7 +348,7 @@ void SetCameraMoveControls(int frontKey, int backKey, int leftKey, int rightKey,
} }
// Set camera mouse sensitivity (1st person and 3rd person cameras) // Set camera mouse sensitivity (1st person and 3rd person cameras)
void SetCameracameraMouseSensitivity(float sensitivity) void SetCameraMouseSensitivity(float sensitivity)
{ {
cameraMouseSensitivity = (sensitivity/10000.0f); cameraMouseSensitivity = (sensitivity/10000.0f);
} }

File diff suppressed because it is too large Load diff

View file

@ -81,12 +81,12 @@ void DrawCircle3D(Vector3 center, float radius, float rotationAngle, Vector3 rot
rlPushMatrix(); rlPushMatrix();
rlTranslatef(center.x, center.y, center.z); rlTranslatef(center.x, center.y, center.z);
rlRotatef(rotationAngle, rotation.x, rotation.y, rotation.z); rlRotatef(rotationAngle, rotation.x, rotation.y, rotation.z);
rlBegin(RL_LINES); rlBegin(RL_LINES);
for (int i = 0; i < 360; i += 10) for (int i = 0; i < 360; i += 10)
{ {
rlColor4ub(color.r, color.g, color.b, color.a); rlColor4ub(color.r, color.g, color.b, color.a);
rlVertex3f(sin(DEG2RAD*i)*radius, cos(DEG2RAD*i)*radius, 0.0f); rlVertex3f(sin(DEG2RAD*i)*radius, cos(DEG2RAD*i)*radius, 0.0f);
rlVertex3f(sin(DEG2RAD*(i + 10)) * radius, cos(DEG2RAD*(i + 10)) * radius, 0.0f); rlVertex3f(sin(DEG2RAD*(i + 10)) * radius, cos(DEG2RAD*(i + 10)) * radius, 0.0f);
} }
@ -583,13 +583,13 @@ void DrawLight(Light light)
DrawCircle3D(light->position, light->radius, 90.0f, (Vector3){ 0, 1, 0 }, (light->enabled ? light->diffuse : BLACK)); DrawCircle3D(light->position, light->radius, 90.0f, (Vector3){ 0, 1, 0 }, (light->enabled ? light->diffuse : BLACK));
} break; } break;
case LIGHT_DIRECTIONAL: case LIGHT_DIRECTIONAL:
{ {
DrawLine3D(light->position, light->target, (light->enabled ? light->diffuse : BLACK)); DrawLine3D(light->position, light->target, (light->enabled ? light->diffuse : BLACK));
DrawSphereWires(light->position, 0.3f*light->intensity, 4, 8, (light->enabled ? light->diffuse : BLACK)); DrawSphereWires(light->position, 0.3f*light->intensity, 4, 8, (light->enabled ? light->diffuse : BLACK));
DrawCubeWires(light->target, 0.3f, 0.3f, 0.3f, (light->enabled ? light->diffuse : BLACK)); DrawCubeWires(light->target, 0.3f, 0.3f, 0.3f, (light->enabled ? light->diffuse : BLACK));
} break; } break;
case LIGHT_SPOT: case LIGHT_SPOT:
{ {
DrawLine3D(light->position, light->target, (light->enabled ? light->diffuse : BLACK)); DrawLine3D(light->position, light->target, (light->enabled ? light->diffuse : BLACK));
DrawCylinderWires(light->position, 0.0f, 0.3f*light->coneAngle/50, 0.6f, 5, (light->enabled ? light->diffuse : BLACK)); DrawCylinderWires(light->position, 0.0f, 0.3f*light->coneAngle/50, 0.6f, 5, (light->enabled ? light->diffuse : BLACK));
DrawCubeWires(light->target, 0.3f, 0.3f, 0.3f, (light->enabled ? light->diffuse : BLACK)); DrawCubeWires(light->target, 0.3f, 0.3f, 0.3f, (light->enabled ? light->diffuse : BLACK));
@ -602,7 +602,7 @@ void DrawLight(Light light)
Model LoadModel(const char *fileName) Model LoadModel(const char *fileName)
{ {
Model model = { 0 }; Model model = { 0 };
// TODO: Initialize default data for model in case loading fails, maybe a cube? // TODO: Initialize default data for model in case loading fails, maybe a cube?
if (strcmp(GetExtension(fileName), "obj") == 0) model.mesh = LoadOBJ(fileName); if (strcmp(GetExtension(fileName), "obj") == 0) model.mesh = LoadOBJ(fileName);
@ -612,7 +612,7 @@ Model LoadModel(const char *fileName)
else else
{ {
rlglLoadMesh(&model.mesh, false); // Upload vertex data to GPU (static model) rlglLoadMesh(&model.mesh, false); // Upload vertex data to GPU (static model)
model.transform = MatrixIdentity(); model.transform = MatrixIdentity();
model.material = LoadDefaultMaterial(); model.material = LoadDefaultMaterial();
} }
@ -626,12 +626,12 @@ Model LoadModelEx(Mesh data, bool dynamic)
Model model = { 0 }; Model model = { 0 };
model.mesh = data; model.mesh = data;
rlglLoadMesh(&model.mesh, dynamic); // Upload vertex data to GPU rlglLoadMesh(&model.mesh, dynamic); // Upload vertex data to GPU
model.transform = MatrixIdentity(); model.transform = MatrixIdentity();
model.material = LoadDefaultMaterial(); model.material = LoadDefaultMaterial();
return model; return model;
} }
@ -723,11 +723,11 @@ Model LoadModelFromRES(const char *rresName, int resId)
Model LoadHeightmap(Image heightmap, Vector3 size) Model LoadHeightmap(Image heightmap, Vector3 size)
{ {
Model model = { 0 }; Model model = { 0 };
model.mesh = GenMeshHeightmap(heightmap, size); model.mesh = GenMeshHeightmap(heightmap, size);
rlglLoadMesh(&model.mesh, false); // Upload vertex data to GPU (static model) rlglLoadMesh(&model.mesh, false); // Upload vertex data to GPU (static model)
model.transform = MatrixIdentity(); model.transform = MatrixIdentity();
model.material = LoadDefaultMaterial(); model.material = LoadDefaultMaterial();
@ -738,11 +738,11 @@ Model LoadHeightmap(Image heightmap, Vector3 size)
Model LoadCubicmap(Image cubicmap) Model LoadCubicmap(Image cubicmap)
{ {
Model model = { 0 }; Model model = { 0 };
model.mesh = GenMeshCubicmap(cubicmap, (Vector3){ 1.0f, 1.5f, 1.0f }); model.mesh = GenMeshCubicmap(cubicmap, (Vector3){ 1.0f, 1.5f, 1.0f });
rlglLoadMesh(&model.mesh, false); // Upload vertex data to GPU (static model) rlglLoadMesh(&model.mesh, false); // Upload vertex data to GPU (static model)
model.transform = MatrixIdentity(); model.transform = MatrixIdentity();
model.material = LoadDefaultMaterial(); model.material = LoadDefaultMaterial();
@ -755,7 +755,7 @@ void UnloadModel(Model model)
rlglUnloadMesh(&model.mesh); rlglUnloadMesh(&model.mesh);
UnloadMaterial(model.material); UnloadMaterial(model.material);
TraceLog(INFO, "Unloaded model data from RAM and VRAM"); TraceLog(INFO, "Unloaded model data from RAM and VRAM");
} }
@ -763,10 +763,10 @@ void UnloadModel(Model model)
Material LoadMaterial(const char *fileName) Material LoadMaterial(const char *fileName)
{ {
Material material = { 0 }; Material material = { 0 };
if (strcmp(GetExtension(fileName), "mtl") == 0) material = LoadMTL(fileName); if (strcmp(GetExtension(fileName), "mtl") == 0) material = LoadMTL(fileName);
else TraceLog(WARNING, "[%s] Material extension not recognized, it can't be loaded", fileName); else TraceLog(WARNING, "[%s] Material extension not recognized, it can't be loaded", fileName);
return material; return material;
} }
@ -774,7 +774,7 @@ Material LoadMaterial(const char *fileName)
Material LoadDefaultMaterial(void) Material LoadDefaultMaterial(void)
{ {
Material material = { 0 }; Material material = { 0 };
material.shader = GetDefaultShader(); material.shader = GetDefaultShader();
material.texDiffuse = GetDefaultTexture(); // White texture (1x1 pixel) material.texDiffuse = GetDefaultTexture(); // White texture (1x1 pixel)
//material.texNormal; // NOTE: By default, not set //material.texNormal; // NOTE: By default, not set
@ -783,9 +783,9 @@ Material LoadDefaultMaterial(void)
material.colDiffuse = WHITE; // Diffuse color material.colDiffuse = WHITE; // Diffuse color
material.colAmbient = WHITE; // Ambient color material.colAmbient = WHITE; // Ambient color
material.colSpecular = WHITE; // Specular color material.colSpecular = WHITE; // Specular color
material.glossiness = 100.0f; // Glossiness level material.glossiness = 100.0f; // Glossiness level
return material; return material;
} }
@ -794,7 +794,7 @@ Material LoadDefaultMaterial(void)
Material LoadStandardMaterial(void) Material LoadStandardMaterial(void)
{ {
Material material = LoadDefaultMaterial(); Material material = LoadDefaultMaterial();
material.shader = GetStandardShader(); material.shader = GetStandardShader();
return material; return material;
@ -812,12 +812,12 @@ void UnloadMaterial(Material material)
static Mesh GenMeshHeightmap(Image heightmap, Vector3 size) static Mesh GenMeshHeightmap(Image heightmap, Vector3 size)
{ {
#define GRAY_VALUE(c) ((c.r+c.g+c.b)/3) #define GRAY_VALUE(c) ((c.r+c.g+c.b)/3)
Mesh mesh = { 0 }; Mesh mesh = { 0 };
int mapX = heightmap.width; int mapX = heightmap.width;
int mapZ = heightmap.height; int mapZ = heightmap.height;
Color *pixels = GetImageData(heightmap); Color *pixels = GetImageData(heightmap);
// NOTE: One vertex per pixel // NOTE: One vertex per pixel
@ -908,7 +908,7 @@ static Mesh GenMeshHeightmap(Image heightmap, Vector3 size)
trisCounter += 2; trisCounter += 2;
} }
} }
free(pixels); free(pixels);
return mesh; return mesh;
@ -919,7 +919,7 @@ static Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize)
Mesh mesh = { 0 }; Mesh mesh = { 0 };
Color *cubicmapPixels = GetImageData(cubicmap); Color *cubicmapPixels = GetImageData(cubicmap);
int mapWidth = cubicmap.width; int mapWidth = cubicmap.width;
int mapHeight = cubicmap.height; int mapHeight = cubicmap.height;
@ -966,14 +966,14 @@ static Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize)
for (int x = 0; x < mapWidth; ++x) for (int x = 0; x < mapWidth; ++x)
{ {
// Define the 8 vertex of the cube, we will combine them accordingly later... // Define the 8 vertex of the cube, we will combine them accordingly later...
Vector3 v1 = { w * (x - .5f), h2, h * (z - .5f) }; Vector3 v1 = { w*(x - 0.5f), h2, h*(z - 0.5f) };
Vector3 v2 = { w * (x - .5f), h2, h * (z + .5f) }; Vector3 v2 = { w*(x - 0.5f), h2, h*(z + 0.5f) };
Vector3 v3 = { w * (x + .5f), h2, h * (z + .5f) }; Vector3 v3 = { w*(x + 0.5f), h2, h*(z + 0.5f) };
Vector3 v4 = { w * (x + .5f), h2, h * (z - .5f) }; Vector3 v4 = { w*(x + 0.5f), h2, h*(z - 0.5f) };
Vector3 v5 = { w * (x + .5f), 0, h * (z - .5f) }; Vector3 v5 = { w*(x + 0.5f), 0, h*(z - 0.5f) };
Vector3 v6 = { w * (x - .5f), 0, h * (z - .5f) }; Vector3 v6 = { w*(x - 0.5f), 0, h*(z - 0.5f) };
Vector3 v7 = { w * (x - .5f), 0, h * (z + .5f) }; Vector3 v7 = { w*(x - 0.5f), 0, h*(z + 0.5f) };
Vector3 v8 = { w * (x + .5f), 0, h * (z + .5f) }; Vector3 v8 = { w*(x + 0.5f), 0, h*(z + 0.5f) };
// We check pixel color to be WHITE, we will full cubes // We check pixel color to be WHITE, we will full cubes
if ((cubicmapPixels[z*cubicmap.width + x].r == 255) && if ((cubicmapPixels[z*cubicmap.width + x].r == 255) &&
@ -1262,9 +1262,9 @@ static Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize)
free(mapVertices); free(mapVertices);
free(mapNormals); free(mapNormals);
free(mapTexcoords); free(mapTexcoords);
free(cubicmapPixels); // Free image pixel data free(cubicmapPixels); // Free image pixel data
return mesh; return mesh;
} }
@ -1273,7 +1273,7 @@ void DrawModel(Model model, Vector3 position, float scale, Color tint)
{ {
Vector3 vScale = { scale, scale, scale }; Vector3 vScale = { scale, scale, scale };
Vector3 rotationAxis = { 0.0f, 0.0f, 0.0f }; Vector3 rotationAxis = { 0.0f, 0.0f, 0.0f };
DrawModelEx(model, position, rotationAxis, 0.0f, vScale, tint); DrawModelEx(model, position, rotationAxis, 0.0f, vScale, tint);
} }
@ -1285,13 +1285,13 @@ void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rota
Matrix matRotation = MatrixRotate(rotationAxis, rotationAngle*DEG2RAD); Matrix matRotation = MatrixRotate(rotationAxis, rotationAngle*DEG2RAD);
Matrix matScale = MatrixScale(scale.x, scale.y, scale.z); Matrix matScale = MatrixScale(scale.x, scale.y, scale.z);
Matrix matTranslation = MatrixTranslate(position.x, position.y, position.z); Matrix matTranslation = MatrixTranslate(position.x, position.y, position.z);
// Combine model transformation matrix (model.transform) with matrix generated by function parameters (matTransform) // Combine model transformation matrix (model.transform) with matrix generated by function parameters (matTransform)
//Matrix matModel = MatrixMultiply(model.transform, matTransform); // Transform to world-space coordinates //Matrix matModel = MatrixMultiply(model.transform, matTransform); // Transform to world-space coordinates
model.transform = MatrixMultiply(MatrixMultiply(matScale, matRotation), matTranslation); model.transform = MatrixMultiply(MatrixMultiply(matScale, matRotation), matTranslation);
model.material.colDiffuse = tint; // TODO: Multiply tint color by diffuse color? model.material.colDiffuse = tint; // TODO: Multiply tint color by diffuse color?
rlglDrawMesh(model.mesh, model.material, model.transform); rlglDrawMesh(model.mesh, model.material, model.transform);
} }
@ -1299,9 +1299,9 @@ void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rota
void DrawModelWires(Model model, Vector3 position, float scale, Color tint) void DrawModelWires(Model model, Vector3 position, float scale, Color tint)
{ {
rlEnableWireMode(); rlEnableWireMode();
DrawModel(model, position, scale, tint); DrawModel(model, position, scale, tint);
rlDisableWireMode(); rlDisableWireMode();
} }
@ -1309,9 +1309,9 @@ void DrawModelWires(Model model, Vector3 position, float scale, Color tint)
void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint) void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint)
{ {
rlEnableWireMode(); rlEnableWireMode();
DrawModelEx(model, position, rotationAxis, rotationAngle, scale, tint); DrawModelEx(model, position, rotationAxis, rotationAngle, scale, tint);
rlDisableWireMode(); rlDisableWireMode();
} }
@ -1319,7 +1319,7 @@ void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float
void DrawBillboard(Camera camera, Texture2D texture, Vector3 center, float size, Color tint) void DrawBillboard(Camera camera, Texture2D texture, Vector3 center, float size, Color tint)
{ {
Rectangle sourceRec = { 0, 0, texture.width, texture.height }; Rectangle sourceRec = { 0, 0, texture.width, texture.height };
DrawBillboardRec(camera, texture, sourceRec, center, size, tint); DrawBillboardRec(camera, texture, sourceRec, center, size, tint);
} }
@ -1334,7 +1334,7 @@ void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRec, Vec
Vector3 right = { viewMatrix.m0, viewMatrix.m4, viewMatrix.m8 }; Vector3 right = { viewMatrix.m0, viewMatrix.m4, viewMatrix.m8 };
//Vector3 up = { viewMatrix.m1, viewMatrix.m5, viewMatrix.m9 }; //Vector3 up = { viewMatrix.m1, viewMatrix.m5, viewMatrix.m9 };
// NOTE: Billboard locked on axis-Y // NOTE: Billboard locked on axis-Y
Vector3 up = { 0.0f, 1.0f, 0.0f }; Vector3 up = { 0.0f, 1.0f, 0.0f };
/* /*
@ -1384,13 +1384,13 @@ void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRec, Vec
void DrawBoundingBox(BoundingBox box, Color color) void DrawBoundingBox(BoundingBox box, Color color)
{ {
Vector3 size; Vector3 size;
size.x = fabsf(box.max.x - box.min.x); size.x = fabsf(box.max.x - box.min.x);
size.y = fabsf(box.max.y - box.min.y); size.y = fabsf(box.max.y - box.min.y);
size.z = fabsf(box.max.z - box.min.z); size.z = fabsf(box.max.z - box.min.z);
Vector3 center = { box.min.x + size.x/2.0f, box.min.y + size.y/2.0f, box.min.z + size.z/2.0f }; Vector3 center = { box.min.x + size.x/2.0f, box.min.y + size.y/2.0f, box.min.z + size.z/2.0f };
DrawCubeWires(center, size.x, size.y, size.z, color); DrawCubeWires(center, size.x, size.y, size.z, color);
} }
@ -1451,14 +1451,14 @@ bool CheckCollisionBoxSphere(BoundingBox box, Vector3 centerSphere, float radius
bool CheckCollisionRaySphere(Ray ray, Vector3 spherePosition, float sphereRadius) bool CheckCollisionRaySphere(Ray ray, Vector3 spherePosition, float sphereRadius)
{ {
bool collision = false; bool collision = false;
Vector3 raySpherePos = VectorSubtract(spherePosition, ray.position); Vector3 raySpherePos = VectorSubtract(spherePosition, ray.position);
float distance = VectorLength(raySpherePos); float distance = VectorLength(raySpherePos);
float vector = VectorDotProduct(raySpherePos, ray.direction); float vector = VectorDotProduct(raySpherePos, ray.direction);
float d = sphereRadius*sphereRadius - (distance*distance - vector*vector); float d = sphereRadius*sphereRadius - (distance*distance - vector*vector);
if (d >= 0.0f) collision = true; if (d >= 0.0f) collision = true;
return collision; return collision;
} }
@ -1466,29 +1466,29 @@ bool CheckCollisionRaySphere(Ray ray, Vector3 spherePosition, float sphereRadius
bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphereRadius, Vector3 *collisionPoint) bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphereRadius, Vector3 *collisionPoint)
{ {
bool collision = false; bool collision = false;
Vector3 raySpherePos = VectorSubtract(spherePosition, ray.position); Vector3 raySpherePos = VectorSubtract(spherePosition, ray.position);
float distance = VectorLength(raySpherePos); float distance = VectorLength(raySpherePos);
float vector = VectorDotProduct(raySpherePos, ray.direction); float vector = VectorDotProduct(raySpherePos, ray.direction);
float d = sphereRadius*sphereRadius - (distance*distance - vector*vector); float d = sphereRadius*sphereRadius - (distance*distance - vector*vector);
if (d >= 0.0f) collision = true; if (d >= 0.0f) collision = true;
// Calculate collision point // Calculate collision point
Vector3 offset = ray.direction; Vector3 offset = ray.direction;
float collisionDistance = 0; float collisionDistance = 0;
// Check if ray origin is inside the sphere to calculate the correct collision point // Check if ray origin is inside the sphere to calculate the correct collision point
if (distance < sphereRadius) collisionDistance = vector + sqrt(d); if (distance < sphereRadius) collisionDistance = vector + sqrt(d);
else collisionDistance = vector - sqrt(d); else collisionDistance = vector - sqrt(d);
VectorScale(&offset, collisionDistance); VectorScale(&offset, collisionDistance);
Vector3 cPoint = VectorAdd(ray.position, offset); Vector3 cPoint = VectorAdd(ray.position, offset);
collisionPoint->x = cPoint.x; collisionPoint->x = cPoint.x;
collisionPoint->y = cPoint.y; collisionPoint->y = cPoint.y;
collisionPoint->z = cPoint.z; collisionPoint->z = cPoint.z;
return collision; return collision;
} }
@ -1496,7 +1496,7 @@ bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphereRadi
bool CheckCollisionRayBox(Ray ray, BoundingBox box) bool CheckCollisionRayBox(Ray ray, BoundingBox box)
{ {
bool collision = false; bool collision = false;
float t[8]; float t[8];
t[0] = (box.min.x - ray.position.x)/ray.direction.x; t[0] = (box.min.x - ray.position.x)/ray.direction.x;
t[1] = (box.max.x - ray.position.x)/ray.direction.x; t[1] = (box.max.x - ray.position.x)/ray.direction.x;
@ -1506,9 +1506,9 @@ bool CheckCollisionRayBox(Ray ray, BoundingBox box)
t[5] = (box.max.z - ray.position.z)/ray.direction.z; t[5] = (box.max.z - ray.position.z)/ray.direction.z;
t[6] = fmax(fmax(fmin(t[0], t[1]), fmin(t[2], t[3])), fmin(t[4], t[5])); t[6] = fmax(fmax(fmin(t[0], t[1]), fmin(t[2], t[3])), fmin(t[4], t[5]));
t[7] = fmin(fmin(fmax(t[0], t[1]), fmax(t[2], t[3])), fmax(t[4], t[5])); t[7] = fmin(fmin(fmax(t[0], t[1]), fmax(t[2], t[3])), fmax(t[4], t[5]));
collision = !(t[7] < 0 || t[6] > t[7]); collision = !(t[7] < 0 || t[6] > t[7]);
return collision; return collision;
} }
@ -1524,19 +1524,19 @@ BoundingBox CalculateBoundingBox(Mesh mesh)
{ {
minVertex = (Vector3){ mesh.vertices[0], mesh.vertices[1], mesh.vertices[2] }; minVertex = (Vector3){ mesh.vertices[0], mesh.vertices[1], mesh.vertices[2] };
maxVertex = (Vector3){ mesh.vertices[0], mesh.vertices[1], mesh.vertices[2] }; maxVertex = (Vector3){ mesh.vertices[0], mesh.vertices[1], mesh.vertices[2] };
for (int i = 1; i < mesh.vertexCount; i++) for (int i = 1; i < mesh.vertexCount; i++)
{ {
minVertex = VectorMin(minVertex, (Vector3){ mesh.vertices[i*3], mesh.vertices[i*3 + 1], mesh.vertices[i*3 + 2] }); minVertex = VectorMin(minVertex, (Vector3){ mesh.vertices[i*3], mesh.vertices[i*3 + 1], mesh.vertices[i*3 + 2] });
maxVertex = VectorMax(maxVertex, (Vector3){ mesh.vertices[i*3], mesh.vertices[i*3 + 1], mesh.vertices[i*3 + 2] }); maxVertex = VectorMax(maxVertex, (Vector3){ mesh.vertices[i*3], mesh.vertices[i*3 + 1], mesh.vertices[i*3 + 2] });
} }
} }
// Create the bounding box // Create the bounding box
BoundingBox box; BoundingBox box;
box.min = minVertex; box.min = minVertex;
box.max = maxVertex; box.max = maxVertex;
return box; return box;
} }
@ -1546,9 +1546,9 @@ BoundingBox CalculateBoundingBox(Mesh mesh)
Vector3 ResolveCollisionCubicmap(Image cubicmap, Vector3 mapPosition, Vector3 *playerPosition, float radius) Vector3 ResolveCollisionCubicmap(Image cubicmap, Vector3 mapPosition, Vector3 *playerPosition, float radius)
{ {
#define CUBIC_MAP_HALF_BLOCK_SIZE 0.5 #define CUBIC_MAP_HALF_BLOCK_SIZE 0.5
Color *cubicmapPixels = GetImageData(cubicmap); Color *cubicmapPixels = GetImageData(cubicmap);
// Detect the cell where the player is located // Detect the cell where the player is located
Vector3 impactDirection = { 0.0f, 0.0f, 0.0f }; Vector3 impactDirection = { 0.0f, 0.0f, 0.0f };
@ -1784,7 +1784,7 @@ Vector3 ResolveCollisionCubicmap(Image cubicmap, Vector3 mapPosition, Vector3 *p
playerPosition->y = (1.5f - radius) - 0.01f; playerPosition->y = (1.5f - radius) - 0.01f;
impactDirection = (Vector3) { impactDirection.x, 1, impactDirection.z}; impactDirection = (Vector3) { impactDirection.x, 1, impactDirection.z};
} }
free(cubicmapPixels); free(cubicmapPixels);
return impactDirection; return impactDirection;
@ -2048,9 +2048,9 @@ static Mesh LoadOBJ(const char *fileName)
static Material LoadMTL(const char *fileName) static Material LoadMTL(const char *fileName)
{ {
#define MAX_BUFFER_SIZE 128 #define MAX_BUFFER_SIZE 128
Material material = { 0 }; // LoadDefaultMaterial(); Material material = { 0 }; // LoadDefaultMaterial();
char buffer[MAX_BUFFER_SIZE]; char buffer[MAX_BUFFER_SIZE];
Vector3 color = { 1.0f, 1.0f, 1.0f }; Vector3 color = { 1.0f, 1.0f, 1.0f };
char *mapFileName = NULL; char *mapFileName = NULL;
@ -2068,14 +2068,14 @@ static Material LoadMTL(const char *fileName)
while (!feof(mtlFile)) while (!feof(mtlFile))
{ {
fgets(buffer, MAX_BUFFER_SIZE, mtlFile); fgets(buffer, MAX_BUFFER_SIZE, mtlFile);
switch (buffer[0]) switch (buffer[0])
{ {
case 'n': // newmtl string Material name. Begins a new material description. case 'n': // newmtl string Material name. Begins a new material description.
{ {
// TODO: Support multiple materials in a single .mtl // TODO: Support multiple materials in a single .mtl
sscanf(buffer, "newmtl %s", mapFileName); sscanf(buffer, "newmtl %s", mapFileName);
TraceLog(INFO, "[%s] Loading material...", mapFileName); TraceLog(INFO, "[%s] Loading material...", mapFileName);
} }
case 'i': // illum int Illumination model case 'i': // illum int Illumination model
@ -2122,7 +2122,7 @@ static Material LoadMTL(const char *fileName)
{ {
int shininess = 0; int shininess = 0;
sscanf(buffer, "Ns %i", &shininess); sscanf(buffer, "Ns %i", &shininess);
material.glossiness = (float)shininess; material.glossiness = (float)shininess;
} }
else if (buffer[1] == 'i') // Ni int Refraction index. else if (buffer[1] == 'i') // Ni int Refraction index.
@ -2191,7 +2191,7 @@ static Material LoadMTL(const char *fileName)
float ialpha = 0.0f; float ialpha = 0.0f;
sscanf(buffer, "Tr %f", &ialpha); sscanf(buffer, "Tr %f", &ialpha);
material.colDiffuse.a = (unsigned char)((1.0f - ialpha)*255); material.colDiffuse.a = (unsigned char)((1.0f - ialpha)*255);
} break; } break;
case 'r': // refl string Reflection texture map case 'r': // refl string Reflection texture map
default: break; default: break;
@ -2202,6 +2202,6 @@ static Material LoadMTL(const char *fileName)
// NOTE: At this point we have all material data // NOTE: At this point we have all material data
TraceLog(INFO, "[%s] Material loaded successfully", fileName); TraceLog(INFO, "[%s] Material loaded successfully", fileName);
return material; return material;
} }

View file

@ -81,6 +81,14 @@
typedef struct android_app; // Define android_app struct (android_native_app_glue.h) typedef struct android_app; // Define android_app struct (android_native_app_glue.h)
#endif #endif
#if defined(_WIN32) && defined(BUILDING_DLL)
#define RLAPI __declspec(dllexport) // We are building raylib as a Win32 DLL
#elif defined(_WIN32) && defined(RAYLIB_DLL)
#define RLAPI __declspec(dllimport) // We are using raylib as a Win32 DLL
#else
#define RLAPI // We are building or using raylib as a static library (or Linux shared library)
#endif
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Some basic Defines // Some basic Defines
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
@ -478,15 +486,16 @@ typedef struct Ray {
typedef struct Sound { typedef struct Sound {
unsigned int source; // OpenAL audio source id unsigned int source; // OpenAL audio source id
unsigned int buffer; // OpenAL audio buffer id unsigned int buffer; // OpenAL audio buffer id
int format; // OpenAL audio format specifier
} Sound; } Sound;
// Wave type, defines audio wave data // Wave type, defines audio wave data
typedef struct Wave { typedef struct Wave {
unsigned int sampleCount; // Number of samples
unsigned int sampleRate; // Frequency (samples per second)
unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported)
unsigned int channels; // Number of channels (1-mono, 2-stereo)
void *data; // Buffer data pointer void *data; // Buffer data pointer
unsigned int dataSize; // Data size in bytes
unsigned int sampleRate; // Samples per second to be played
short bitsPerSample; // Sample size in bits
short channels;
} Wave; } Wave;
// Music type (file streaming from memory) // Music type (file streaming from memory)
@ -576,94 +585,94 @@ extern "C" { // Prevents name mangling of functions
// Window and Graphics Device Functions (Module: core) // Window and Graphics Device Functions (Module: core)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
#if defined(PLATFORM_ANDROID) #if defined(PLATFORM_ANDROID)
void InitWindow(int width, int height, struct android_app *state); // Init Android Activity and OpenGL Graphics RLAPI void InitWindow(int width, int height, struct android_app *state); // Init Android Activity and OpenGL Graphics
#elif defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) #elif defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB)
void InitWindow(int width, int height, const char *title); // Initialize Window and OpenGL Graphics RLAPI void InitWindow(int width, int height, const char *title); // Initialize Window and OpenGL Graphics
#endif #endif
void CloseWindow(void); // Close Window and Terminate Context RLAPI void CloseWindow(void); // Close Window and Terminate Context
bool WindowShouldClose(void); // Detect if KEY_ESCAPE pressed or Close icon pressed RLAPI bool WindowShouldClose(void); // Detect if KEY_ESCAPE pressed or Close icon pressed
bool IsWindowMinimized(void); // Detect if window has been minimized (or lost focus) RLAPI bool IsWindowMinimized(void); // Detect if window has been minimized (or lost focus)
void ToggleFullscreen(void); // Fullscreen toggle (only PLATFORM_DESKTOP) RLAPI void ToggleFullscreen(void); // Fullscreen toggle (only PLATFORM_DESKTOP)
int GetScreenWidth(void); // Get current screen width RLAPI int GetScreenWidth(void); // Get current screen width
int GetScreenHeight(void); // Get current screen height RLAPI int GetScreenHeight(void); // Get current screen height
void ShowCursor(void); // Shows cursor RLAPI void ShowCursor(void); // Shows cursor
void HideCursor(void); // Hides cursor RLAPI void HideCursor(void); // Hides cursor
bool IsCursorHidden(void); // Returns true if cursor is not visible RLAPI bool IsCursorHidden(void); // Returns true if cursor is not visible
void EnableCursor(void); // Enables cursor RLAPI void EnableCursor(void); // Enables cursor
void DisableCursor(void); // Disables cursor RLAPI void DisableCursor(void); // Disables cursor
void ClearBackground(Color color); // Sets Background Color RLAPI void ClearBackground(Color color); // Sets Background Color
void BeginDrawing(void); // Setup drawing canvas to start drawing RLAPI void BeginDrawing(void); // Setup drawing canvas to start drawing
void EndDrawing(void); // End canvas drawing and Swap Buffers (Double Buffering) RLAPI void EndDrawing(void); // End canvas drawing and Swap Buffers (Double Buffering)
void Begin2dMode(Camera2D camera); // Initialize 2D mode with custom camera RLAPI void Begin2dMode(Camera2D camera); // Initialize 2D mode with custom camera
void End2dMode(void); // Ends 2D mode custom camera usage RLAPI void End2dMode(void); // Ends 2D mode custom camera usage
void Begin3dMode(Camera camera); // Initializes 3D mode for drawing (Camera setup) RLAPI void Begin3dMode(Camera camera); // Initializes 3D mode for drawing (Camera setup)
void End3dMode(void); // Ends 3D mode and returns to default 2D orthographic mode RLAPI void End3dMode(void); // Ends 3D mode and returns to default 2D orthographic mode
void BeginTextureMode(RenderTexture2D target); // Initializes render texture for drawing RLAPI void BeginTextureMode(RenderTexture2D target); // Initializes render texture for drawing
void EndTextureMode(void); // Ends drawing to render texture RLAPI void EndTextureMode(void); // Ends drawing to render texture
Ray GetMouseRay(Vector2 mousePosition, Camera camera); // Returns a ray trace from mouse position RLAPI Ray GetMouseRay(Vector2 mousePosition, Camera camera); // Returns a ray trace from mouse position
Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Returns the screen space position from a 3d world space position RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Returns the screen space position from a 3d world space position
Matrix GetCameraMatrix(Camera camera); // Returns camera transform matrix (view matrix) RLAPI Matrix GetCameraMatrix(Camera camera); // Returns camera transform matrix (view matrix)
void SetTargetFPS(int fps); // Set target FPS (maximum) RLAPI void SetTargetFPS(int fps); // Set target FPS (maximum)
float GetFPS(void); // Returns current FPS RLAPI float GetFPS(void); // Returns current FPS
float GetFrameTime(void); // Returns time in seconds for one frame RLAPI float GetFrameTime(void); // Returns time in seconds for one frame
Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value RLAPI Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value
int GetHexValue(Color color); // Returns hexadecimal value for a Color RLAPI int GetHexValue(Color color); // Returns hexadecimal value for a Color
float *ColorToFloat(Color color); // Converts Color to float array and normalizes RLAPI float *ColorToFloat(Color color); // Converts Color to float array and normalizes
float *VectorToFloat(Vector3 vec); // Converts Vector3 to float array RLAPI float *VectorToFloat(Vector3 vec); // Converts Vector3 to float array
float *MatrixToFloat(Matrix mat); // Converts Matrix to float array RLAPI float *MatrixToFloat(Matrix mat); // Converts Matrix to float array
int GetRandomValue(int min, int max); // Returns a random value between min and max (both included) RLAPI int GetRandomValue(int min, int max); // Returns a random value between min and max (both included)
Color Fade(Color color, float alpha); // Color fade-in or fade-out, alpha goes from 0.0f to 1.0f RLAPI Color Fade(Color color, float alpha); // Color fade-in or fade-out, alpha goes from 0.0f to 1.0f
void SetConfigFlags(char flags); // Setup some window configuration flags RLAPI void SetConfigFlags(char flags); // Setup some window configuration flags
void ShowLogo(void); // Activates raylib logo at startup (can be done with flags) RLAPI void ShowLogo(void); // Activates raylib logo at startup (can be done with flags)
bool IsFileDropped(void); // Check if a file have been dropped into window RLAPI bool IsFileDropped(void); // Check if a file have been dropped into window
char **GetDroppedFiles(int *count); // Retrieve dropped files into window RLAPI char **GetDroppedFiles(int *count); // Retrieve dropped files into window
void ClearDroppedFiles(void); // Clear dropped files paths buffer RLAPI void ClearDroppedFiles(void); // Clear dropped files paths buffer
void StorageSaveValue(int position, int value); // Storage save integer value (to defined position) RLAPI void StorageSaveValue(int position, int value); // Storage save integer value (to defined position)
int StorageLoadValue(int position); // Storage load integer value (from defined position) RLAPI int StorageLoadValue(int position); // Storage load integer value (from defined position)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Input Handling Functions (Module: core) // Input Handling Functions (Module: core)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB)
bool IsKeyPressed(int key); // Detect if a key has been pressed once RLAPI bool IsKeyPressed(int key); // Detect if a key has been pressed once
bool IsKeyDown(int key); // Detect if a key is being pressed RLAPI bool IsKeyDown(int key); // Detect if a key is being pressed
bool IsKeyReleased(int key); // Detect if a key has been released once RLAPI bool IsKeyReleased(int key); // Detect if a key has been released once
bool IsKeyUp(int key); // Detect if a key is NOT being pressed RLAPI bool IsKeyUp(int key); // Detect if a key is NOT being pressed
int GetKeyPressed(void); // Get latest key pressed RLAPI int GetKeyPressed(void); // Get latest key pressed
void SetExitKey(int key); // Set a custom key to exit program (default is ESC) RLAPI void SetExitKey(int key); // Set a custom key to exit program (default is ESC)
bool IsGamepadAvailable(int gamepad); // Detect if a gamepad is available RLAPI bool IsGamepadAvailable(int gamepad); // Detect if a gamepad is available
float GetGamepadAxisMovement(int gamepad, int axis); // Return axis movement value for a gamepad axis RLAPI float GetGamepadAxisMovement(int gamepad, int axis); // Return axis movement value for a gamepad axis
bool IsGamepadButtonPressed(int gamepad, int button); // Detect if a gamepad button has been pressed once RLAPI bool IsGamepadButtonPressed(int gamepad, int button); // Detect if a gamepad button has been pressed once
bool IsGamepadButtonDown(int gamepad, int button); // Detect if a gamepad button is being pressed RLAPI bool IsGamepadButtonDown(int gamepad, int button); // Detect if a gamepad button is being pressed
bool IsGamepadButtonReleased(int gamepad, int button); // Detect if a gamepad button has been released once RLAPI bool IsGamepadButtonReleased(int gamepad, int button); // Detect if a gamepad button has been released once
bool IsGamepadButtonUp(int gamepad, int button); // Detect if a gamepad button is NOT being pressed RLAPI bool IsGamepadButtonUp(int gamepad, int button); // Detect if a gamepad button is NOT being pressed
#endif #endif
bool IsMouseButtonPressed(int button); // Detect if a mouse button has been pressed once RLAPI bool IsMouseButtonPressed(int button); // Detect if a mouse button has been pressed once
bool IsMouseButtonDown(int button); // Detect if a mouse button is being pressed RLAPI bool IsMouseButtonDown(int button); // Detect if a mouse button is being pressed
bool IsMouseButtonReleased(int button); // Detect if a mouse button has been released once RLAPI bool IsMouseButtonReleased(int button); // Detect if a mouse button has been released once
bool IsMouseButtonUp(int button); // Detect if a mouse button is NOT being pressed RLAPI bool IsMouseButtonUp(int button); // Detect if a mouse button is NOT being pressed
int GetMouseX(void); // Returns mouse position X RLAPI int GetMouseX(void); // Returns mouse position X
int GetMouseY(void); // Returns mouse position Y RLAPI int GetMouseY(void); // Returns mouse position Y
Vector2 GetMousePosition(void); // Returns mouse position XY RLAPI Vector2 GetMousePosition(void); // Returns mouse position XY
void SetMousePosition(Vector2 position); // Set mouse position XY RLAPI void SetMousePosition(Vector2 position); // Set mouse position XY
int GetMouseWheelMove(void); // Returns mouse wheel movement Y RLAPI int GetMouseWheelMove(void); // Returns mouse wheel movement Y
int GetTouchX(void); // Returns touch position X for touch point 0 (relative to screen size) RLAPI int GetTouchX(void); // Returns touch position X for touch point 0 (relative to screen size)
int GetTouchY(void); // Returns touch position Y for touch point 0 (relative to screen size) RLAPI int GetTouchY(void); // Returns touch position Y for touch point 0 (relative to screen size)
Vector2 GetTouchPosition(int index); // Returns touch position XY for a touch point index (relative to screen size) RLAPI Vector2 GetTouchPosition(int index); // Returns touch position XY for a touch point index (relative to screen size)
#if defined(PLATFORM_ANDROID) #if defined(PLATFORM_ANDROID)
bool IsButtonPressed(int button); // Detect if an android physic button has been pressed bool IsButtonPressed(int button); // Detect if an android physic button has been pressed
@ -674,264 +683,265 @@ bool IsButtonReleased(int button); // Detect if an android
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Gestures and Touch Handling Functions (Module: gestures) // Gestures and Touch Handling Functions (Module: gestures)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void SetGesturesEnabled(unsigned int gestureFlags); // Enable a set of gestures using flags RLAPI void SetGesturesEnabled(unsigned int gestureFlags); // Enable a set of gestures using flags
bool IsGestureDetected(int gesture); // Check if a gesture have been detected RLAPI bool IsGestureDetected(int gesture); // Check if a gesture have been detected
int GetGestureDetected(void); // Get latest detected gesture RLAPI int GetGestureDetected(void); // Get latest detected gesture
int GetTouchPointsCount(void); // Get touch points count RLAPI int GetTouchPointsCount(void); // Get touch points count
float GetGestureHoldDuration(void); // Get gesture hold time in milliseconds RLAPI float GetGestureHoldDuration(void); // Get gesture hold time in milliseconds
Vector2 GetGestureDragVector(void); // Get gesture drag vector RLAPI Vector2 GetGestureDragVector(void); // Get gesture drag vector
float GetGestureDragAngle(void); // Get gesture drag angle RLAPI float GetGestureDragAngle(void); // Get gesture drag angle
Vector2 GetGesturePinchVector(void); // Get gesture pinch delta RLAPI Vector2 GetGesturePinchVector(void); // Get gesture pinch delta
float GetGesturePinchAngle(void); // Get gesture pinch angle RLAPI float GetGesturePinchAngle(void); // Get gesture pinch angle
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Camera System Functions (Module: camera) // Camera System Functions (Module: camera)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void SetCameraMode(int mode); // Set camera mode (multiple camera modes available) RLAPI void SetCameraMode(int mode); // Set camera mode (multiple camera modes available)
void UpdateCamera(Camera *camera); // Update camera (player position is ignored) RLAPI void UpdateCamera(Camera *camera); // Update camera (player position is ignored)
void UpdateCameraPlayer(Camera *camera, Vector3 *position); // Update camera and player position (1st person and 3rd person cameras) RLAPI void UpdateCameraPlayer(Camera *camera, Vector3 *position); // Update camera and player position (1st person and 3rd person cameras)
void SetCameraPosition(Vector3 position); // Set internal camera position RLAPI void SetCameraPosition(Vector3 position); // Set internal camera position
void SetCameraTarget(Vector3 target); // Set internal camera target RLAPI void SetCameraTarget(Vector3 target); // Set internal camera target
void SetCameraFovy(float fovy); // Set internal camera field-of-view-y RLAPI void SetCameraFovy(float fovy); // Set internal camera field-of-view-y
void SetCameraPanControl(int panKey); // Set camera pan key to combine with mouse movement (free camera) RLAPI void SetCameraPanControl(int panKey); // Set camera pan key to combine with mouse movement (free camera)
void SetCameraAltControl(int altKey); // Set camera alt key to combine with mouse movement (free camera) RLAPI void SetCameraAltControl(int altKey); // Set camera alt key to combine with mouse movement (free camera)
void SetCameraSmoothZoomControl(int szKey); // Set camera smooth zoom key to combine with mouse (free camera) RLAPI void SetCameraSmoothZoomControl(int szKey); // Set camera smooth zoom key to combine with mouse (free camera)
void SetCameraMoveControls(int frontKey, int backKey, RLAPI void SetCameraMoveControls(int frontKey, int backKey,
int leftKey, int rightKey, int leftKey, int rightKey,
int upKey, int downKey); // Set camera move controls (1st person and 3rd person cameras) int upKey, int downKey); // Set camera move controls (1st person and 3rd person cameras)
void SetCameraMouseSensitivity(float sensitivity); // Set camera mouse sensitivity (1st person and 3rd person cameras) RLAPI void SetCameraMouseSensitivity(float sensitivity); // Set camera mouse sensitivity (1st person and 3rd person cameras)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Basic Shapes Drawing Functions (Module: shapes) // Basic Shapes Drawing Functions (Module: shapes)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void DrawPixel(int posX, int posY, Color color); // Draw a pixel RLAPI void DrawPixel(int posX, int posY, Color color); // Draw a pixel
void DrawPixelV(Vector2 position, Color color); // Draw a pixel (Vector version) RLAPI 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 RLAPI 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) RLAPI 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 RLAPI 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 RLAPI 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) RLAPI 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 RLAPI 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 RLAPI 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 RLAPI 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 RLAPI 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) RLAPI 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 RLAPI 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 RLAPI 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 RLAPI void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline
void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a regular polygon (Vector version) RLAPI void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a regular polygon (Vector version)
void DrawPolyEx(Vector2 *points, int numPoints, Color color); // Draw a closed polygon defined by points RLAPI void DrawPolyEx(Vector2 *points, int numPoints, Color color); // Draw a closed polygon defined by points
void DrawPolyExLines(Vector2 *points, int numPoints, Color color); // Draw polygon lines RLAPI void DrawPolyExLines(Vector2 *points, int numPoints, Color color); // Draw polygon lines
bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles RLAPI bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles
bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles RLAPI bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles
bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec); // Check collision between circle and rectangle RLAPI bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec); // Check collision between circle and rectangle
Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision
bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle RLAPI bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle
bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle RLAPI bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle
bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle RLAPI bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Texture Loading and Drawing Functions (Module: textures) // Texture Loading and Drawing Functions (Module: textures)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
Image LoadImage(const char *fileName); // Load an image into CPU memory (RAM) RLAPI Image LoadImage(const char *fileName); // Load an image into CPU memory (RAM)
Image LoadImageEx(Color *pixels, int width, int height); // Load image data from Color array data (RGBA - 32bit) RLAPI Image LoadImageEx(Color *pixels, int width, int height); // Load image data from Color array data (RGBA - 32bit)
Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image data from RAW file RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image data from RAW file
Image LoadImageFromRES(const char *rresName, int resId); // Load an image from rRES file (raylib Resource) RLAPI Image LoadImageFromRES(const char *rresName, int resId); // Load an image from rRES file (raylib Resource)
Texture2D LoadTexture(const char *fileName); // Load an image as texture into GPU memory RLAPI Texture2D LoadTexture(const char *fileName); // Load an image as texture into GPU memory
Texture2D LoadTextureEx(void *data, int width, int height, int textureFormat); // Load a texture from raw data into GPU memory RLAPI Texture2D LoadTextureEx(void *data, int width, int height, int textureFormat); // Load a texture from raw data into GPU memory
Texture2D LoadTextureFromRES(const char *rresName, int resId); // Load an image as texture from rRES file (raylib Resource) RLAPI Texture2D LoadTextureFromRES(const char *rresName, int resId); // Load an image as texture from rRES file (raylib Resource)
Texture2D LoadTextureFromImage(Image image); // Load a texture from image data RLAPI Texture2D LoadTextureFromImage(Image image); // Load a texture from image data
RenderTexture2D LoadRenderTexture(int width, int height); // Load a texture to be used for rendering RLAPI RenderTexture2D LoadRenderTexture(int width, int height); // Load a texture to be used for rendering
void UnloadImage(Image image); // Unload image from CPU memory (RAM) RLAPI void UnloadImage(Image image); // Unload image from CPU memory (RAM)
void UnloadTexture(Texture2D texture); // Unload texture from GPU memory RLAPI void UnloadTexture(Texture2D texture); // Unload texture from GPU memory
void UnloadRenderTexture(RenderTexture2D target); // Unload render texture from GPU memory RLAPI void UnloadRenderTexture(RenderTexture2D target); // Unload render texture from GPU memory
Color *GetImageData(Image image); // Get pixel data from image as a Color struct array RLAPI Color *GetImageData(Image image); // Get pixel data from image as a Color struct array
Image GetTextureData(Texture2D texture); // Get pixel data from GPU texture and return an Image RLAPI Image GetTextureData(Texture2D texture); // Get pixel data from GPU texture and return an Image
void ImageToPOT(Image *image, Color fillColor); // Convert image to POT (power-of-two) RLAPI void ImageToPOT(Image *image, Color fillColor); // Convert image to POT (power-of-two)
void ImageFormat(Image *image, int newFormat); // Convert image data to desired format RLAPI void ImageFormat(Image *image, int newFormat); // Convert image data to desired format
void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering)
Image ImageCopy(Image image); // Create an image duplicate (useful for transformations) RLAPI Image ImageCopy(Image image); // Create an image duplicate (useful for transformations)
void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle RLAPI void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle
void ImageResize(Image *image, int newWidth, int newHeight); // Resize and image (bilinear filtering) RLAPI void ImageResize(Image *image, int newWidth, int newHeight); // Resize and image (bilinear filtering)
void ImageResizeNN(Image *image,int newWidth,int newHeight); // Resize and image (Nearest-Neighbor scaling algorithm) RLAPI void ImageResizeNN(Image *image,int newWidth,int newHeight); // Resize and image (Nearest-Neighbor scaling algorithm)
Image ImageText(const char *text, int fontSize, Color color); // Create an image from text (default font) RLAPI Image ImageText(const char *text, int fontSize, Color color); // Create an image from text (default font)
Image ImageTextEx(SpriteFont font, const char *text, float fontSize, int spacing, Color tint); // Create an image from text (custom sprite font) RLAPI Image ImageTextEx(SpriteFont font, const char *text, float fontSize, int spacing, Color tint); // Create an image from text (custom sprite font)
void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec); // Draw a source image within a destination image RLAPI void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec); // Draw a source image within a destination image
void ImageDrawText(Image *dst, Vector2 position, const char *text, int fontSize, Color color); // Draw text (default font) within an image (destination) RLAPI void ImageDrawText(Image *dst, Vector2 position, const char *text, int fontSize, Color color); // Draw text (default font) within an image (destination)
void ImageDrawTextEx(Image *dst, Vector2 position, SpriteFont font, const char *text, float fontSize, int spacing, Color color); // Draw text (custom sprite font) within an image (destination) RLAPI void ImageDrawTextEx(Image *dst, Vector2 position, SpriteFont font, const char *text, float fontSize, int spacing, Color color); // Draw text (custom sprite font) within an image (destination)
void ImageFlipVertical(Image *image); // Flip image vertically RLAPI void ImageFlipVertical(Image *image); // Flip image vertically
void ImageFlipHorizontal(Image *image); // Flip image horizontally RLAPI void ImageFlipHorizontal(Image *image); // Flip image horizontally
void ImageColorTint(Image *image, Color color); // Modify image color: tint RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint
void ImageColorInvert(Image *image); // Modify image color: invert RLAPI void ImageColorInvert(Image *image); // Modify image color: invert
void ImageColorGrayscale(Image *image); // Modify image color: grayscale RLAPI void ImageColorGrayscale(Image *image); // Modify image color: grayscale
void ImageColorContrast(Image *image, float contrast); // Modify image color: contrast (-100 to 100) RLAPI void ImageColorContrast(Image *image, float contrast); // Modify image color: contrast (-100 to 100)
void ImageColorBrightness(Image *image, int brightness); // Modify image color: brightness (-255 to 255) RLAPI void ImageColorBrightness(Image *image, int brightness); // Modify image color: brightness (-255 to 255)
void GenTextureMipmaps(Texture2D texture); // Generate GPU mipmaps for a texture RLAPI void GenTextureMipmaps(Texture2D texture); // Generate GPU mipmaps for a texture
void UpdateTexture(Texture2D texture, void *pixels); // Update GPU texture with new data RLAPI void UpdateTexture(Texture2D texture, void *pixels); // Update GPU texture with new data
void DrawTexture(Texture2D texture, int posX, int posY, Color tint); // Draw a Texture2D RLAPI void DrawTexture(Texture2D texture, int posX, int posY, Color tint); // Draw a Texture2D
void DrawTextureV(Texture2D texture, Vector2 position, Color tint); // Draw a Texture2D with position defined as Vector2 RLAPI void DrawTextureV(Texture2D texture, Vector2 position, Color tint); // Draw a Texture2D with position defined as Vector2
void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint); // Draw a Texture2D with extended parameters RLAPI 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, Color tint); // Draw a part of a texture defined by a rectangle RLAPI void DrawTextureRec(Texture2D texture, Rectangle sourceRec, Vector2 position, Color tint); // Draw a part of a texture defined by a rectangle
void DrawTexturePro(Texture2D texture, Rectangle sourceRec, Rectangle destRec, Vector2 origin, // Draw a part of a texture defined by a rectangle with 'pro' parameters RLAPI void DrawTexturePro(Texture2D texture, Rectangle sourceRec, Rectangle destRec, Vector2 origin, // Draw a part of a texture defined by a rectangle with 'pro' parameters
float rotation, Color tint); float rotation, Color tint);
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Font Loading and Text Drawing Functions (Module: text) // Font Loading and Text Drawing Functions (Module: text)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
SpriteFont GetDefaultFont(void); // Get the default SpriteFont RLAPI SpriteFont GetDefaultFont(void); // Get the default SpriteFont
SpriteFont LoadSpriteFont(const char *fileName); // Load a SpriteFont image into GPU memory RLAPI SpriteFont LoadSpriteFont(const char *fileName); // Load a SpriteFont image into GPU memory
void UnloadSpriteFont(SpriteFont spriteFont); // Unload SpriteFont from GPU memory RLAPI void UnloadSpriteFont(SpriteFont spriteFont); // Unload SpriteFont from GPU memory
void DrawText(const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) RLAPI void DrawText(const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font)
void DrawTextEx(SpriteFont spriteFont, const char* text, Vector2 position, // Draw text using SpriteFont and additional parameters RLAPI void DrawTextEx(SpriteFont spriteFont, const char* text, Vector2 position, // Draw text using SpriteFont and additional parameters
float fontSize, int spacing, Color tint); float fontSize, int spacing, Color tint);
int MeasureText(const char *text, int fontSize); // Measure string width for default font RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font
Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, int fontSize, int spacing); // Measure string size for SpriteFont RLAPI Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, int fontSize, int spacing); // Measure string size for SpriteFont
void DrawFPS(int posX, int posY); // Shows current FPS on top-left corner RLAPI 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' RLAPI const char *FormatText(const char *text, ...); // Formatting of text with variables to 'embed'
const char *SubText(const char *text, int position, int length); // Get a piece of a text string RLAPI const char *SubText(const char *text, int position, int length); // Get a piece of a text string
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Basic 3d Shapes Drawing Functions (Module: models) // Basic 3d Shapes Drawing Functions (Module: models)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space RLAPI void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space
void DrawCircle3D(Vector3 center, float radius, float rotationAngle, Vector3 rotation, Color color); // Draw a circle in 3D world space RLAPI void DrawCircle3D(Vector3 center, float radius, float rotationAngle, Vector3 rotation, Color color); // Draw a circle in 3D world space
void DrawCube(Vector3 position, float width, float height, float lenght, Color color); // Draw cube RLAPI void DrawCube(Vector3 position, float width, float height, float length, Color color); // Draw cube
void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version) RLAPI 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 RLAPI void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); // Draw cube wires
void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float lenght, Color color); // Draw cube textured RLAPI void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color); // Draw cube textured
void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere RLAPI 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 RLAPI void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters
void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires RLAPI void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires
void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone RLAPI 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 RLAPI 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, Color color); // Draw a plane XZ RLAPI void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ
void DrawRay(Ray ray, Color color); // Draw a ray line RLAPI void DrawRay(Ray ray, Color color); // Draw a ray line
void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) RLAPI void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0))
void DrawGizmo(Vector3 position); // Draw simple gizmo RLAPI void DrawGizmo(Vector3 position); // Draw simple gizmo
void DrawLight(Light light); // Draw light in 3D world RLAPI void DrawLight(Light light); // Draw light in 3D world
//DrawTorus(), DrawTeapot() are useless... //DrawTorus(), DrawTeapot() are useless...
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Model 3d Loading and Drawing Functions (Module: models) // Model 3d Loading and Drawing Functions (Module: models)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
Model LoadModel(const char *fileName); // Load a 3d model (.OBJ) RLAPI Model LoadModel(const char *fileName); // Load a 3d model (.OBJ)
Model LoadModelEx(Mesh data, bool dynamic); // Load a 3d model (from mesh data) RLAPI Model LoadModelEx(Mesh data, bool dynamic); // Load a 3d model (from mesh data)
Model LoadModelFromRES(const char *rresName, int resId); // Load a 3d model from rRES file (raylib Resource) RLAPI Model LoadModelFromRES(const char *rresName, int resId); // Load a 3d model from rRES file (raylib Resource)
Model LoadHeightmap(Image heightmap, Vector3 size); // Load a heightmap image as a 3d model RLAPI Model LoadHeightmap(Image heightmap, Vector3 size); // Load a heightmap image as a 3d model
Model LoadCubicmap(Image cubicmap); // Load a map image as a 3d model (cubes based) RLAPI Model LoadCubicmap(Image cubicmap); // Load a map image as a 3d model (cubes based)
void UnloadModel(Model model); // Unload 3d model from memory RLAPI void UnloadModel(Model model); // Unload 3d model from memory
Mesh GenMeshCube(float width, float height, float depth); // Generate mesh: cube RLAPI Mesh GenMeshCube(float width, float height, float depth); // Generate mesh: cube
Material LoadMaterial(const char *fileName); // Load material data (from file) RLAPI Material LoadMaterial(const char *fileName); // Load material data (from file)
Material LoadDefaultMaterial(void); // Load default material (uses default models shader) RLAPI Material LoadDefaultMaterial(void); // Load default material (uses default models shader)
Material LoadStandardMaterial(void); // Load standard material (uses material attributes and lighting shader) RLAPI Material LoadStandardMaterial(void); // Load standard material (uses material attributes and lighting shader)
void UnloadMaterial(Material material); // Unload material textures from VRAM RLAPI void UnloadMaterial(Material material); // Unload material textures from VRAM
void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set) RLAPI void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set)
void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters RLAPI void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters
void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set) RLAPI void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set)
void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model wires (with texture if set) with extended parameters RLAPI void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model wires (with texture if set) with extended parameters
void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires) RLAPI void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires)
void DrawBillboard(Camera camera, Texture2D texture, Vector3 center, float size, Color tint); // Draw a billboard texture RLAPI void DrawBillboard(Camera camera, Texture2D texture, Vector3 center, float size, Color tint); // Draw a billboard texture
void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRec, Vector3 center, float size, Color tint); // Draw a billboard texture defined by sourceRec RLAPI void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRec, Vector3 center, float size, Color tint); // Draw a billboard texture defined by sourceRec
BoundingBox CalculateBoundingBox(Mesh mesh); // Calculate mesh bounding box limits RLAPI BoundingBox CalculateBoundingBox(Mesh mesh); // Calculate mesh bounding box limits
bool CheckCollisionSpheres(Vector3 centerA, float radiusA, Vector3 centerB, float radiusB); // Detect collision between two spheres RLAPI bool CheckCollisionSpheres(Vector3 centerA, float radiusA, Vector3 centerB, float radiusB); // Detect collision between two spheres
bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Detect collision between two bounding boxes RLAPI bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Detect collision between two bounding boxes
bool CheckCollisionBoxSphere(BoundingBox box, Vector3 centerSphere, float radiusSphere); // Detect collision between box and sphere RLAPI bool CheckCollisionBoxSphere(BoundingBox box, Vector3 centerSphere, float radiusSphere); // Detect collision between box and sphere
bool CheckCollisionRaySphere(Ray ray, Vector3 spherePosition, float sphereRadius); // Detect collision between ray and sphere RLAPI bool CheckCollisionRaySphere(Ray ray, Vector3 spherePosition, float sphereRadius); // Detect collision between ray and sphere
bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphereRadius, Vector3 *collisionPoint); // Detect collision between ray and sphere with extended parameters and collision point detection RLAPI bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphereRadius, Vector3 *collisionPoint); // Detect collision between ray and sphere with extended parameters and collision point detection
bool CheckCollisionRayBox(Ray ray, BoundingBox box); // Detect collision between ray and box RLAPI bool CheckCollisionRayBox(Ray ray, BoundingBox box); // Detect collision between ray and box
Vector3 ResolveCollisionCubicmap(Image cubicmap, Vector3 mapPosition, Vector3 *playerPosition, float radius); // Detect collision of player radius with cubicmap RLAPI Vector3 ResolveCollisionCubicmap(Image cubicmap, Vector3 mapPosition, Vector3 *playerPosition, float radius); // Detect collision of player radius with cubicmap
// NOTE: Return the normal vector of the impacted surface // NOTE: Return the normal vector of the impacted surface
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Shaders System Functions (Module: rlgl) // Shaders System Functions (Module: rlgl)
// NOTE: This functions are useless when using OpenGL 1.1 // NOTE: This functions are useless when using OpenGL 1.1
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
Shader LoadShader(char *vsFileName, char *fsFileName); // Load a custom shader and bind default locations RLAPI Shader LoadShader(char *vsFileName, char *fsFileName); // Load a custom shader and bind default locations
void UnloadShader(Shader shader); // Unload a custom shader from memory RLAPI void UnloadShader(Shader shader); // Unload a custom shader from memory
Shader GetDefaultShader(void); // Get default shader RLAPI Shader GetDefaultShader(void); // Get default shader
Shader GetStandardShader(void); // Get standard shader RLAPI Shader GetStandardShader(void); // Get standard shader
Texture2D GetDefaultTexture(void); // Get default texture RLAPI Texture2D GetDefaultTexture(void); // Get default texture
int GetShaderLocation(Shader shader, const char *uniformName); // Get shader uniform location RLAPI int GetShaderLocation(Shader shader, const char *uniformName); // Get shader uniform location
void SetShaderValue(Shader shader, int uniformLoc, float *value, int size); // Set shader uniform value (float) RLAPI void SetShaderValue(Shader shader, int uniformLoc, float *value, int size); // Set shader uniform value (float)
void SetShaderValuei(Shader shader, int uniformLoc, int *value, int size); // Set shader uniform value (int) RLAPI void SetShaderValuei(Shader shader, int uniformLoc, int *value, int size); // Set shader uniform value (int)
void SetShaderValueMatrix(Shader shader, int uniformLoc, Matrix mat); // Set shader uniform value (matrix 4x4) RLAPI void SetShaderValueMatrix(Shader shader, int uniformLoc, Matrix mat); // Set shader uniform value (matrix 4x4)
void SetMatrixProjection(Matrix proj); // Set a custom projection matrix (replaces internal projection matrix) RLAPI void SetMatrixProjection(Matrix proj); // Set a custom projection matrix (replaces internal projection matrix)
void SetMatrixModelview(Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix) RLAPI void SetMatrixModelview(Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix)
void BeginShaderMode(Shader shader); // Begin custom shader drawing RLAPI void BeginShaderMode(Shader shader); // Begin custom shader drawing
void EndShaderMode(void); // End custom shader drawing (use default shader) RLAPI void EndShaderMode(void); // End custom shader drawing (use default shader)
void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied) RLAPI void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied)
void EndBlendMode(void); // End blending mode (reset to default: alpha blending) RLAPI void EndBlendMode(void); // End blending mode (reset to default: alpha blending)
Light CreateLight(int type, Vector3 position, Color diffuse); // Create a new light, initialize it and add to pool RLAPI Light CreateLight(int type, Vector3 position, Color diffuse); // Create a new light, initialize it and add to pool
void DestroyLight(Light light); // Destroy a light and take it out of the list RLAPI void DestroyLight(Light light); // Destroy a light and take it out of the list
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// VR experience Functions (Module: rlgl) // VR experience Functions (Module: rlgl)
// NOTE: This functions are useless when using OpenGL 1.1 // NOTE: This functions are useless when using OpenGL 1.1
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void InitVrDevice(int vdDevice); // Init VR device RLAPI void InitVrDevice(int vdDevice); // Init VR device
void CloseVrDevice(void); // Close VR device RLAPI void CloseVrDevice(void); // Close VR device
bool IsVrDeviceReady(void); // Detect if VR device (or simulator) is ready RLAPI bool IsVrDeviceReady(void); // Detect if VR device (or simulator) is ready
void UpdateVrTracking(void); // Update VR tracking (position and orientation) RLAPI void UpdateVrTracking(void); // Update VR tracking (position and orientation)
void ToggleVrMode(void); // Enable/Disable VR experience (device or simulator) RLAPI void ToggleVrMode(void); // Enable/Disable VR experience (device or simulator)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Audio Loading and Playing Functions (Module: audio) // Audio Loading and Playing Functions (Module: audio)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void InitAudioDevice(void); // Initialize audio device and context RLAPI void InitAudioDevice(void); // Initialize audio device and context
void CloseAudioDevice(void); // Close the audio device and context (and music stream) RLAPI void CloseAudioDevice(void); // Close the audio device and context (and music stream)
bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully RLAPI bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully
Sound LoadSound(char *fileName); // Load sound to memory RLAPI Sound LoadSound(char *fileName); // Load sound to memory
Sound LoadSoundFromWave(Wave wave); // Load sound to memory from wave data RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound to memory from wave data
Sound LoadSoundFromRES(const char *rresName, int resId); // Load sound to memory from rRES file (raylib Resource) RLAPI Sound LoadSoundFromRES(const char *rresName, int resId); // Load sound to memory from rRES file (raylib Resource)
void UnloadSound(Sound sound); // Unload sound RLAPI void UpdateSound(Sound sound, void *data, int numSamples); // Update sound buffer with new data
void PlaySound(Sound sound); // Play a sound RLAPI void UnloadSound(Sound sound); // Unload sound
void PauseSound(Sound sound); // Pause a sound RLAPI void PlaySound(Sound sound); // Play a sound
void ResumeSound(Sound sound); // Resume a paused sound RLAPI void PauseSound(Sound sound); // Pause a sound
void StopSound(Sound sound); // Stop playing a sound RLAPI void ResumeSound(Sound sound); // Resume a paused sound
bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing RLAPI void StopSound(Sound sound); // Stop playing a sound
void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level) RLAPI bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing
void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level) RLAPI void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level)
RLAPI void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level)
Music LoadMusicStream(char *fileName); // Load music stream from file RLAPI Music LoadMusicStream(char *fileName); // Load music stream from file
void UnloadMusicStream(Music music); // Unload music stream RLAPI void UnloadMusicStream(Music music); // Unload music stream
void PlayMusicStream(Music music); // Start music playing (open stream) RLAPI void PlayMusicStream(Music music); // Start music playing (open stream)
void UpdateMusicStream(Music music); // Updates buffers for music streaming RLAPI void UpdateMusicStream(Music music); // Updates buffers for music streaming
void StopMusicStream(Music music); // Stop music playing (close stream) RLAPI void StopMusicStream(Music music); // Stop music playing (close stream)
void PauseMusicStream(Music music); // Pause music playing RLAPI void PauseMusicStream(Music music); // Pause music playing
void ResumeMusicStream(Music music); // Resume playing paused music RLAPI void ResumeMusicStream(Music music); // Resume playing paused music
bool IsMusicPlaying(Music music); // Check if music is playing RLAPI bool IsMusicPlaying(Music music); // Check if music is playing
void SetMusicVolume(Music music, float volume); // Set volume for music (1.0 is max level) RLAPI void SetMusicVolume(Music music, float volume); // Set volume for music (1.0 is max level)
void SetMusicPitch(Music music, float pitch); // Set pitch for a music (1.0 is base level) RLAPI void SetMusicPitch(Music music, float pitch); // Set pitch for a music (1.0 is base level)
float GetMusicTimeLength(Music music); // Get music time length (in seconds) RLAPI float GetMusicTimeLength(Music music); // Get music time length (in seconds)
float GetMusicTimePlayed(Music music); // Get current music time played (in seconds) RLAPI float GetMusicTimePlayed(Music music); // Get current music time played (in seconds)
AudioStream InitAudioStream(unsigned int sampleRate, RLAPI AudioStream InitAudioStream(unsigned int sampleRate,
unsigned int sampleSize, unsigned int sampleSize,
unsigned int channels); // Init audio stream (to stream audio pcm data) unsigned int channels); // Init audio stream (to stream audio pcm data)
void UpdateAudioStream(AudioStream stream, void *data, int numSamples); // Update audio stream buffers with data RLAPI void UpdateAudioStream(AudioStream stream, void *data, int numSamples); // Update audio stream buffers with data
void CloseAudioStream(AudioStream stream); // Close audio stream and free memory RLAPI void CloseAudioStream(AudioStream stream); // Close audio stream and free memory
bool IsAudioBufferProcessed(AudioStream stream); // Check if any audio stream buffers requires refill RLAPI bool IsAudioBufferProcessed(AudioStream stream); // Check if any audio stream buffers requires refill
void PlayAudioStream(AudioStream stream); // Play audio stream RLAPI void PlayAudioStream(AudioStream stream); // Play audio stream
void PauseAudioStream(AudioStream stream); // Pause audio stream RLAPI void PauseAudioStream(AudioStream stream); // Pause audio stream
void ResumeAudioStream(AudioStream stream); // Resume audio stream RLAPI void ResumeAudioStream(AudioStream stream); // Resume audio stream
void StopAudioStream(AudioStream stream); // Stop audio stream RLAPI void StopAudioStream(AudioStream stream); // Stop audio stream
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -107,7 +107,7 @@ typedef enum { OPENGL_11 = 1, OPENGL_21, OPENGL_33, OPENGL_ES_20 } GlVersion;
// byte type // byte type
typedef unsigned char byte; typedef unsigned char byte;
// Color type, RGBA (32bit) // Color type, RGBA (32bit)
typedef struct Color { typedef struct Color {
unsigned char r; unsigned char r;
@ -117,7 +117,7 @@ typedef enum { OPENGL_11 = 1, OPENGL_21, OPENGL_33, OPENGL_ES_20 } GlVersion;
} Color; } Color;
// Texture formats (support depends on OpenGL version) // Texture formats (support depends on OpenGL version)
typedef enum { typedef enum {
UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha) UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha)
UNCOMPRESSED_GRAY_ALPHA, UNCOMPRESSED_GRAY_ALPHA,
UNCOMPRESSED_R5G6B5, // 16 bpp UNCOMPRESSED_R5G6B5, // 16 bpp
@ -157,7 +157,7 @@ typedef enum { OPENGL_11 = 1, OPENGL_21, OPENGL_33, OPENGL_ES_20 } GlVersion;
// Shader type (generic shader) // Shader type (generic shader)
typedef struct Shader { typedef struct Shader {
unsigned int id; // Shader program id unsigned int id; // Shader program id
// Vertex attributes locations (default locations) // Vertex attributes locations (default locations)
int vertexLoc; // Vertex attribute location point (default-location = 0) int vertexLoc; // Vertex attribute location point (default-location = 0)
int texcoordLoc; // Texcoord attribute location point (default-location = 1) int texcoordLoc; // Texcoord attribute location point (default-location = 1)
@ -169,7 +169,7 @@ typedef enum { OPENGL_11 = 1, OPENGL_21, OPENGL_33, OPENGL_ES_20 } GlVersion;
// Uniform locations // Uniform locations
int mvpLoc; // ModelView-Projection matrix uniform location point (vertex shader) int mvpLoc; // ModelView-Projection matrix uniform location point (vertex shader)
int tintColorLoc; // Color uniform location point (fragment shader) int tintColorLoc; // Color uniform location point (fragment shader)
// Texture map locations (generic for any kind of map) // Texture map locations (generic for any kind of map)
int mapTexture0Loc; // Map texture uniform location point (default-texture-unit = 0) int mapTexture0Loc; // Map texture uniform location point (default-texture-unit = 0)
int mapTexture1Loc; // Map texture uniform location point (default-texture-unit = 1) int mapTexture1Loc; // Map texture uniform location point (default-texture-unit = 1)
@ -185,14 +185,14 @@ typedef enum { OPENGL_11 = 1, OPENGL_21, OPENGL_33, OPENGL_ES_20 } GlVersion;
int mipmaps; // Mipmap levels, 1 by default int mipmaps; // Mipmap levels, 1 by default
int format; // Data format (TextureFormat) int format; // Data format (TextureFormat)
} Texture2D; } Texture2D;
// RenderTexture2D type, for texture rendering // RenderTexture2D type, for texture rendering
typedef struct RenderTexture2D { typedef struct RenderTexture2D {
unsigned int id; // Render texture (fbo) id unsigned int id; // Render texture (fbo) id
Texture2D texture; // Color buffer attachment texture Texture2D texture; // Color buffer attachment texture
Texture2D depth; // Depth buffer attachment texture Texture2D depth; // Depth buffer attachment texture
} RenderTexture2D; } RenderTexture2D;
// Material type // Material type
typedef struct Material { typedef struct Material {
Shader shader; // Standard shader (supports 3 map types: diffuse, normal, specular) Shader shader; // Standard shader (supports 3 map types: diffuse, normal, specular)
@ -204,10 +204,10 @@ typedef enum { OPENGL_11 = 1, OPENGL_21, OPENGL_33, OPENGL_ES_20 } GlVersion;
Color colDiffuse; // Diffuse color Color colDiffuse; // Diffuse color
Color colAmbient; // Ambient color Color colAmbient; // Ambient color
Color colSpecular; // Specular color Color colSpecular; // Specular color
float glossiness; // Glossiness level (Ranges from 0 to 1000) float glossiness; // Glossiness level (Ranges from 0 to 1000)
} Material; } Material;
// Camera type, defines a camera position/orientation in 3d space // Camera type, defines a camera position/orientation in 3d space
typedef struct Camera { typedef struct Camera {
Vector3 position; // Camera position Vector3 position; // Camera position
@ -225,22 +225,22 @@ typedef enum { OPENGL_11 = 1, OPENGL_21, OPENGL_33, OPENGL_ES_20 } GlVersion;
Vector3 position; // Light position Vector3 position; // Light position
Vector3 target; // Light target: LIGHT_DIRECTIONAL and LIGHT_SPOT (cone direction target) Vector3 target; // Light target: LIGHT_DIRECTIONAL and LIGHT_SPOT (cone direction target)
float radius; // Light attenuation radius light intensity reduced with distance (world distance) float radius; // Light attenuation radius light intensity reduced with distance (world distance)
Color diffuse; // Light diffuse color Color diffuse; // Light diffuse color
float intensity; // Light intensity level float intensity; // Light intensity level
float coneAngle; // Light cone max angle: LIGHT_SPOT float coneAngle; // Light cone max angle: LIGHT_SPOT
} LightData, *Light; } LightData, *Light;
// Light types // Light types
typedef enum { LIGHT_POINT, LIGHT_DIRECTIONAL, LIGHT_SPOT } LightType; typedef enum { LIGHT_POINT, LIGHT_DIRECTIONAL, LIGHT_SPOT } LightType;
// Color blending modes (pre-defined) // Color blending modes (pre-defined)
typedef enum { BLEND_ALPHA = 0, BLEND_ADDITIVE, BLEND_MULTIPLIED } BlendMode; typedef enum { BLEND_ALPHA = 0, BLEND_ADDITIVE, BLEND_MULTIPLIED } BlendMode;
// TraceLog message types // TraceLog message types
typedef enum { INFO = 0, ERROR, WARNING, DEBUG, OTHER } TraceLogType; typedef enum { INFO = 0, ERROR, WARNING, DEBUG, OTHER } TraceLogType;
// VR Head Mounted Display devices // VR Head Mounted Display devices
typedef enum { typedef enum {
HMD_DEFAULT_DEVICE = 0, HMD_DEFAULT_DEVICE = 0,

View file

@ -6,7 +6,7 @@
* The following types: * The following types:
* Color, Vector2, Vector3, Rectangle, Ray, Camera, Camera2D * Color, Vector2, Vector3, Rectangle, Ray, Camera, Camera2D
* are treated as objects with named fields, same as in C. * are treated as objects with named fields, same as in C.
* *
* Lua defines utility functions for creating those objects. * Lua defines utility functions for creating those objects.
* Usage: * Usage:
* local cl = Color(255,255,255,255) * local cl = Color(255,255,255,255)
@ -27,7 +27,7 @@
* NOTE 02: * NOTE 02:
* Some raylib functions take a pointer to an array, and the size of that array. * Some raylib functions take a pointer to an array, and the size of that array.
* The equivalent Lua functions take only an array table of the specified type UNLESS * The equivalent Lua functions take only an array table of the specified type UNLESS
* it's a pointer to a large char array (e.g. for images), then it takes (and potentially returns) * it's a pointer to a large char array (e.g. for images), then it takes (and potentially returns)
* a Lua string (without the size argument, as Lua strings are sized by default). * a Lua string (without the size argument, as Lua strings are sized by default).
* *
* NOTE 03: * NOTE 03:
@ -362,7 +362,7 @@ static void LuaBuildOpaqueMetatables(void)
lua_pushcfunction(L, &LuaIndexTexture2D); lua_pushcfunction(L, &LuaIndexTexture2D);
lua_setfield(L, -2, "__index"); lua_setfield(L, -2, "__index");
lua_pop(L, 1); lua_pop(L, 1);
luaL_newmetatable(L, "RenderTexture2D"); luaL_newmetatable(L, "RenderTexture2D");
lua_pushcfunction(L, &LuaIndexRenderTexture2D); lua_pushcfunction(L, &LuaIndexRenderTexture2D);
lua_setfield(L, -2, "__index"); lua_setfield(L, -2, "__index");
@ -3112,7 +3112,7 @@ int lua_TraceLog(lua_State* L)
lua_getfield(L, 1, "format"); /// fmt, args..., [string], format() lua_getfield(L, 1, "format"); /// fmt, args..., [string], format()
lua_rotate(L, 1, 2); /// [string], format(), fmt, args... lua_rotate(L, 1, 2); /// [string], format(), fmt, args...
lua_call(L, num_args, 1); /// [string], formatted_string lua_call(L, num_args, 1); /// [string], formatted_string
TraceLog(arg1, "%s", luaL_checkstring(L,-1)); TraceLog(arg1, "%s", luaL_checkstring(L,-1));
return 0; return 0;
} }
@ -3525,7 +3525,7 @@ int lua_QuaternionTransform(lua_State* L)
// raylib Functions (and data types) list // raylib Functions (and data types) list
static luaL_Reg raylib_functions[] = { static luaL_Reg raylib_functions[] = {
// Register non-opaque data types // Register non-opaque data types
REG(Color) REG(Color)
REG(Vector2) REG(Vector2)
@ -3547,7 +3547,7 @@ static luaL_Reg raylib_functions[] = {
REG(ToggleFullscreen) REG(ToggleFullscreen)
REG(GetScreenWidth) REG(GetScreenWidth)
REG(GetScreenHeight) REG(GetScreenHeight)
REG(ShowCursor) REG(ShowCursor)
REG(HideCursor) REG(HideCursor)
REG(IsCursorHidden) REG(IsCursorHidden)
@ -3563,11 +3563,11 @@ static luaL_Reg raylib_functions[] = {
REG(End3dMode) REG(End3dMode)
REG(BeginTextureMode) REG(BeginTextureMode)
REG(EndTextureMode) REG(EndTextureMode)
REG(GetMouseRay) REG(GetMouseRay)
REG(GetWorldToScreen) REG(GetWorldToScreen)
REG(GetCameraMatrix) REG(GetCameraMatrix)
#if defined(PLATFORM_WEB) #if defined(PLATFORM_WEB)
REG(SetDrawingLoop) REG(SetDrawingLoop)
#else #else
@ -3575,7 +3575,7 @@ static luaL_Reg raylib_functions[] = {
#endif #endif
REG(GetFPS) REG(GetFPS)
REG(GetFrameTime) REG(GetFrameTime)
REG(GetColor) REG(GetColor)
REG(GetHexValue) REG(GetHexValue)
REG(ColorToFloat) REG(ColorToFloat)
@ -3585,13 +3585,13 @@ static luaL_Reg raylib_functions[] = {
REG(Fade) REG(Fade)
REG(SetConfigFlags) REG(SetConfigFlags)
REG(ShowLogo) REG(ShowLogo)
REG(IsFileDropped) REG(IsFileDropped)
REG(GetDroppedFiles) REG(GetDroppedFiles)
REG(ClearDroppedFiles) REG(ClearDroppedFiles)
REG(StorageSaveValue) REG(StorageSaveValue)
REG(StorageLoadValue) REG(StorageLoadValue)
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB)
REG(IsKeyPressed) REG(IsKeyPressed)
REG(IsKeyDown) REG(IsKeyDown)
@ -3599,7 +3599,7 @@ static luaL_Reg raylib_functions[] = {
REG(IsKeyUp) REG(IsKeyUp)
REG(GetKeyPressed) REG(GetKeyPressed)
REG(SetExitKey) REG(SetExitKey)
REG(IsGamepadAvailable) REG(IsGamepadAvailable)
REG(GetGamepadAxisMovement) REG(GetGamepadAxisMovement)
REG(IsGamepadButtonPressed) REG(IsGamepadButtonPressed)
@ -3643,13 +3643,13 @@ static luaL_Reg raylib_functions[] = {
REG(SetCameraPosition) REG(SetCameraPosition)
REG(SetCameraTarget) REG(SetCameraTarget)
REG(SetCameraFovy) REG(SetCameraFovy)
REG(SetCameraPanControl) REG(SetCameraPanControl)
REG(SetCameraAltControl) REG(SetCameraAltControl)
REG(SetCameraSmoothZoomControl) REG(SetCameraSmoothZoomControl)
REG(SetCameraMoveControls) REG(SetCameraMoveControls)
REG(SetCameraMouseSensitivity) REG(SetCameraMouseSensitivity)
REG(DrawPixel) REG(DrawPixel)
REG(DrawPixelV) REG(DrawPixelV)
REG(DrawLine) REG(DrawLine)
@ -3668,7 +3668,7 @@ static luaL_Reg raylib_functions[] = {
REG(DrawPoly) REG(DrawPoly)
REG(DrawPolyEx) REG(DrawPolyEx)
REG(DrawPolyExLines) REG(DrawPolyExLines)
REG(CheckCollisionRecs) REG(CheckCollisionRecs)
REG(CheckCollisionCircles) REG(CheckCollisionCircles)
REG(CheckCollisionCircleRec) REG(CheckCollisionCircleRec)
@ -3676,7 +3676,7 @@ static luaL_Reg raylib_functions[] = {
REG(CheckCollisionPointRec) REG(CheckCollisionPointRec)
REG(CheckCollisionPointCircle) REG(CheckCollisionPointCircle)
REG(CheckCollisionPointTriangle) REG(CheckCollisionPointTriangle)
REG(LoadImage) REG(LoadImage)
REG(LoadImageEx) REG(LoadImageEx)
REG(LoadImageRaw) REG(LoadImageRaw)
@ -3712,13 +3712,13 @@ static luaL_Reg raylib_functions[] = {
REG(ImageColorBrightness) REG(ImageColorBrightness)
REG(GenTextureMipmaps) REG(GenTextureMipmaps)
REG(UpdateTexture) REG(UpdateTexture)
REG(DrawTexture) REG(DrawTexture)
REG(DrawTextureV) REG(DrawTextureV)
REG(DrawTextureEx) REG(DrawTextureEx)
REG(DrawTextureRec) REG(DrawTextureRec)
REG(DrawTexturePro) REG(DrawTexturePro)
REG(GetDefaultFont) REG(GetDefaultFont)
REG(LoadSpriteFont) REG(LoadSpriteFont)
REG(UnloadSpriteFont) REG(UnloadSpriteFont)
@ -3727,7 +3727,7 @@ static luaL_Reg raylib_functions[] = {
REG(MeasureText) REG(MeasureText)
REG(MeasureTextEx) REG(MeasureTextEx)
REG(DrawFPS) REG(DrawFPS)
REG(DrawLine3D) REG(DrawLine3D)
REG(DrawCircle3D) REG(DrawCircle3D)
REG(DrawCube) REG(DrawCube)
@ -3744,7 +3744,7 @@ static luaL_Reg raylib_functions[] = {
REG(DrawGrid) REG(DrawGrid)
REG(DrawGizmo) REG(DrawGizmo)
REG(DrawLight) REG(DrawLight)
REG(LoadModel) REG(LoadModel)
REG(LoadModelEx) REG(LoadModelEx)
REG(LoadModelFromRES) REG(LoadModelFromRES)
@ -3756,7 +3756,7 @@ static luaL_Reg raylib_functions[] = {
REG(LoadStandardMaterial) REG(LoadStandardMaterial)
REG(UnloadMaterial) REG(UnloadMaterial)
//REG(GenMesh*) // Not ready yet... //REG(GenMesh*) // Not ready yet...
REG(DrawModel) REG(DrawModel)
REG(DrawModelEx) REG(DrawModelEx)
REG(DrawModelWires) REG(DrawModelWires)
@ -3771,7 +3771,7 @@ static luaL_Reg raylib_functions[] = {
REG(CheckCollisionRaySphereEx) REG(CheckCollisionRaySphereEx)
REG(CheckCollisionRayBox) REG(CheckCollisionRayBox)
REG(ResolveCollisionCubicmap) REG(ResolveCollisionCubicmap)
REG(LoadShader) REG(LoadShader)
REG(UnloadShader) REG(UnloadShader)
REG(GetDefaultShader) REG(GetDefaultShader)
@ -3789,13 +3789,13 @@ static luaL_Reg raylib_functions[] = {
REG(EndBlendMode) REG(EndBlendMode)
REG(CreateLight) REG(CreateLight)
REG(DestroyLight) REG(DestroyLight)
REG(InitVrDevice) REG(InitVrDevice)
REG(CloseVrDevice) REG(CloseVrDevice)
REG(IsVrDeviceReady) REG(IsVrDeviceReady)
REG(UpdateVrTracking) REG(UpdateVrTracking)
REG(ToggleVrMode) REG(ToggleVrMode)
REG(InitAudioDevice) REG(InitAudioDevice)
REG(CloseAudioDevice) REG(CloseAudioDevice)
REG(IsAudioDeviceReady) REG(IsAudioDeviceReady)
@ -3810,7 +3810,7 @@ static luaL_Reg raylib_functions[] = {
REG(IsSoundPlaying) REG(IsSoundPlaying)
REG(SetSoundVolume) REG(SetSoundVolume)
REG(SetSoundPitch) REG(SetSoundPitch)
REG(LoadMusicStream) REG(LoadMusicStream)
REG(UnloadMusicStream) REG(UnloadMusicStream)
REG(UpdateMusicStream) REG(UpdateMusicStream)
@ -3823,7 +3823,7 @@ static luaL_Reg raylib_functions[] = {
REG(SetMusicPitch) REG(SetMusicPitch)
REG(GetMusicTimeLength) REG(GetMusicTimeLength)
REG(GetMusicTimePlayed) REG(GetMusicTimePlayed)
REG(InitAudioStream) REG(InitAudioStream)
REG(UpdateAudioStream) REG(UpdateAudioStream)
REG(CloseAudioStream) REG(CloseAudioStream)
@ -3906,7 +3906,7 @@ RLUADEF void InitLuaDevice(void)
{ {
mainLuaState = luaL_newstate(); mainLuaState = luaL_newstate();
L = mainLuaState; L = mainLuaState;
LuaStartEnum(); LuaStartEnum();
LuaSetEnum("FULLSCREEN_MODE", 1); LuaSetEnum("FULLSCREEN_MODE", 1);
LuaSetEnum("SHOW_LOGO", 2); LuaSetEnum("SHOW_LOGO", 2);
@ -4001,7 +4001,7 @@ RLUADEF void InitLuaDevice(void)
LuaSetEnum("PS3_BUTTON_L2", 8); LuaSetEnum("PS3_BUTTON_L2", 8);
LuaSetEnum("PS3_BUTTON_SELECT", 9); LuaSetEnum("PS3_BUTTON_SELECT", 9);
LuaSetEnum("PS3_BUTTON_START", 10); LuaSetEnum("PS3_BUTTON_START", 10);
LuaSetEnum("XBOX_BUTTON_A", 0); LuaSetEnum("XBOX_BUTTON_A", 0);
LuaSetEnum("XBOX_BUTTON_B", 1); LuaSetEnum("XBOX_BUTTON_B", 1);
LuaSetEnum("XBOX_BUTTON_X", 2); LuaSetEnum("XBOX_BUTTON_X", 2);
@ -4086,9 +4086,9 @@ RLUADEF void InitLuaDevice(void)
LuaSetEnum("ADDITIVE", BLEND_ADDITIVE); LuaSetEnum("ADDITIVE", BLEND_ADDITIVE);
LuaSetEnum("MULTIPLIED", BLEND_MULTIPLIED); LuaSetEnum("MULTIPLIED", BLEND_MULTIPLIED);
LuaEndEnum("BlendMode"); LuaEndEnum("BlendMode");
LuaStartEnum(); LuaStartEnum();
LuaSetEnum("POINT", LIGHT_POINT); LuaSetEnum("POINT", LIGHT_POINT);
LuaSetEnum("DIRECTIONAL", LIGHT_DIRECTIONAL); LuaSetEnum("DIRECTIONAL", LIGHT_DIRECTIONAL);
LuaSetEnum("SPOT", LIGHT_SPOT); LuaSetEnum("SPOT", LIGHT_SPOT);
LuaEndEnum("LightType"); LuaEndEnum("LightType");
@ -4114,7 +4114,7 @@ RLUADEF void InitLuaDevice(void)
LuaSetEnum("FIRST_PERSON", CAMERA_FIRST_PERSON); LuaSetEnum("FIRST_PERSON", CAMERA_FIRST_PERSON);
LuaSetEnum("THIRD_PERSON", CAMERA_THIRD_PERSON); LuaSetEnum("THIRD_PERSON", CAMERA_THIRD_PERSON);
LuaEndEnum("CameraMode"); LuaEndEnum("CameraMode");
LuaStartEnum(); LuaStartEnum();
LuaSetEnum("DEFAULT_DEVICE", HMD_DEFAULT_DEVICE); LuaSetEnum("DEFAULT_DEVICE", HMD_DEFAULT_DEVICE);
LuaSetEnum("OCULUS_RIFT_DK2", HMD_OCULUS_RIFT_DK2); LuaSetEnum("OCULUS_RIFT_DK2", HMD_OCULUS_RIFT_DK2);
@ -4138,9 +4138,9 @@ RLUADEF void InitLuaDevice(void)
lua_pushboolean(L, true); lua_pushboolean(L, true);
#if defined(PLATFORM_DESKTOP) #if defined(PLATFORM_DESKTOP)
lua_setglobal(L, "PLATFORM_DESKTOP"); lua_setglobal(L, "PLATFORM_DESKTOP");
#elif defined(PLATFORM_ANDROID) #elif defined(PLATFORM_ANDROID)
lua_setglobal(L, "PLATFORM_ANDROID"); lua_setglobal(L, "PLATFORM_ANDROID");
#elif defined(PLATFORM_RPI) #elif defined(PLATFORM_RPI)
lua_setglobal(L, "PLATFORM_RPI"); lua_setglobal(L, "PLATFORM_RPI");
#elif defined(PLATFORM_WEB) #elif defined(PLATFORM_WEB)
lua_setglobal(L, "PLATFORM_WEB"); lua_setglobal(L, "PLATFORM_WEB");
@ -4148,7 +4148,7 @@ RLUADEF void InitLuaDevice(void)
luaL_openlibs(L); luaL_openlibs(L);
LuaBuildOpaqueMetatables(); LuaBuildOpaqueMetatables();
LuaRegisterRayLib(0); LuaRegisterRayLib(0);
} }
@ -4173,7 +4173,7 @@ RLUADEF void ExecuteLuaCode(const char *code)
} }
int result = luaL_dostring(L, code); int result = luaL_dostring(L, code);
switch (result) switch (result)
{ {
case LUA_OK: break; case LUA_OK: break;
@ -4193,7 +4193,7 @@ RLUADEF void ExecuteLuaFile(const char *filename)
} }
int result = luaL_dofile(L, filename); int result = luaL_dofile(L, filename);
switch (result) switch (result)
{ {
case LUA_OK: break; case LUA_OK: break;

View file

@ -151,7 +151,7 @@ extern void LoadDefaultFont(void)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
int imWidth = 128; int imWidth = 128;
int imHeight = 128; int imHeight = 128;
Color *imagePixels = (Color *)malloc(imWidth*imHeight*sizeof(Color)); Color *imagePixels = (Color *)malloc(imWidth*imHeight*sizeof(Color));
for (int i = 0; i < imWidth*imHeight; i++) imagePixels[i] = BLANK; // Initialize array for (int i = 0; i < imWidth*imHeight; i++) imagePixels[i] = BLANK; // Initialize array
@ -174,7 +174,7 @@ extern void LoadDefaultFont(void)
//FILE *myimage = fopen("default_font.raw", "wb"); //FILE *myimage = fopen("default_font.raw", "wb");
//fwrite(image.pixels, 1, 128*128*4, myimage); //fwrite(image.pixels, 1, 128*128*4, myimage);
//fclose(myimage); //fclose(myimage);
Image image = LoadImageEx(imagePixels, imWidth, imHeight); Image image = LoadImageEx(imagePixels, imWidth, imHeight);
ImageFormat(&image, UNCOMPRESSED_GRAY_ALPHA); ImageFormat(&image, UNCOMPRESSED_GRAY_ALPHA);
@ -185,13 +185,13 @@ extern void LoadDefaultFont(void)
// Reconstruct charSet using charsWidth[], charsHeight, charsDivisor, numChars // Reconstruct charSet using charsWidth[], charsHeight, charsDivisor, numChars
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
defaultFont.charValues = (int *)malloc(defaultFont.numChars*sizeof(int)); defaultFont.charValues = (int *)malloc(defaultFont.numChars*sizeof(int));
defaultFont.charRecs = (Rectangle *)malloc(defaultFont.numChars*sizeof(Rectangle)); // Allocate space for our character rectangle data defaultFont.charRecs = (Rectangle *)malloc(defaultFont.numChars*sizeof(Rectangle)); // Allocate space for our character rectangle data
// This memory should be freed at end! --> Done on CloseWindow() // This memory should be freed at end! --> Done on CloseWindow()
defaultFont.charOffsets = (Vector2 *)malloc(defaultFont.numChars*sizeof(Vector2)); defaultFont.charOffsets = (Vector2 *)malloc(defaultFont.numChars*sizeof(Vector2));
defaultFont.charAdvanceX = (int *)malloc(defaultFont.numChars*sizeof(int)); defaultFont.charAdvanceX = (int *)malloc(defaultFont.numChars*sizeof(int));
int currentLine = 0; int currentLine = 0;
int currentPosX = charsDivisor; int currentPosX = charsDivisor;
int testPosX = charsDivisor; int testPosX = charsDivisor;
@ -199,7 +199,7 @@ extern void LoadDefaultFont(void)
for (int i = 0; i < defaultFont.numChars; i++) for (int i = 0; i < defaultFont.numChars; i++)
{ {
defaultFont.charValues[i] = FONT_FIRST_CHAR + i; // First char is 32 defaultFont.charValues[i] = FONT_FIRST_CHAR + i; // First char is 32
defaultFont.charRecs[i].x = currentPosX; defaultFont.charRecs[i].x = currentPosX;
defaultFont.charRecs[i].y = charsDivisor + currentLine * (charsHeight + charsDivisor); defaultFont.charRecs[i].y = charsDivisor + currentLine * (charsHeight + charsDivisor);
defaultFont.charRecs[i].width = charsWidth[i]; defaultFont.charRecs[i].width = charsWidth[i];
@ -217,12 +217,12 @@ extern void LoadDefaultFont(void)
defaultFont.charRecs[i].y = charsDivisor + currentLine*(charsHeight + charsDivisor); defaultFont.charRecs[i].y = charsDivisor + currentLine*(charsHeight + charsDivisor);
} }
else currentPosX = testPosX; else currentPosX = testPosX;
// NOTE: On default font character offsets and xAdvance are not required // NOTE: On default font character offsets and xAdvance are not required
defaultFont.charOffsets[i] = (Vector2){ 0.0f, 0.0f }; defaultFont.charOffsets[i] = (Vector2){ 0.0f, 0.0f };
defaultFont.charAdvanceX[i] = 0; defaultFont.charAdvanceX[i] = 0;
} }
defaultFont.size = defaultFont.charRecs[0].height; defaultFont.size = defaultFont.charRecs[0].height;
TraceLog(INFO, "[TEX ID %i] Default font loaded successfully", defaultFont.texture.id); TraceLog(INFO, "[TEX ID %i] Default font loaded successfully", defaultFont.texture.id);
@ -262,7 +262,7 @@ SpriteFont LoadSpriteFont(const char *fileName)
if (image.data != NULL) spriteFont = LoadImageFont(image, MAGENTA, FONT_FIRST_CHAR); if (image.data != NULL) spriteFont = LoadImageFont(image, MAGENTA, FONT_FIRST_CHAR);
UnloadImage(image); UnloadImage(image);
} }
if (spriteFont.texture.id == 0) if (spriteFont.texture.id == 0)
{ {
TraceLog(WARNING, "[%s] SpriteFont could not be loaded, using default font", fileName); TraceLog(WARNING, "[%s] SpriteFont could not be loaded, using default font", fileName);
@ -316,15 +316,15 @@ void DrawTextEx(SpriteFont spriteFont, const char *text, Vector2 position, float
scaleFactor = fontSize/spriteFont.size; scaleFactor = fontSize/spriteFont.size;
// NOTE: Some ugly hacks are made to support Latin-1 Extended characters directly // NOTE: Some ugly hacks are made to support Latin-1 Extended characters directly
// written in C code files (codified by default as UTF-8) // written in C code files (codified by default as UTF-8)
for(int i = 0; i < length; i++) for(int i = 0; i < length; i++)
{ {
// TODO: Right now we are supposing characters that follow a continous order and start at FONT_FIRST_CHAR, // TODO: Right now we are supposing characters that follow a continous order and start at FONT_FIRST_CHAR,
// this sytem can be improved to support any characters order and init value... // this sytem can be improved to support any characters order and init value...
// An intermediate table could be created to link char values with predefined char position index in chars rectangle array // An intermediate table could be created to link char values with predefined char position index in chars rectangle array
if ((unsigned char)text[i] == 0xc2) // UTF-8 encoding identification HACK! if ((unsigned char)text[i] == 0xc2) // UTF-8 encoding identification HACK!
{ {
// Support UTF-8 encoded values from [0xc2 0x80] -> [0xc2 0xbf](¿) // Support UTF-8 encoded values from [0xc2 0x80] -> [0xc2 0xbf](¿)
@ -353,8 +353,8 @@ void DrawTextEx(SpriteFont spriteFont, const char *text, Vector2 position, float
if (rec.x > 0) if (rec.x > 0)
{ {
DrawTexturePro(spriteFont.texture, rec, (Rectangle){ position.x + textOffsetX + spriteFont.charOffsets[(int)text[i] - FONT_FIRST_CHAR].x*scaleFactor, DrawTexturePro(spriteFont.texture, rec, (Rectangle){ position.x + textOffsetX + spriteFont.charOffsets[(int)text[i] - FONT_FIRST_CHAR].x*scaleFactor,
position.y + textOffsetY + spriteFont.charOffsets[(int)text[i] - FONT_FIRST_CHAR].y*scaleFactor, position.y + textOffsetY + spriteFont.charOffsets[(int)text[i] - FONT_FIRST_CHAR].y*scaleFactor,
rec.width*scaleFactor, rec.height*scaleFactor} , (Vector2){ 0, 0 }, 0.0f, tint); rec.width*scaleFactor, rec.height*scaleFactor} , (Vector2){ 0, 0 }, 0.0f, tint);
if (spriteFont.charAdvanceX[(int)text[i] - FONT_FIRST_CHAR] == 0) textOffsetX += (rec.width*scaleFactor + spacing); if (spriteFont.charAdvanceX[(int)text[i] - FONT_FIRST_CHAR] == 0) textOffsetX += (rec.width*scaleFactor + spacing);
@ -381,15 +381,15 @@ const char *SubText(const char *text, int position, int length)
{ {
static char buffer[MAX_SUBTEXT_LENGTH]; static char buffer[MAX_SUBTEXT_LENGTH];
int textLength = strlen(text); int textLength = strlen(text);
if (position >= textLength) if (position >= textLength)
{ {
position = textLength - 1; position = textLength - 1;
length = 0; length = 0;
} }
if (length >= textLength) length = textLength; if (length >= textLength) length = textLength;
for (int c = 0 ; c < length ; c++) for (int c = 0 ; c < length ; c++)
{ {
*(buffer+c) = *(text+position); *(buffer+c) = *(text+position);
@ -421,17 +421,17 @@ Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, int fontSize, int
int len = strlen(text); int len = strlen(text);
int tempLen = 0; // Used to count longer text line num chars int tempLen = 0; // Used to count longer text line num chars
int lenCounter = 0; int lenCounter = 0;
int textWidth = 0; int textWidth = 0;
int tempTextWidth = 0; // Used to count longer text line width int tempTextWidth = 0; // Used to count longer text line width
int textHeight = spriteFont.size; int textHeight = spriteFont.size;
float scaleFactor; float scaleFactor;
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
{ {
lenCounter++; lenCounter++;
if (text[i] != '\n') if (text[i] != '\n')
{ {
if (spriteFont.charAdvanceX[(int)text[i] - FONT_FIRST_CHAR] != 0) textWidth += spriteFont.charAdvanceX[(int)text[i] - FONT_FIRST_CHAR]; if (spriteFont.charAdvanceX[(int)text[i] - FONT_FIRST_CHAR] != 0) textWidth += spriteFont.charAdvanceX[(int)text[i] - FONT_FIRST_CHAR];
@ -444,10 +444,10 @@ Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, int fontSize, int
textWidth = 0; textWidth = 0;
textHeight += (spriteFont.size + spriteFont.size/2); // NOTE: Fixed line spacing of 1.5 lines textHeight += (spriteFont.size + spriteFont.size/2); // NOTE: Fixed line spacing of 1.5 lines
} }
if (tempLen < lenCounter) tempLen = lenCounter; if (tempLen < lenCounter) tempLen = lenCounter;
} }
if (tempTextWidth < textWidth) tempTextWidth = textWidth; if (tempTextWidth < textWidth) tempTextWidth = textWidth;
if (fontSize <= spriteFont.size) scaleFactor = 1.0f; if (fontSize <= spriteFont.size) scaleFactor = 1.0f;
@ -496,21 +496,21 @@ void DrawFPS(int posX, int posY)
static SpriteFont LoadImageFont(Image image, Color key, int firstChar) static SpriteFont LoadImageFont(Image image, Color key, int firstChar)
{ {
#define COLOR_EQUAL(col1, col2) ((col1.r == col2.r)&&(col1.g == col2.g)&&(col1.b == col2.b)&&(col1.a == col2.a)) #define COLOR_EQUAL(col1, col2) ((col1.r == col2.r)&&(col1.g == col2.g)&&(col1.b == col2.b)&&(col1.a == col2.a))
int charSpacing = 0; int charSpacing = 0;
int lineSpacing = 0; int lineSpacing = 0;
int x = 0; int x = 0;
int y = 0; int y = 0;
// Default number of characters expected supported // Default number of characters expected supported
#define MAX_FONTCHARS 128 #define MAX_FONTCHARS 128
// We allocate a temporal arrays for chars data measures, // We allocate a temporal arrays for chars data measures,
// once we get the actual number of chars, we copy data to a sized arrays // once we get the actual number of chars, we copy data to a sized arrays
int tempCharValues[MAX_FONTCHARS]; int tempCharValues[MAX_FONTCHARS];
Rectangle tempCharRecs[MAX_FONTCHARS]; Rectangle tempCharRecs[MAX_FONTCHARS];
Color *pixels = GetImageData(image); Color *pixels = GetImageData(image);
// Parse image data to get charSpacing and lineSpacing // Parse image data to get charSpacing and lineSpacing
@ -545,7 +545,7 @@ static SpriteFont LoadImageFont(Image image, Color key, int firstChar)
!COLOR_EQUAL((pixels[(lineSpacing + (charHeight+lineSpacing)*lineToRead)*image.width + xPosToRead]), key)) !COLOR_EQUAL((pixels[(lineSpacing + (charHeight+lineSpacing)*lineToRead)*image.width + xPosToRead]), key))
{ {
tempCharValues[index] = firstChar + index; tempCharValues[index] = firstChar + index;
tempCharRecs[index].x = xPosToRead; tempCharRecs[index].x = xPosToRead;
tempCharRecs[index].y = lineSpacing + lineToRead * (charHeight + lineSpacing); tempCharRecs[index].y = lineSpacing + lineToRead * (charHeight + lineSpacing);
tempCharRecs[index].height = charHeight; tempCharRecs[index].height = charHeight;
@ -564,14 +564,14 @@ static SpriteFont LoadImageFont(Image image, Color key, int firstChar)
lineToRead++; lineToRead++;
xPosToRead = charSpacing; xPosToRead = charSpacing;
} }
free(pixels); free(pixels);
TraceLog(DEBUG, "SpriteFont data parsed correctly from image"); TraceLog(DEBUG, "SpriteFont data parsed correctly from image");
// Create spritefont with all data parsed from image // Create spritefont with all data parsed from image
SpriteFont spriteFont = { 0 }; SpriteFont spriteFont = { 0 };
spriteFont.texture = LoadTextureFromImage(image); // Convert loaded image to OpenGL texture spriteFont.texture = LoadTextureFromImage(image); // Convert loaded image to OpenGL texture
spriteFont.numChars = index; spriteFont.numChars = index;
@ -586,13 +586,15 @@ static SpriteFont LoadImageFont(Image image, Color key, int firstChar)
{ {
spriteFont.charValues[i] = tempCharValues[i]; spriteFont.charValues[i] = tempCharValues[i];
spriteFont.charRecs[i] = tempCharRecs[i]; spriteFont.charRecs[i] = tempCharRecs[i];
// NOTE: On image based fonts (XNA style), character offsets and xAdvance are not required (set to 0) // NOTE: On image based fonts (XNA style), character offsets and xAdvance are not required (set to 0)
spriteFont.charOffsets[i] = (Vector2){ 0.0f, 0.0f }; spriteFont.charOffsets[i] = (Vector2){ 0.0f, 0.0f };
spriteFont.charAdvanceX[i] = 0; spriteFont.charAdvanceX[i] = 0;
} }
spriteFont.size = spriteFont.charRecs[0].height; spriteFont.size = spriteFont.charRecs[0].height;
TraceLog(INFO, "Image file loaded correctly as SpriteFont");
return spriteFont; return spriteFont;
} }
@ -631,7 +633,7 @@ static SpriteFont LoadRBMF(const char *fileName)
if (rbmfFile == NULL) if (rbmfFile == NULL)
{ {
TraceLog(WARNING, "[%s] rBMF font file could not be opened, using default font", fileName); TraceLog(WARNING, "[%s] rBMF font file could not be opened, using default font", fileName);
spriteFont = GetDefaultFont(); spriteFont = GetDefaultFont();
} }
else else
@ -670,10 +672,10 @@ static SpriteFont LoadRBMF(const char *fileName)
counter++; counter++;
} }
Image image = LoadImageEx(imagePixels, rbmfHeader.imgWidth, rbmfHeader.imgHeight); Image image = LoadImageEx(imagePixels, rbmfHeader.imgWidth, rbmfHeader.imgHeight);
ImageFormat(&image, UNCOMPRESSED_GRAY_ALPHA); ImageFormat(&image, UNCOMPRESSED_GRAY_ALPHA);
free(imagePixels); free(imagePixels);
TraceLog(DEBUG, "[%s] Image reconstructed correctly, now converting it to texture", fileName); TraceLog(DEBUG, "[%s] Image reconstructed correctly, now converting it to texture", fileName);
@ -685,7 +687,7 @@ static SpriteFont LoadRBMF(const char *fileName)
//TraceLog(INFO, "[%s] Starting chars set reconstruction", fileName); //TraceLog(INFO, "[%s] Starting chars set reconstruction", fileName);
// Get characters data using rbmfCharWidthData, rbmfHeader.charHeight, charsDivisor, rbmfHeader.numChars // Get characters data using rbmfCharWidthData, rbmfHeader.charHeight, charsDivisor, rbmfHeader.numChars
spriteFont.charValues = (int *)malloc(spriteFont.numChars*sizeof(int)); spriteFont.charValues = (int *)malloc(spriteFont.numChars*sizeof(int));
spriteFont.charRecs = (Rectangle *)malloc(spriteFont.numChars*sizeof(Rectangle)); spriteFont.charRecs = (Rectangle *)malloc(spriteFont.numChars*sizeof(Rectangle));
spriteFont.charOffsets = (Vector2 *)malloc(spriteFont.numChars*sizeof(Vector2)); spriteFont.charOffsets = (Vector2 *)malloc(spriteFont.numChars*sizeof(Vector2));
spriteFont.charAdvanceX = (int *)malloc(spriteFont.numChars*sizeof(int)); spriteFont.charAdvanceX = (int *)malloc(spriteFont.numChars*sizeof(int));
@ -697,12 +699,12 @@ static SpriteFont LoadRBMF(const char *fileName)
for (int i = 0; i < spriteFont.numChars; i++) for (int i = 0; i < spriteFont.numChars; i++)
{ {
spriteFont.charValues[i] = (int)rbmfHeader.firstChar + i; spriteFont.charValues[i] = (int)rbmfHeader.firstChar + i;
spriteFont.charRecs[i].x = currentPosX; spriteFont.charRecs[i].x = currentPosX;
spriteFont.charRecs[i].y = charsDivisor + currentLine * ((int)rbmfHeader.charHeight + charsDivisor); spriteFont.charRecs[i].y = charsDivisor + currentLine * ((int)rbmfHeader.charHeight + charsDivisor);
spriteFont.charRecs[i].width = (int)rbmfCharWidthData[i]; spriteFont.charRecs[i].width = (int)rbmfCharWidthData[i];
spriteFont.charRecs[i].height = (int)rbmfHeader.charHeight; spriteFont.charRecs[i].height = (int)rbmfHeader.charHeight;
// NOTE: On image based fonts (XNA style), character offsets and xAdvance are not required (set to 0) // NOTE: On image based fonts (XNA style), character offsets and xAdvance are not required (set to 0)
spriteFont.charOffsets[i] = (Vector2){ 0.0f, 0.0f }; spriteFont.charOffsets[i] = (Vector2){ 0.0f, 0.0f };
spriteFont.charAdvanceX[i] = 0; spriteFont.charAdvanceX[i] = 0;
@ -720,7 +722,7 @@ static SpriteFont LoadRBMF(const char *fileName)
} }
else currentPosX = testPosX; else currentPosX = testPosX;
} }
spriteFont.size = spriteFont.charRecs[0].height; spriteFont.size = spriteFont.charRecs[0].height;
TraceLog(INFO, "[%s] rBMF file loaded correctly as SpriteFont", fileName); TraceLog(INFO, "[%s] rBMF file loaded correctly as SpriteFont", fileName);
@ -738,20 +740,20 @@ static SpriteFont LoadRBMF(const char *fileName)
static SpriteFont LoadBMFont(const char *fileName) static SpriteFont LoadBMFont(const char *fileName)
{ {
#define MAX_BUFFER_SIZE 256 #define MAX_BUFFER_SIZE 256
SpriteFont font = { 0 }; SpriteFont font = { 0 };
font.texture.id = 0; font.texture.id = 0;
char buffer[MAX_BUFFER_SIZE]; char buffer[MAX_BUFFER_SIZE];
char *searchPoint = NULL; char *searchPoint = NULL;
int fontSize = 0; int fontSize = 0;
int texWidth, texHeight; int texWidth, texHeight;
char texFileName[128]; char texFileName[128];
int numChars = 0; int numChars = 0;
int base; // Useless data int base; // Useless data
FILE *fntFile; FILE *fntFile;
fntFile = fopen(fileName, "rt"); fntFile = fopen(fileName, "rt");
@ -766,42 +768,42 @@ static SpriteFont LoadBMFont(const char *fileName)
fgets(buffer, MAX_BUFFER_SIZE, fntFile); fgets(buffer, MAX_BUFFER_SIZE, fntFile);
//searchPoint = strstr(buffer, "size"); //searchPoint = strstr(buffer, "size");
//sscanf(searchPoint, "size=%i", &fontSize); //sscanf(searchPoint, "size=%i", &fontSize);
fgets(buffer, MAX_BUFFER_SIZE, fntFile); fgets(buffer, MAX_BUFFER_SIZE, fntFile);
searchPoint = strstr(buffer, "lineHeight"); searchPoint = strstr(buffer, "lineHeight");
sscanf(searchPoint, "lineHeight=%i base=%i scaleW=%i scaleH=%i", &fontSize, &base, &texWidth, &texHeight); sscanf(searchPoint, "lineHeight=%i base=%i scaleW=%i scaleH=%i", &fontSize, &base, &texWidth, &texHeight);
TraceLog(DEBUG, "[%s] Font size: %i", fileName, fontSize); TraceLog(DEBUG, "[%s] Font size: %i", fileName, fontSize);
TraceLog(DEBUG, "[%s] Font texture scale: %ix%i", fileName, texWidth, texHeight); TraceLog(DEBUG, "[%s] Font texture scale: %ix%i", fileName, texWidth, texHeight);
fgets(buffer, MAX_BUFFER_SIZE, fntFile); fgets(buffer, MAX_BUFFER_SIZE, fntFile);
searchPoint = strstr(buffer, "file"); searchPoint = strstr(buffer, "file");
sscanf(searchPoint, "file=\"%128[^\"]\"", texFileName); sscanf(searchPoint, "file=\"%128[^\"]\"", texFileName);
TraceLog(DEBUG, "[%s] Font texture filename: %s", fileName, texFileName); TraceLog(DEBUG, "[%s] Font texture filename: %s", fileName, texFileName);
fgets(buffer, MAX_BUFFER_SIZE, fntFile); fgets(buffer, MAX_BUFFER_SIZE, fntFile);
searchPoint = strstr(buffer, "count"); searchPoint = strstr(buffer, "count");
sscanf(searchPoint, "count=%i", &numChars); sscanf(searchPoint, "count=%i", &numChars);
TraceLog(DEBUG, "[%s] Font num chars: %i", fileName, numChars); TraceLog(DEBUG, "[%s] Font num chars: %i", fileName, numChars);
// Compose correct path using route of .fnt file (fileName) and texFileName // Compose correct path using route of .fnt file (fileName) and texFileName
char *texPath = NULL; char *texPath = NULL;
char *lastSlash = NULL; char *lastSlash = NULL;
lastSlash = strrchr(fileName, '/'); lastSlash = strrchr(fileName, '/');
// NOTE: We need some extra space to avoid memory corruption on next allocations! // NOTE: We need some extra space to avoid memory corruption on next allocations!
texPath = malloc(strlen(fileName) - strlen(lastSlash) + strlen(texFileName) + 4); texPath = malloc(strlen(fileName) - strlen(lastSlash) + strlen(texFileName) + 4);
// NOTE: strcat() and strncat() required a '\0' terminated string to work! // NOTE: strcat() and strncat() required a '\0' terminated string to work!
*texPath = '\0'; *texPath = '\0';
strncat(texPath, fileName, strlen(fileName) - strlen(lastSlash) + 1); strncat(texPath, fileName, strlen(fileName) - strlen(lastSlash) + 1);
strncat(texPath, texFileName, strlen(texFileName)); strncat(texPath, texFileName, strlen(texFileName));
TraceLog(DEBUG, "[%s] Font texture loading path: %s", fileName, texPath); TraceLog(DEBUG, "[%s] Font texture loading path: %s", fileName, texPath);
font.texture = LoadTexture(texPath); font.texture = LoadTexture(texPath);
font.size = fontSize; font.size = fontSize;
font.numChars = numChars; font.numChars = numChars;
@ -809,35 +811,35 @@ static SpriteFont LoadBMFont(const char *fileName)
font.charRecs = (Rectangle *)malloc(numChars*sizeof(Rectangle)); font.charRecs = (Rectangle *)malloc(numChars*sizeof(Rectangle));
font.charOffsets = (Vector2 *)malloc(numChars*sizeof(Vector2)); font.charOffsets = (Vector2 *)malloc(numChars*sizeof(Vector2));
font.charAdvanceX = (int *)malloc(numChars*sizeof(int)); font.charAdvanceX = (int *)malloc(numChars*sizeof(int));
free(texPath); free(texPath);
int charId, charX, charY, charWidth, charHeight, charOffsetX, charOffsetY, charAdvanceX; int charId, charX, charY, charWidth, charHeight, charOffsetX, charOffsetY, charAdvanceX;
bool unorderedChars = false; bool unorderedChars = false;
int firstChar = 0; int firstChar = 0;
for (int i = 0; i < numChars; i++) for (int i = 0; i < numChars; i++)
{ {
fgets(buffer, MAX_BUFFER_SIZE, fntFile); fgets(buffer, MAX_BUFFER_SIZE, fntFile);
sscanf(buffer, "char id=%i x=%i y=%i width=%i height=%i xoffset=%i yoffset=%i xadvance=%i", sscanf(buffer, "char id=%i x=%i y=%i width=%i height=%i xoffset=%i yoffset=%i xadvance=%i",
&charId, &charX, &charY, &charWidth, &charHeight, &charOffsetX, &charOffsetY, &charAdvanceX); &charId, &charX, &charY, &charWidth, &charHeight, &charOffsetX, &charOffsetY, &charAdvanceX);
if (i == 0) firstChar = charId; if (i == 0) firstChar = charId;
else if (i != (charId - firstChar)) unorderedChars = true; else if (i != (charId - firstChar)) unorderedChars = true;
// Save data properly in sprite font // Save data properly in sprite font
font.charValues[i] = charId; font.charValues[i] = charId;
font.charRecs[i] = (Rectangle){ charX, charY, charWidth, charHeight }; font.charRecs[i] = (Rectangle){ charX, charY, charWidth, charHeight };
font.charOffsets[i] = (Vector2){ (float)charOffsetX, (float)charOffsetY }; font.charOffsets[i] = (Vector2){ (float)charOffsetX, (float)charOffsetY };
font.charAdvanceX[i] = charAdvanceX; font.charAdvanceX[i] = charAdvanceX;
} }
fclose(fntFile); fclose(fntFile);
if (firstChar != FONT_FIRST_CHAR) TraceLog(WARNING, "BMFont not supported: expected SPACE(32) as first character, falling back to default font"); if (firstChar != FONT_FIRST_CHAR) TraceLog(WARNING, "BMFont not supported: expected SPACE(32) as first character, falling back to default font");
else if (unorderedChars) TraceLog(WARNING, "BMFont not supported: unordered chars data, falling back to default font"); else if (unorderedChars) TraceLog(WARNING, "BMFont not supported: unordered chars data, falling back to default font");
// NOTE: Font data could be not ordered by charId: 32,33,34,35... raylib does not support unordered BMFonts // NOTE: Font data could be not ordered by charId: 32,33,34,35... raylib does not support unordered BMFonts
if ((firstChar != FONT_FIRST_CHAR) || (unorderedChars) || (font.texture.id == 0)) if ((firstChar != FONT_FIRST_CHAR) || (unorderedChars) || (font.texture.id == 0))
{ {
@ -862,9 +864,9 @@ static SpriteFont LoadTTF(const char *fileName, int fontSize, int firstChar, int
stbtt_bakedchar *charData = (stbtt_bakedchar *)malloc(sizeof(stbtt_bakedchar)*numChars); stbtt_bakedchar *charData = (stbtt_bakedchar *)malloc(sizeof(stbtt_bakedchar)*numChars);
SpriteFont font = { 0 }; SpriteFont font = { 0 };
FILE *ttfFile = fopen(fileName, "rb"); FILE *ttfFile = fopen(fileName, "rb");
if (ttfFile == NULL) if (ttfFile == NULL)
{ {
TraceLog(WARNING, "[%s] FNT file could not be opened", fileName); TraceLog(WARNING, "[%s] FNT file could not be opened", fileName);
@ -877,11 +879,11 @@ static SpriteFont LoadTTF(const char *fileName, int fontSize, int firstChar, int
stbtt_BakeFontBitmap(ttfBuffer,0, fontSize, dataBitmap, FONT_TEXTURE_WIDTH, FONT_TEXTURE_HEIGHT, firstChar, numChars, charData); stbtt_BakeFontBitmap(ttfBuffer,0, fontSize, dataBitmap, FONT_TEXTURE_WIDTH, FONT_TEXTURE_HEIGHT, firstChar, numChars, charData);
free(ttfBuffer); free(ttfBuffer);
// Convert image data from grayscale to to UNCOMPRESSED_GRAY_ALPHA // Convert image data from grayscale to to UNCOMPRESSED_GRAY_ALPHA
unsigned char *dataGrayAlpha = (unsigned char *)malloc(FONT_TEXTURE_WIDTH*FONT_TEXTURE_HEIGHT*sizeof(unsigned char)*2); // Two channels unsigned char *dataGrayAlpha = (unsigned char *)malloc(FONT_TEXTURE_WIDTH*FONT_TEXTURE_HEIGHT*sizeof(unsigned char)*2); // Two channels
int k = 0; int k = 0;
for (int i = 0; i < FONT_TEXTURE_WIDTH*FONT_TEXTURE_HEIGHT; i++) for (int i = 0; i < FONT_TEXTURE_WIDTH*FONT_TEXTURE_HEIGHT; i++)
{ {
dataGrayAlpha[k] = 255; dataGrayAlpha[k] = 255;
@ -889,9 +891,9 @@ static SpriteFont LoadTTF(const char *fileName, int fontSize, int firstChar, int
k += 2; k += 2;
} }
free(dataBitmap); free(dataBitmap);
// Sprite font generation from TTF extracted data // Sprite font generation from TTF extracted data
Image image; Image image;
image.width = FONT_TEXTURE_WIDTH; image.width = FONT_TEXTURE_WIDTH;
@ -909,7 +911,7 @@ static SpriteFont LoadTTF(const char *fileName, int fontSize, int firstChar, int
font.charRecs = (Rectangle *)malloc(font.numChars*sizeof(Rectangle)); font.charRecs = (Rectangle *)malloc(font.numChars*sizeof(Rectangle));
font.charOffsets = (Vector2 *)malloc(font.numChars*sizeof(Vector2)); font.charOffsets = (Vector2 *)malloc(font.numChars*sizeof(Vector2));
font.charAdvanceX = (int *)malloc(font.numChars*sizeof(int)); font.charAdvanceX = (int *)malloc(font.numChars*sizeof(int));
for (int i = 0; i < font.numChars; i++) for (int i = 0; i < font.numChars; i++)
{ {
font.charValues[i] = i + firstChar; font.charValues[i] = i + firstChar;
@ -918,11 +920,11 @@ static SpriteFont LoadTTF(const char *fileName, int fontSize, int firstChar, int
font.charRecs[i].y = (int)charData[i].y0; font.charRecs[i].y = (int)charData[i].y0;
font.charRecs[i].width = (int)charData[i].x1 - (int)charData[i].x0; font.charRecs[i].width = (int)charData[i].x1 - (int)charData[i].x0;
font.charRecs[i].height = (int)charData[i].y1 - (int)charData[i].y0; font.charRecs[i].height = (int)charData[i].y1 - (int)charData[i].y0;
font.charOffsets[i] = (Vector2){ charData[i].xoff, charData[i].yoff }; font.charOffsets[i] = (Vector2){ charData[i].xoff, charData[i].yoff };
font.charAdvanceX[i] = (int)charData[i].xadvance; font.charAdvanceX[i] = (int)charData[i].xadvance;
} }
free(charData); free(charData);
return font; return font;

File diff suppressed because it is too large Load diff

View file

@ -5,11 +5,12 @@
* This template has been created using raylib 1.2 (www.raylib.com) * This template has been created using raylib 1.2 (www.raylib.com)
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
* *
* Copyright (c) 2014 Ramon Santamaria (Ray San - raysan@raysanweb.com) * Copyright (c) 2014-2016 Ramon Santamaria (@raysan5)
* *
--> -->
<!-- NOTE: Game package name must be unique for every app/game -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.raysan5.raylib_test" package="com.raylib.game_sample"
android:versionCode="1" android:versionCode="1"
android:versionName="1.0" > android:versionName="1.0" >

View file

@ -4,7 +4,7 @@
# #
# Game template makefile # Game template makefile
# #
# Copyright (c) 2014 Ramon Santamaria (Ray San - raysan@raysanweb.com) # Copyright (c) 2014-2016 Ramon Santamaria (@raysan5)
# #
# This software is provided "as-is", without any express or implied warranty. In no event # 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. # will the authors be held liable for any damages arising from the use of this software.
@ -27,7 +27,6 @@
LOCAL_PATH := $(call my-dir) LOCAL_PATH := $(call my-dir)
# OpenAL module (prebuilt static library) # OpenAL module (prebuilt static library)
# NOTE: Shared library brokes the build! Why?
#-------------------------------------------------------------------- #--------------------------------------------------------------------
include $(CLEAR_VARS) include $(CLEAR_VARS)
@ -41,7 +40,6 @@ LOCAL_SRC_FILES := libs/libopenal.a
LOCAL_EXPORT_C_INCLUDES := include LOCAL_EXPORT_C_INCLUDES := include
# Build static library # Build static library
#include $(PREBUILT_SHARED_LIBRARY)
include $(PREBUILT_STATIC_LIBRARY) include $(PREBUILT_STATIC_LIBRARY)
#-------------------------------------------------------------------- #--------------------------------------------------------------------

View file

@ -1,6 +1,6 @@
/********************************************************************************************** /**********************************************************************************************
* *
* raylib 1.5.0 (www.raylib.com) * raylib 1.6.0 (www.raylib.com)
* *
* A simple and easy-to-use library to learn videogames programming * A simple and easy-to-use library to learn videogames programming
* *
@ -81,6 +81,14 @@
typedef struct android_app; // Define android_app struct (android_native_app_glue.h) typedef struct android_app; // Define android_app struct (android_native_app_glue.h)
#endif #endif
#if defined(_WIN32) && defined(BUILDING_DLL)
#define RLAPI __declspec(dllexport) // We are building raylib as a Win32 DLL
#elif defined(_WIN32) && defined(RAYLIB_DLL)
#define RLAPI __declspec(dllimport) // We are using raylib as a Win32 DLL
#else
#define RLAPI // We are building or using raylib as a static library (or Linux shared library)
#endif
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Some basic Defines // Some basic Defines
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
@ -185,17 +193,20 @@
#define GAMEPAD_PLAYER4 3 // Not supported #define GAMEPAD_PLAYER4 3 // Not supported
// Gamepad Buttons // Gamepad Buttons
// NOTE: Adjusted for a PS3 USB Controller
#define GAMEPAD_BUTTON_A 2 // PS3 USB Controller
#define GAMEPAD_BUTTON_B 1 #define GAMEPAD_PS3_BUTTON_A 2
#define GAMEPAD_BUTTON_X 3 #define GAMEPAD_PS3_BUTTON_B 1
#define GAMEPAD_BUTTON_Y 4 #define GAMEPAD_PS3_BUTTON_X 3
#define GAMEPAD_BUTTON_R1 7 #define GAMEPAD_PS3_BUTTON_Y 4
#define GAMEPAD_BUTTON_R2 5 #define GAMEPAD_PS3_BUTTON_R1 7
#define GAMEPAD_BUTTON_L1 6 #define GAMEPAD_PS3_BUTTON_R2 5
#define GAMEPAD_BUTTON_L2 8 #define GAMEPAD_PS3_BUTTON_L1 6
#define GAMEPAD_BUTTON_SELECT 9 #define GAMEPAD_PS3_BUTTON_L2 8
#define GAMEPAD_BUTTON_START 10 #define GAMEPAD_PS3_BUTTON_SELECT 9
#define GAMEPAD_PS3_BUTTON_START 10
// TODO: Add PS3 d-pad axis
// Xbox360 USB Controller Buttons // Xbox360 USB Controller Buttons
#define GAMEPAD_XBOX_BUTTON_A 0 #define GAMEPAD_XBOX_BUTTON_A 0
@ -233,44 +244,56 @@
#define ANDROID_VOLUME_UP 24 #define ANDROID_VOLUME_UP 24
#define ANDROID_VOLUME_DOWN 25 #define ANDROID_VOLUME_DOWN 25
// NOTE: MSC C++ compiler does not support compound literals (C99 feature)
// Plain structures in C++ (without constructors) can be initialized from { } initializers.
#ifdef __cplusplus
#define CLITERAL
#else
#define CLITERAL (Color)
#endif
// Some Basic Colors // Some Basic Colors
// NOTE: Custom raylib color palette for amazing visuals on WHITE background // NOTE: Custom raylib color palette for amazing visuals on WHITE background
#define LIGHTGRAY (Color){ 200, 200, 200, 255 } // Light Gray #define LIGHTGRAY CLITERAL{ 200, 200, 200, 255 } // Light Gray
#define GRAY (Color){ 130, 130, 130, 255 } // Gray #define GRAY CLITERAL{ 130, 130, 130, 255 } // Gray
#define DARKGRAY (Color){ 80, 80, 80, 255 } // Dark Gray #define DARKGRAY CLITERAL{ 80, 80, 80, 255 } // Dark Gray
#define YELLOW (Color){ 253, 249, 0, 255 } // Yellow #define YELLOW CLITERAL{ 253, 249, 0, 255 } // Yellow
#define GOLD (Color){ 255, 203, 0, 255 } // Gold #define GOLD CLITERAL{ 255, 203, 0, 255 } // Gold
#define ORANGE (Color){ 255, 161, 0, 255 } // Orange #define ORANGE CLITERAL{ 255, 161, 0, 255 } // Orange
#define PINK (Color){ 255, 109, 194, 255 } // Pink #define PINK CLITERAL{ 255, 109, 194, 255 } // Pink
#define RED (Color){ 230, 41, 55, 255 } // Red #define RED CLITERAL{ 230, 41, 55, 255 } // Red
#define MAROON (Color){ 190, 33, 55, 255 } // Maroon #define MAROON CLITERAL{ 190, 33, 55, 255 } // Maroon
#define GREEN (Color){ 0, 228, 48, 255 } // Green #define GREEN CLITERAL{ 0, 228, 48, 255 } // Green
#define LIME (Color){ 0, 158, 47, 255 } // Lime #define LIME CLITERAL{ 0, 158, 47, 255 } // Lime
#define DARKGREEN (Color){ 0, 117, 44, 255 } // Dark Green #define DARKGREEN CLITERAL{ 0, 117, 44, 255 } // Dark Green
#define SKYBLUE (Color){ 102, 191, 255, 255 } // Sky Blue #define SKYBLUE CLITERAL{ 102, 191, 255, 255 } // Sky Blue
#define BLUE (Color){ 0, 121, 241, 255 } // Blue #define BLUE CLITERAL{ 0, 121, 241, 255 } // Blue
#define DARKBLUE (Color){ 0, 82, 172, 255 } // Dark Blue #define DARKBLUE CLITERAL{ 0, 82, 172, 255 } // Dark Blue
#define PURPLE (Color){ 200, 122, 255, 255 } // Purple #define PURPLE CLITERAL{ 200, 122, 255, 255 } // Purple
#define VIOLET (Color){ 135, 60, 190, 255 } // Violet #define VIOLET CLITERAL{ 135, 60, 190, 255 } // Violet
#define DARKPURPLE (Color){ 112, 31, 126, 255 } // Dark Purple #define DARKPURPLE CLITERAL{ 112, 31, 126, 255 } // Dark Purple
#define BEIGE (Color){ 211, 176, 131, 255 } // Beige #define BEIGE CLITERAL{ 211, 176, 131, 255 } // Beige
#define BROWN (Color){ 127, 106, 79, 255 } // Brown #define BROWN CLITERAL{ 127, 106, 79, 255 } // Brown
#define DARKBROWN (Color){ 76, 63, 47, 255 } // Dark Brown #define DARKBROWN CLITERAL{ 76, 63, 47, 255 } // Dark Brown
#define WHITE (Color){ 255, 255, 255, 255 } // White #define WHITE CLITERAL{ 255, 255, 255, 255 } // White
#define BLACK (Color){ 0, 0, 0, 255 } // Black #define BLACK CLITERAL{ 0, 0, 0, 255 } // Black
#define BLANK (Color){ 0, 0, 0, 0 } // Blank (Transparent) #define BLANK CLITERAL{ 0, 0, 0, 0 } // Blank (Transparent)
#define MAGENTA (Color){ 255, 0, 255, 255 } // Magenta #define MAGENTA CLITERAL{ 255, 0, 255, 255 } // Magenta
#define RAYWHITE (Color){ 245, 245, 245, 255 } // My own White (raylib logo) #define RAYWHITE CLITERAL{ 245, 245, 245, 255 } // My own White (raylib logo)
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Types and Structures Definition // Types and Structures Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
#ifndef __cplusplus #ifndef __cplusplus
// Boolean type // Boolean type
#if !defined(_STDBOOL_H) #ifndef __APPLE__
typedef enum { false, true } bool; #if !defined(_STDBOOL_H)
#define _STDBOOL_H typedef enum { false, true } bool;
#define _STDBOOL_H
#endif
#else
#include <stdbool.h>
#endif #endif
#endif #endif
@ -393,7 +416,7 @@ typedef struct Mesh {
// Shader type (generic shader) // Shader type (generic shader)
typedef struct Shader { typedef struct Shader {
unsigned int id; // Shader program id unsigned int id; // Shader program id
// Vertex attributes locations (default locations) // Vertex attributes locations (default locations)
int vertexLoc; // Vertex attribute location point (default-location = 0) int vertexLoc; // Vertex attribute location point (default-location = 0)
int texcoordLoc; // Texcoord attribute location point (default-location = 1) int texcoordLoc; // Texcoord attribute location point (default-location = 1)
@ -405,7 +428,7 @@ typedef struct Shader {
// Uniform locations // Uniform locations
int mvpLoc; // ModelView-Projection matrix uniform location point (vertex shader) int mvpLoc; // ModelView-Projection matrix uniform location point (vertex shader)
int tintColorLoc; // Diffuse color uniform location point (fragment shader) int tintColorLoc; // Diffuse color uniform location point (fragment shader)
// Texture map locations (generic for any kind of map) // Texture map locations (generic for any kind of map)
int mapTexture0Loc; // Map texture uniform location point (default-texture-unit = 0) int mapTexture0Loc; // Map texture uniform location point (default-texture-unit = 0)
int mapTexture1Loc; // Map texture uniform location point (default-texture-unit = 1) int mapTexture1Loc; // Map texture uniform location point (default-texture-unit = 1)
@ -419,11 +442,11 @@ typedef struct Material {
Texture2D texDiffuse; // Diffuse texture (binded to shader mapTexture0Loc) Texture2D texDiffuse; // Diffuse texture (binded to shader mapTexture0Loc)
Texture2D texNormal; // Normal texture (binded to shader mapTexture1Loc) Texture2D texNormal; // Normal texture (binded to shader mapTexture1Loc)
Texture2D texSpecular; // Specular texture (binded to shader mapTexture2Loc) Texture2D texSpecular; // Specular texture (binded to shader mapTexture2Loc)
Color colDiffuse; // Diffuse color Color colDiffuse; // Diffuse color
Color colAmbient; // Ambient color Color colAmbient; // Ambient color
Color colSpecular; // Specular color Color colSpecular; // Specular color
float glossiness; // Glossiness level (Ranges from 0 to 1000) float glossiness; // Glossiness level (Ranges from 0 to 1000)
} Material; } Material;
@ -439,14 +462,14 @@ typedef struct LightData {
unsigned int id; // Light unique id unsigned int id; // Light unique id
bool enabled; // Light enabled bool enabled; // Light enabled
int type; // Light type: LIGHT_POINT, LIGHT_DIRECTIONAL, LIGHT_SPOT int type; // Light type: LIGHT_POINT, LIGHT_DIRECTIONAL, LIGHT_SPOT
Vector3 position; // Light position Vector3 position; // Light position
Vector3 target; // Light target: LIGHT_DIRECTIONAL and LIGHT_SPOT (cone direction target) Vector3 target; // Light target: LIGHT_DIRECTIONAL and LIGHT_SPOT (cone direction target)
float radius; // Light attenuation radius light intensity reduced with distance (world distance) float radius; // Light attenuation radius light intensity reduced with distance (world distance)
Color diffuse; // Light diffuse color Color diffuse; // Light diffuse color
float intensity; // Light intensity level float intensity; // Light intensity level
float coneAngle; // Light cone max angle: LIGHT_SPOT float coneAngle; // Light cone max angle: LIGHT_SPOT
} LightData, *Light; } LightData, *Light;
@ -461,19 +484,35 @@ typedef struct Ray {
// Sound source type // Sound source type
typedef struct Sound { typedef struct Sound {
unsigned int source; // Sound audio source id unsigned int source; // OpenAL audio source id
unsigned int buffer; // Sound audio buffer id unsigned int buffer; // OpenAL audio buffer id
} Sound; } Sound;
// Wave type, defines audio wave data // Wave type, defines audio wave data
typedef struct Wave { typedef struct Wave {
unsigned int sampleCount; // Number of samples
unsigned int sampleRate; // Frequency (samples per second)
unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported)
unsigned int channels; // Number of channels (1-mono, 2-stereo)
void *data; // Buffer data pointer void *data; // Buffer data pointer
unsigned int dataSize; // Data size in bytes
unsigned int sampleRate; // Samples per second to be played
short bitsPerSample; // Sample size in bits
short channels;
} Wave; } Wave;
// Music type (file streaming from memory)
// NOTE: Anything longer than ~10 seconds should be streamed
typedef struct MusicData *Music;
// Audio stream type
// NOTE: Useful to create custom audio streams not bound to a specific file
typedef struct AudioStream {
unsigned int sampleRate; // Frequency (samples per second)
unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported)
unsigned int channels; // Number of channels (1-mono, 2-stereo)
int format; // OpenAL audio format specifier
unsigned int source; // OpenAL audio source id
unsigned int buffers[2]; // OpenAL audio buffers (double buffering)
} AudioStream;
// Texture formats // Texture formats
// NOTE: Support depends on OpenGL version and platform // NOTE: Support depends on OpenGL version and platform
typedef enum { typedef enum {
@ -516,18 +555,6 @@ typedef enum {
GESTURE_PINCH_OUT = 512 GESTURE_PINCH_OUT = 512
} Gestures; } Gestures;
// Touch action (fingers or mouse)
typedef enum { TOUCH_UP, TOUCH_DOWN, TOUCH_MOVE } TouchAction;
// Gesture events
// NOTE: MAX_TOUCH_POINTS fixed to 2
typedef struct GestureEvent {
int touchAction;
int pointCount;
int pointerId[MAX_TOUCH_POINTS];
Vector2 position[MAX_TOUCH_POINTS];
} GestureEvent;
// Camera system modes // Camera system modes
typedef enum { CAMERA_CUSTOM = 0, CAMERA_FREE, CAMERA_ORBITAL, CAMERA_FIRST_PERSON, CAMERA_THIRD_PERSON } CameraMode; typedef enum { CAMERA_CUSTOM = 0, CAMERA_FREE, CAMERA_ORBITAL, CAMERA_FIRST_PERSON, CAMERA_THIRD_PERSON } CameraMode;
@ -557,94 +584,94 @@ extern "C" { // Prevents name mangling of functions
// Window and Graphics Device Functions (Module: core) // Window and Graphics Device Functions (Module: core)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
#if defined(PLATFORM_ANDROID) #if defined(PLATFORM_ANDROID)
void InitWindow(int width, int height, struct android_app *state); // Init Android Activity and OpenGL Graphics RLAPI void InitWindow(int width, int height, struct android_app *state); // Init Android Activity and OpenGL Graphics
#elif defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) #elif defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB)
void InitWindow(int width, int height, const char *title); // Initialize Window and OpenGL Graphics RLAPI void InitWindow(int width, int height, const char *title); // Initialize Window and OpenGL Graphics
#endif #endif
void CloseWindow(void); // Close Window and Terminate Context RLAPI void CloseWindow(void); // Close Window and Terminate Context
bool WindowShouldClose(void); // Detect if KEY_ESCAPE pressed or Close icon pressed RLAPI bool WindowShouldClose(void); // Detect if KEY_ESCAPE pressed or Close icon pressed
bool IsWindowMinimized(void); // Detect if window has been minimized (or lost focus) RLAPI bool IsWindowMinimized(void); // Detect if window has been minimized (or lost focus)
void ToggleFullscreen(void); // Fullscreen toggle (only PLATFORM_DESKTOP) RLAPI void ToggleFullscreen(void); // Fullscreen toggle (only PLATFORM_DESKTOP)
int GetScreenWidth(void); // Get current screen width RLAPI int GetScreenWidth(void); // Get current screen width
int GetScreenHeight(void); // Get current screen height RLAPI int GetScreenHeight(void); // Get current screen height
void ShowCursor(void); // Shows cursor RLAPI void ShowCursor(void); // Shows cursor
void HideCursor(void); // Hides cursor RLAPI void HideCursor(void); // Hides cursor
bool IsCursorHidden(void); // Returns true if cursor is not visible RLAPI bool IsCursorHidden(void); // Returns true if cursor is not visible
void EnableCursor(void); // Enables cursor RLAPI void EnableCursor(void); // Enables cursor
void DisableCursor(void); // Disables cursor RLAPI void DisableCursor(void); // Disables cursor
void ClearBackground(Color color); // Sets Background Color RLAPI void ClearBackground(Color color); // Sets Background Color
void BeginDrawing(void); // Setup drawing canvas to start drawing RLAPI void BeginDrawing(void); // Setup drawing canvas to start drawing
void EndDrawing(void); // End canvas drawing and Swap Buffers (Double Buffering) RLAPI void EndDrawing(void); // End canvas drawing and Swap Buffers (Double Buffering)
void Begin2dMode(Camera2D camera); // Initialize 2D mode with custom camera RLAPI void Begin2dMode(Camera2D camera); // Initialize 2D mode with custom camera
void End2dMode(void); // Ends 2D mode custom camera usage RLAPI void End2dMode(void); // Ends 2D mode custom camera usage
void Begin3dMode(Camera camera); // Initializes 3D mode for drawing (Camera setup) RLAPI void Begin3dMode(Camera camera); // Initializes 3D mode for drawing (Camera setup)
void End3dMode(void); // Ends 3D mode and returns to default 2D orthographic mode RLAPI void End3dMode(void); // Ends 3D mode and returns to default 2D orthographic mode
void BeginTextureMode(RenderTexture2D target); // Initializes render texture for drawing RLAPI void BeginTextureMode(RenderTexture2D target); // Initializes render texture for drawing
void EndTextureMode(void); // Ends drawing to render texture RLAPI void EndTextureMode(void); // Ends drawing to render texture
Ray GetMouseRay(Vector2 mousePosition, Camera camera); // Returns a ray trace from mouse position RLAPI Ray GetMouseRay(Vector2 mousePosition, Camera camera); // Returns a ray trace from mouse position
Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Returns the screen space position from a 3d world space position RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Returns the screen space position from a 3d world space position
Matrix GetCameraMatrix(Camera camera); // Returns camera transform matrix (view matrix) RLAPI Matrix GetCameraMatrix(Camera camera); // Returns camera transform matrix (view matrix)
void SetTargetFPS(int fps); // Set target FPS (maximum) RLAPI void SetTargetFPS(int fps); // Set target FPS (maximum)
float GetFPS(void); // Returns current FPS RLAPI float GetFPS(void); // Returns current FPS
float GetFrameTime(void); // Returns time in seconds for one frame RLAPI float GetFrameTime(void); // Returns time in seconds for one frame
Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value RLAPI Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value
int GetHexValue(Color color); // Returns hexadecimal value for a Color RLAPI int GetHexValue(Color color); // Returns hexadecimal value for a Color
float *ColorToFloat(Color color); // Converts Color to float array and normalizes RLAPI float *ColorToFloat(Color color); // Converts Color to float array and normalizes
float *VectorToFloat(Vector3 vec); // Converts Vector3 to float array RLAPI float *VectorToFloat(Vector3 vec); // Converts Vector3 to float array
float *MatrixToFloat(Matrix mat); // Converts Matrix to float array RLAPI float *MatrixToFloat(Matrix mat); // Converts Matrix to float array
int GetRandomValue(int min, int max); // Returns a random value between min and max (both included) RLAPI int GetRandomValue(int min, int max); // Returns a random value between min and max (both included)
Color Fade(Color color, float alpha); // Color fade-in or fade-out, alpha goes from 0.0f to 1.0f RLAPI Color Fade(Color color, float alpha); // Color fade-in or fade-out, alpha goes from 0.0f to 1.0f
void SetConfigFlags(char flags); // Setup some window configuration flags RLAPI void SetConfigFlags(char flags); // Setup some window configuration flags
void ShowLogo(void); // Activates raylib logo at startup (can be done with flags) RLAPI void ShowLogo(void); // Activates raylib logo at startup (can be done with flags)
bool IsFileDropped(void); // Check if a file have been dropped into window RLAPI bool IsFileDropped(void); // Check if a file have been dropped into window
char **GetDroppedFiles(int *count); // Retrieve dropped files into window RLAPI char **GetDroppedFiles(int *count); // Retrieve dropped files into window
void ClearDroppedFiles(void); // Clear dropped files paths buffer RLAPI void ClearDroppedFiles(void); // Clear dropped files paths buffer
void StorageSaveValue(int position, int value); // Storage save integer value (to defined position) RLAPI void StorageSaveValue(int position, int value); // Storage save integer value (to defined position)
int StorageLoadValue(int position); // Storage load integer value (from defined position) RLAPI int StorageLoadValue(int position); // Storage load integer value (from defined position)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Input Handling Functions (Module: core) // Input Handling Functions (Module: core)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB)
bool IsKeyPressed(int key); // Detect if a key has been pressed once RLAPI bool IsKeyPressed(int key); // Detect if a key has been pressed once
bool IsKeyDown(int key); // Detect if a key is being pressed RLAPI bool IsKeyDown(int key); // Detect if a key is being pressed
bool IsKeyReleased(int key); // Detect if a key has been released once RLAPI bool IsKeyReleased(int key); // Detect if a key has been released once
bool IsKeyUp(int key); // Detect if a key is NOT being pressed RLAPI bool IsKeyUp(int key); // Detect if a key is NOT being pressed
int GetKeyPressed(void); // Get latest key pressed RLAPI int GetKeyPressed(void); // Get latest key pressed
void SetExitKey(int key); // Set a custom key to exit program (default is ESC) RLAPI void SetExitKey(int key); // Set a custom key to exit program (default is ESC)
bool IsGamepadAvailable(int gamepad); // Detect if a gamepad is available RLAPI bool IsGamepadAvailable(int gamepad); // Detect if a gamepad is available
float GetGamepadAxisMovement(int gamepad, int axis); // Return axis movement value for a gamepad axis RLAPI float GetGamepadAxisMovement(int gamepad, int axis); // Return axis movement value for a gamepad axis
bool IsGamepadButtonPressed(int gamepad, int button); // Detect if a gamepad button has been pressed once RLAPI bool IsGamepadButtonPressed(int gamepad, int button); // Detect if a gamepad button has been pressed once
bool IsGamepadButtonDown(int gamepad, int button); // Detect if a gamepad button is being pressed RLAPI bool IsGamepadButtonDown(int gamepad, int button); // Detect if a gamepad button is being pressed
bool IsGamepadButtonReleased(int gamepad, int button); // Detect if a gamepad button has been released once RLAPI bool IsGamepadButtonReleased(int gamepad, int button); // Detect if a gamepad button has been released once
bool IsGamepadButtonUp(int gamepad, int button); // Detect if a gamepad button is NOT being pressed RLAPI bool IsGamepadButtonUp(int gamepad, int button); // Detect if a gamepad button is NOT being pressed
#endif #endif
bool IsMouseButtonPressed(int button); // Detect if a mouse button has been pressed once RLAPI bool IsMouseButtonPressed(int button); // Detect if a mouse button has been pressed once
bool IsMouseButtonDown(int button); // Detect if a mouse button is being pressed RLAPI bool IsMouseButtonDown(int button); // Detect if a mouse button is being pressed
bool IsMouseButtonReleased(int button); // Detect if a mouse button has been released once RLAPI bool IsMouseButtonReleased(int button); // Detect if a mouse button has been released once
bool IsMouseButtonUp(int button); // Detect if a mouse button is NOT being pressed RLAPI bool IsMouseButtonUp(int button); // Detect if a mouse button is NOT being pressed
int GetMouseX(void); // Returns mouse position X RLAPI int GetMouseX(void); // Returns mouse position X
int GetMouseY(void); // Returns mouse position Y RLAPI int GetMouseY(void); // Returns mouse position Y
Vector2 GetMousePosition(void); // Returns mouse position XY RLAPI Vector2 GetMousePosition(void); // Returns mouse position XY
void SetMousePosition(Vector2 position); // Set mouse position XY RLAPI void SetMousePosition(Vector2 position); // Set mouse position XY
int GetMouseWheelMove(void); // Returns mouse wheel movement Y RLAPI int GetMouseWheelMove(void); // Returns mouse wheel movement Y
int GetTouchX(void); // Returns touch position X for touch point 0 (relative to screen size) RLAPI int GetTouchX(void); // Returns touch position X for touch point 0 (relative to screen size)
int GetTouchY(void); // Returns touch position Y for touch point 0 (relative to screen size) RLAPI int GetTouchY(void); // Returns touch position Y for touch point 0 (relative to screen size)
Vector2 GetTouchPosition(int index); // Returns touch position XY for a touch point index (relative to screen size) RLAPI Vector2 GetTouchPosition(int index); // Returns touch position XY for a touch point index (relative to screen size)
#if defined(PLATFORM_ANDROID) #if defined(PLATFORM_ANDROID)
bool IsButtonPressed(int button); // Detect if an android physic button has been pressed bool IsButtonPressed(int button); // Detect if an android physic button has been pressed
@ -655,254 +682,264 @@ bool IsButtonReleased(int button); // Detect if an android
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Gestures and Touch Handling Functions (Module: gestures) // Gestures and Touch Handling Functions (Module: gestures)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void SetGesturesEnabled(unsigned int gestureFlags); // Enable a set of gestures using flags RLAPI void SetGesturesEnabled(unsigned int gestureFlags); // Enable a set of gestures using flags
bool IsGestureDetected(int gesture); // Check if a gesture have been detected RLAPI bool IsGestureDetected(int gesture); // Check if a gesture have been detected
void ProcessGestureEvent(GestureEvent event); // Process gesture event and translate it into gestures RLAPI int GetGestureDetected(void); // Get latest detected gesture
void UpdateGestures(void); // Update gestures detected (called automatically in PollInputEvents()) RLAPI int GetTouchPointsCount(void); // Get touch points count
RLAPI float GetGestureHoldDuration(void); // Get gesture hold time in milliseconds
int GetTouchPointsCount(void); // Get touch points count RLAPI Vector2 GetGestureDragVector(void); // Get gesture drag vector
int GetGestureDetected(void); // Get latest detected gesture RLAPI float GetGestureDragAngle(void); // Get gesture drag angle
float GetGestureHoldDuration(void); // Get gesture hold time in milliseconds RLAPI Vector2 GetGesturePinchVector(void); // Get gesture pinch delta
Vector2 GetGestureDragVector(void); // Get gesture drag vector RLAPI float GetGesturePinchAngle(void); // Get gesture pinch angle
float GetGestureDragAngle(void); // Get gesture drag angle
Vector2 GetGesturePinchVector(void); // Get gesture pinch delta
float GetGesturePinchAngle(void); // Get gesture pinch angle
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Camera System Functions (Module: camera) // Camera System Functions (Module: camera)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void SetCameraMode(int mode); // Set camera mode (multiple camera modes available) RLAPI void SetCameraMode(int mode); // Set camera mode (multiple camera modes available)
void UpdateCamera(Camera *camera); // Update camera (player position is ignored) RLAPI void UpdateCamera(Camera *camera); // Update camera (player position is ignored)
void UpdateCameraPlayer(Camera *camera, Vector3 *position); // Update camera and player position (1st person and 3rd person cameras) RLAPI void UpdateCameraPlayer(Camera *camera, Vector3 *position); // Update camera and player position (1st person and 3rd person cameras)
void SetCameraPosition(Vector3 position); // Set internal camera position RLAPI void SetCameraPosition(Vector3 position); // Set internal camera position
void SetCameraTarget(Vector3 target); // Set internal camera target RLAPI void SetCameraTarget(Vector3 target); // Set internal camera target
void SetCameraFovy(float fovy); // Set internal camera field-of-view-y RLAPI void SetCameraFovy(float fovy); // Set internal camera field-of-view-y
void SetCameraPanControl(int panKey); // Set camera pan key to combine with mouse movement (free camera) RLAPI void SetCameraPanControl(int panKey); // Set camera pan key to combine with mouse movement (free camera)
void SetCameraAltControl(int altKey); // Set camera alt key to combine with mouse movement (free camera) RLAPI void SetCameraAltControl(int altKey); // Set camera alt key to combine with mouse movement (free camera)
void SetCameraSmoothZoomControl(int szKey); // Set camera smooth zoom key to combine with mouse (free camera) RLAPI void SetCameraSmoothZoomControl(int szKey); // Set camera smooth zoom key to combine with mouse (free camera)
void SetCameraMoveControls(int frontKey, int backKey, RLAPI void SetCameraMoveControls(int frontKey, int backKey,
int leftKey, int rightKey, int leftKey, int rightKey,
int upKey, int downKey); // Set camera move controls (1st person and 3rd person cameras) int upKey, int downKey); // Set camera move controls (1st person and 3rd person cameras)
void SetCameraMouseSensitivity(float sensitivity); // Set camera mouse sensitivity (1st person and 3rd person cameras) RLAPI void SetCameraMouseSensitivity(float sensitivity); // Set camera mouse sensitivity (1st person and 3rd person cameras)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Basic Shapes Drawing Functions (Module: shapes) // Basic Shapes Drawing Functions (Module: shapes)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void DrawPixel(int posX, int posY, Color color); // Draw a pixel RLAPI void DrawPixel(int posX, int posY, Color color); // Draw a pixel
void DrawPixelV(Vector2 position, Color color); // Draw a pixel (Vector version) RLAPI 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 RLAPI 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) RLAPI 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 RLAPI 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 RLAPI 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) RLAPI 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 RLAPI 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 RLAPI 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 RLAPI 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 RLAPI 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) RLAPI 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 RLAPI 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 RLAPI 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 RLAPI void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline
void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a regular polygon (Vector version) RLAPI void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a regular polygon (Vector version)
void DrawPolyEx(Vector2 *points, int numPoints, Color color); // Draw a closed polygon defined by points RLAPI void DrawPolyEx(Vector2 *points, int numPoints, Color color); // Draw a closed polygon defined by points
void DrawPolyExLines(Vector2 *points, int numPoints, Color color); // Draw polygon lines RLAPI void DrawPolyExLines(Vector2 *points, int numPoints, Color color); // Draw polygon lines
bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles RLAPI bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles
bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles RLAPI bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles
bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec); // Check collision between circle and rectangle RLAPI bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec); // Check collision between circle and rectangle
Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision
bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle RLAPI bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle
bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle RLAPI bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle
bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle RLAPI bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Texture Loading and Drawing Functions (Module: textures) // Texture Loading and Drawing Functions (Module: textures)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
Image LoadImage(const char *fileName); // Load an image into CPU memory (RAM) RLAPI Image LoadImage(const char *fileName); // Load an image into CPU memory (RAM)
Image LoadImageEx(Color *pixels, int width, int height); // Load image data from Color array data (RGBA - 32bit) RLAPI Image LoadImageEx(Color *pixels, int width, int height); // Load image data from Color array data (RGBA - 32bit)
Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image data from RAW file RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image data from RAW file
Image LoadImageFromRES(const char *rresName, int resId); // Load an image from rRES file (raylib Resource) RLAPI Image LoadImageFromRES(const char *rresName, int resId); // Load an image from rRES file (raylib Resource)
Texture2D LoadTexture(const char *fileName); // Load an image as texture into GPU memory RLAPI Texture2D LoadTexture(const char *fileName); // Load an image as texture into GPU memory
Texture2D LoadTextureEx(void *data, int width, int height, int textureFormat); // Load a texture from raw data into GPU memory RLAPI Texture2D LoadTextureEx(void *data, int width, int height, int textureFormat); // Load a texture from raw data into GPU memory
Texture2D LoadTextureFromRES(const char *rresName, int resId); // Load an image as texture from rRES file (raylib Resource) RLAPI Texture2D LoadTextureFromRES(const char *rresName, int resId); // Load an image as texture from rRES file (raylib Resource)
Texture2D LoadTextureFromImage(Image image); // Load a texture from image data RLAPI Texture2D LoadTextureFromImage(Image image); // Load a texture from image data
RenderTexture2D LoadRenderTexture(int width, int height); // Load a texture to be used for rendering RLAPI RenderTexture2D LoadRenderTexture(int width, int height); // Load a texture to be used for rendering
void UnloadImage(Image image); // Unload image from CPU memory (RAM) RLAPI void UnloadImage(Image image); // Unload image from CPU memory (RAM)
void UnloadTexture(Texture2D texture); // Unload texture from GPU memory RLAPI void UnloadTexture(Texture2D texture); // Unload texture from GPU memory
void UnloadRenderTexture(RenderTexture2D target); // Unload render texture from GPU memory RLAPI void UnloadRenderTexture(RenderTexture2D target); // Unload render texture from GPU memory
Color *GetImageData(Image image); // Get pixel data from image as a Color struct array RLAPI Color *GetImageData(Image image); // Get pixel data from image as a Color struct array
Image GetTextureData(Texture2D texture); // Get pixel data from GPU texture and return an Image RLAPI Image GetTextureData(Texture2D texture); // Get pixel data from GPU texture and return an Image
void ImageToPOT(Image *image, Color fillColor); // Convert image to POT (power-of-two) RLAPI void ImageToPOT(Image *image, Color fillColor); // Convert image to POT (power-of-two)
void ImageFormat(Image *image, int newFormat); // Convert image data to desired format RLAPI void ImageFormat(Image *image, int newFormat); // Convert image data to desired format
void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering)
Image ImageCopy(Image image); // Create an image duplicate (useful for transformations) RLAPI Image ImageCopy(Image image); // Create an image duplicate (useful for transformations)
void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle RLAPI void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle
void ImageResize(Image *image, int newWidth, int newHeight); // Resize and image (bilinear filtering) RLAPI void ImageResize(Image *image, int newWidth, int newHeight); // Resize and image (bilinear filtering)
void ImageResizeNN(Image *image,int newWidth,int newHeight); // Resize and image (Nearest-Neighbor scaling algorithm) RLAPI void ImageResizeNN(Image *image,int newWidth,int newHeight); // Resize and image (Nearest-Neighbor scaling algorithm)
Image ImageText(const char *text, int fontSize, Color color); // Create an image from text (default font) RLAPI Image ImageText(const char *text, int fontSize, Color color); // Create an image from text (default font)
Image ImageTextEx(SpriteFont font, const char *text, int fontSize, int spacing, Color tint); // Create an image from text (custom sprite font) RLAPI Image ImageTextEx(SpriteFont font, const char *text, float fontSize, int spacing, Color tint); // Create an image from text (custom sprite font)
void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec); // Draw a source image within a destination image RLAPI void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec); // Draw a source image within a destination image
void ImageDrawText(Image *dst, Vector2 position, const char *text, int fontSize, Color color); // Draw text (default font) within an image (destination) RLAPI void ImageDrawText(Image *dst, Vector2 position, const char *text, int fontSize, Color color); // Draw text (default font) within an image (destination)
void ImageDrawTextEx(Image *dst, Vector2 position, SpriteFont font, const char *text, int fontSize, int spacing, Color color); // Draw text (custom sprite font) within an image (destination) RLAPI void ImageDrawTextEx(Image *dst, Vector2 position, SpriteFont font, const char *text, float fontSize, int spacing, Color color); // Draw text (custom sprite font) within an image (destination)
void ImageFlipVertical(Image *image); // Flip image vertically RLAPI void ImageFlipVertical(Image *image); // Flip image vertically
void ImageFlipHorizontal(Image *image); // Flip image horizontally RLAPI void ImageFlipHorizontal(Image *image); // Flip image horizontally
void ImageColorTint(Image *image, Color color); // Modify image color: tint RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint
void ImageColorInvert(Image *image); // Modify image color: invert RLAPI void ImageColorInvert(Image *image); // Modify image color: invert
void ImageColorGrayscale(Image *image); // Modify image color: grayscale RLAPI void ImageColorGrayscale(Image *image); // Modify image color: grayscale
void ImageColorContrast(Image *image, float contrast); // Modify image color: contrast (-100 to 100) RLAPI void ImageColorContrast(Image *image, float contrast); // Modify image color: contrast (-100 to 100)
void ImageColorBrightness(Image *image, int brightness); // Modify image color: brightness (-255 to 255) RLAPI void ImageColorBrightness(Image *image, int brightness); // Modify image color: brightness (-255 to 255)
void GenTextureMipmaps(Texture2D texture); // Generate GPU mipmaps for a texture RLAPI void GenTextureMipmaps(Texture2D texture); // Generate GPU mipmaps for a texture
void UpdateTexture(Texture2D texture, void *pixels); // Update GPU texture with new data RLAPI void UpdateTexture(Texture2D texture, void *pixels); // Update GPU texture with new data
void DrawTexture(Texture2D texture, int posX, int posY, Color tint); // Draw a Texture2D RLAPI void DrawTexture(Texture2D texture, int posX, int posY, Color tint); // Draw a Texture2D
void DrawTextureV(Texture2D texture, Vector2 position, Color tint); // Draw a Texture2D with position defined as Vector2 RLAPI void DrawTextureV(Texture2D texture, Vector2 position, Color tint); // Draw a Texture2D with position defined as Vector2
void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint); // Draw a Texture2D with extended parameters RLAPI 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, Color tint); // Draw a part of a texture defined by a rectangle RLAPI void DrawTextureRec(Texture2D texture, Rectangle sourceRec, Vector2 position, Color tint); // Draw a part of a texture defined by a rectangle
void DrawTexturePro(Texture2D texture, Rectangle sourceRec, Rectangle destRec, Vector2 origin, // Draw a part of a texture defined by a rectangle with 'pro' parameters RLAPI void DrawTexturePro(Texture2D texture, Rectangle sourceRec, Rectangle destRec, Vector2 origin, // Draw a part of a texture defined by a rectangle with 'pro' parameters
float rotation, Color tint); float rotation, Color tint);
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Font Loading and Text Drawing Functions (Module: text) // Font Loading and Text Drawing Functions (Module: text)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
SpriteFont GetDefaultFont(void); // Get the default SpriteFont RLAPI SpriteFont GetDefaultFont(void); // Get the default SpriteFont
SpriteFont LoadSpriteFont(const char *fileName); // Load a SpriteFont image into GPU memory RLAPI SpriteFont LoadSpriteFont(const char *fileName); // Load a SpriteFont image into GPU memory
void UnloadSpriteFont(SpriteFont spriteFont); // Unload SpriteFont from GPU memory RLAPI void UnloadSpriteFont(SpriteFont spriteFont); // Unload SpriteFont from GPU memory
void DrawText(const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) RLAPI void DrawText(const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font)
void DrawTextEx(SpriteFont spriteFont, const char* text, Vector2 position, // Draw text using SpriteFont and additional parameters RLAPI void DrawTextEx(SpriteFont spriteFont, const char* text, Vector2 position, // Draw text using SpriteFont and additional parameters
int fontSize, int spacing, Color tint); float fontSize, int spacing, Color tint);
int MeasureText(const char *text, int fontSize); // Measure string width for default font RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font
Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, int fontSize, int spacing); // Measure string size for SpriteFont RLAPI Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, int fontSize, int spacing); // Measure string size for SpriteFont
void DrawFPS(int posX, int posY); // Shows current FPS on top-left corner RLAPI 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' RLAPI const char *FormatText(const char *text, ...); // Formatting of text with variables to 'embed'
const char *SubText(const char *text, int position, int length); // Get a piece of a text string RLAPI const char *SubText(const char *text, int position, int length); // Get a piece of a text string
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Basic 3d Shapes Drawing Functions (Module: models) // Basic 3d Shapes Drawing Functions (Module: models)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void DrawCube(Vector3 position, float width, float height, float lenght, Color color); // Draw cube RLAPI void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space
void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version) RLAPI void DrawCircle3D(Vector3 center, float radius, float rotationAngle, Vector3 rotation, Color color); // Draw a circle in 3D world space
void DrawCubeWires(Vector3 position, float width, float height, float lenght, Color color); // Draw cube wires RLAPI void DrawCube(Vector3 position, float width, float height, float length, Color color); // Draw cube
void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float lenght, Color color); // Draw cube textured RLAPI void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version)
void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere RLAPI void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); // Draw cube wires
void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters RLAPI void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color); // Draw cube textured
void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires RLAPI void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere
void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone RLAPI void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters
void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires RLAPI void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires
void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ RLAPI void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone
void DrawRay(Ray ray, Color color); // Draw a ray line RLAPI void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires
void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) RLAPI void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ
void DrawGizmo(Vector3 position); // Draw simple gizmo RLAPI void DrawRay(Ray ray, Color color); // Draw a ray line
void DrawLight(Light light); // Draw light in 3D world RLAPI void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0))
void Draw3DLine(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space RLAPI void DrawGizmo(Vector3 position); // Draw simple gizmo
void Draw3DCircle(Vector3 center, float radius, float rotationAngle, Vector3 rotation, Color color); // Draw a circle in 3D world space RLAPI void DrawLight(Light light); // Draw light in 3D world
//DrawTorus(), DrawTeapot() are useless... //DrawTorus(), DrawTeapot() are useless...
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Model 3d Loading and Drawing Functions (Module: models) // Model 3d Loading and Drawing Functions (Module: models)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
Model LoadModel(const char *fileName); // Load a 3d model (.OBJ) RLAPI Model LoadModel(const char *fileName); // Load a 3d model (.OBJ)
Model LoadModelEx(Mesh data, bool dynamic); // Load a 3d model (from mesh data) RLAPI Model LoadModelEx(Mesh data, bool dynamic); // Load a 3d model (from mesh data)
Model LoadModelFromRES(const char *rresName, int resId); // Load a 3d model from rRES file (raylib Resource) RLAPI Model LoadModelFromRES(const char *rresName, int resId); // Load a 3d model from rRES file (raylib Resource)
Model LoadHeightmap(Image heightmap, Vector3 size); // Load a heightmap image as a 3d model RLAPI Model LoadHeightmap(Image heightmap, Vector3 size); // Load a heightmap image as a 3d model
Model LoadCubicmap(Image cubicmap); // Load a map image as a 3d model (cubes based) RLAPI Model LoadCubicmap(Image cubicmap); // Load a map image as a 3d model (cubes based)
void UnloadModel(Model model); // Unload 3d model from memory RLAPI void UnloadModel(Model model); // Unload 3d model from memory
Material LoadMaterial(const char *fileName); // Load material data (from file) RLAPI Mesh GenMeshCube(float width, float height, float depth); // Generate mesh: cube
Material LoadDefaultMaterial(void); // Load default material (uses default models shader)
Material LoadStandardMaterial(void); // Load standard material (uses material attributes and lighting shader)
void UnloadMaterial(Material material); // Unload material textures from VRAM
void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set) RLAPI Material LoadMaterial(const char *fileName); // Load material data (from file)
void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters RLAPI Material LoadDefaultMaterial(void); // Load default material (uses default models shader)
void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set) RLAPI Material LoadStandardMaterial(void); // Load standard material (uses material attributes and lighting shader)
void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model wires (with texture if set) with extended parameters RLAPI void UnloadMaterial(Material material); // Unload material textures from VRAM
void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires)
void DrawBillboard(Camera camera, Texture2D texture, Vector3 center, float size, Color tint); // Draw a billboard texture RLAPI void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set)
void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRec, Vector3 center, float size, Color tint); // Draw a billboard texture defined by sourceRec RLAPI void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters
RLAPI void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set)
RLAPI void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model wires (with texture if set) with extended parameters
RLAPI void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires)
BoundingBox CalculateBoundingBox(Mesh mesh); // Calculate mesh bounding box limits RLAPI void DrawBillboard(Camera camera, Texture2D texture, Vector3 center, float size, Color tint); // Draw a billboard texture
bool CheckCollisionSpheres(Vector3 centerA, float radiusA, Vector3 centerB, float radiusB); // Detect collision between two spheres RLAPI void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRec, Vector3 center, float size, Color tint); // Draw a billboard texture defined by sourceRec
bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Detect collision between two bounding boxes
bool CheckCollisionBoxSphere(BoundingBox box, Vector3 centerSphere, float radiusSphere); // Detect collision between box and sphere RLAPI BoundingBox CalculateBoundingBox(Mesh mesh); // Calculate mesh bounding box limits
bool CheckCollisionRaySphere(Ray ray, Vector3 spherePosition, float sphereRadius); // Detect collision between ray and sphere RLAPI bool CheckCollisionSpheres(Vector3 centerA, float radiusA, Vector3 centerB, float radiusB); // Detect collision between two spheres
bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphereRadius, Vector3 *collisionPoint); // Detect collision between ray and sphere with extended parameters and collision point detection RLAPI bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Detect collision between two bounding boxes
bool CheckCollisionRayBox(Ray ray, BoundingBox box); // Detect collision between ray and box RLAPI bool CheckCollisionBoxSphere(BoundingBox box, Vector3 centerSphere, float radiusSphere); // Detect collision between box and sphere
Vector3 ResolveCollisionCubicmap(Image cubicmap, Vector3 mapPosition, Vector3 *playerPosition, float radius); // Detect collision of player radius with cubicmap RLAPI bool CheckCollisionRaySphere(Ray ray, Vector3 spherePosition, float sphereRadius); // Detect collision between ray and sphere
RLAPI bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphereRadius, Vector3 *collisionPoint); // Detect collision between ray and sphere with extended parameters and collision point detection
RLAPI bool CheckCollisionRayBox(Ray ray, BoundingBox box); // Detect collision between ray and box
RLAPI Vector3 ResolveCollisionCubicmap(Image cubicmap, Vector3 mapPosition, Vector3 *playerPosition, float radius); // Detect collision of player radius with cubicmap
// NOTE: Return the normal vector of the impacted surface // NOTE: Return the normal vector of the impacted surface
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Shaders System Functions (Module: rlgl) // Shaders System Functions (Module: rlgl)
// NOTE: This functions are useless when using OpenGL 1.1 // NOTE: This functions are useless when using OpenGL 1.1
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
Shader LoadShader(char *vsFileName, char *fsFileName); // Load a custom shader and bind default locations RLAPI Shader LoadShader(char *vsFileName, char *fsFileName); // Load a custom shader and bind default locations
void UnloadShader(Shader shader); // Unload a custom shader from memory RLAPI void UnloadShader(Shader shader); // Unload a custom shader from memory
Shader GetDefaultShader(void); // Get default shader RLAPI Shader GetDefaultShader(void); // Get default shader
Shader GetStandardShader(void); // Get standard shader RLAPI Shader GetStandardShader(void); // Get standard shader
Texture2D GetDefaultTexture(void); // Get default texture RLAPI Texture2D GetDefaultTexture(void); // Get default texture
int GetShaderLocation(Shader shader, const char *uniformName); // Get shader uniform location RLAPI int GetShaderLocation(Shader shader, const char *uniformName); // Get shader uniform location
void SetShaderValue(Shader shader, int uniformLoc, float *value, int size); // Set shader uniform value (float) RLAPI void SetShaderValue(Shader shader, int uniformLoc, float *value, int size); // Set shader uniform value (float)
void SetShaderValuei(Shader shader, int uniformLoc, int *value, int size); // Set shader uniform value (int) RLAPI void SetShaderValuei(Shader shader, int uniformLoc, int *value, int size); // Set shader uniform value (int)
void SetShaderValueMatrix(Shader shader, int uniformLoc, Matrix mat); // Set shader uniform value (matrix 4x4) RLAPI void SetShaderValueMatrix(Shader shader, int uniformLoc, Matrix mat); // Set shader uniform value (matrix 4x4)
void SetMatrixProjection(Matrix proj); // Set a custom projection matrix (replaces internal projection matrix) RLAPI void SetMatrixProjection(Matrix proj); // Set a custom projection matrix (replaces internal projection matrix)
void SetMatrixModelview(Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix) RLAPI void SetMatrixModelview(Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix)
void BeginShaderMode(Shader shader); // Begin custom shader drawing RLAPI void BeginShaderMode(Shader shader); // Begin custom shader drawing
void EndShaderMode(void); // End custom shader drawing (use default shader) RLAPI void EndShaderMode(void); // End custom shader drawing (use default shader)
void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied) RLAPI void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied)
void EndBlendMode(void); // End blending mode (reset to default: alpha blending) RLAPI void EndBlendMode(void); // End blending mode (reset to default: alpha blending)
Light CreateLight(int type, Vector3 position, Color diffuse); // Create a new light, initialize it and add to pool RLAPI Light CreateLight(int type, Vector3 position, Color diffuse); // Create a new light, initialize it and add to pool
void DestroyLight(Light light); // Destroy a light and take it out of the list RLAPI void DestroyLight(Light light); // Destroy a light and take it out of the list
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// VR experience Functions (Module: rlgl) // VR experience Functions (Module: rlgl)
// NOTE: This functions are useless when using OpenGL 1.1 // NOTE: This functions are useless when using OpenGL 1.1
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void InitVrDevice(int vdDevice); // Init VR device RLAPI void InitVrDevice(int vdDevice); // Init VR device
void CloseVrDevice(void); // Close VR device RLAPI void CloseVrDevice(void); // Close VR device
void UpdateVrTracking(void); // Update VR tracking (position and orientation) RLAPI bool IsVrDeviceReady(void); // Detect if VR device (or simulator) is ready
void BeginVrDrawing(void); // Begin VR drawing configuration RLAPI void UpdateVrTracking(void); // Update VR tracking (position and orientation)
void EndVrDrawing(void); // End VR drawing process (and desktop mirror) RLAPI void ToggleVrMode(void); // Enable/Disable VR experience (device or simulator)
bool IsVrDeviceReady(void); // Detect if VR device (or simulator) is ready
void ToggleVrMode(void); // Enable/Disable VR experience (device or simulator)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Audio Loading and Playing Functions (Module: audio) // Audio Loading and Playing Functions (Module: audio)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void InitAudioDevice(void); // Initialize audio device and context RLAPI void InitAudioDevice(void); // Initialize audio device and context
void CloseAudioDevice(void); // Close the audio device and context (and music stream) RLAPI void CloseAudioDevice(void); // Close the audio device and context (and music stream)
bool IsAudioDeviceReady(void); // True if call to InitAudioDevice() was successful and CloseAudioDevice() has not been called yet RLAPI bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully
Sound LoadSound(char *fileName); // Load sound to memory RLAPI Sound LoadSound(char *fileName); // Load sound to memory
Sound LoadSoundFromWave(Wave wave); // Load sound to memory from wave data RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound to memory from wave data
Sound LoadSoundFromRES(const char *rresName, int resId); // Load sound to memory from rRES file (raylib Resource) RLAPI Sound LoadSoundFromRES(const char *rresName, int resId); // Load sound to memory from rRES file (raylib Resource)
void UnloadSound(Sound sound); // Unload sound RLAPI void UnloadSound(Sound sound); // Unload sound
void PlaySound(Sound sound); // Play a sound RLAPI void PlaySound(Sound sound); // Play a sound
void PauseSound(Sound sound); // Pause a sound RLAPI void PauseSound(Sound sound); // Pause a sound
void StopSound(Sound sound); // Stop playing a sound RLAPI void ResumeSound(Sound sound); // Resume a paused sound
bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing RLAPI void StopSound(Sound sound); // Stop playing a sound
void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level) RLAPI bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing
void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level) RLAPI void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level)
RLAPI void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level)
int PlayMusicStream(int index, char *fileName); // Start music playing (open stream) RLAPI Music LoadMusicStream(char *fileName); // Load music stream from file
void UpdateMusicStream(int index); // Updates buffers for music streaming RLAPI void UnloadMusicStream(Music music); // Unload music stream
void StopMusicStream(int index); // Stop music playing (close stream) RLAPI void PlayMusicStream(Music music); // Start music playing (open stream)
void PauseMusicStream(int index); // Pause music playing RLAPI void UpdateMusicStream(Music music); // Updates buffers for music streaming
void ResumeMusicStream(int index); // Resume playing paused music RLAPI void StopMusicStream(Music music); // Stop music playing (close stream)
bool IsMusicPlaying(int index); // Check if music is playing RLAPI void PauseMusicStream(Music music); // Pause music playing
void SetMusicVolume(int index, float volume); // Set volume for music (1.0 is max level) RLAPI void ResumeMusicStream(Music music); // Resume playing paused music
void SetMusicPitch(int index, float pitch); // Set pitch for a music (1.0 is base level) RLAPI bool IsMusicPlaying(Music music); // Check if music is playing
float GetMusicTimeLength(int index); // Get current music time length (in seconds) RLAPI void SetMusicVolume(Music music, float volume); // Set volume for music (1.0 is max level)
float GetMusicTimePlayed(int index); // Get current music time played (in seconds) RLAPI void SetMusicPitch(Music music, float pitch); // Set pitch for a music (1.0 is base level)
int GetMusicStreamCount(void); // Get number of streams loaded RLAPI float GetMusicTimeLength(Music music); // Get music time length (in seconds)
RLAPI float GetMusicTimePlayed(Music music); // Get current music time played (in seconds)
RLAPI AudioStream InitAudioStream(unsigned int sampleRate,
unsigned int sampleSize,
unsigned int channels); // Init audio stream (to stream audio pcm data)
RLAPI void UpdateAudioStream(AudioStream stream, void *data, int numSamples); // Update audio stream buffers with data
RLAPI void CloseAudioStream(AudioStream stream); // Close audio stream and free memory
RLAPI bool IsAudioBufferProcessed(AudioStream stream); // Check if any audio stream buffers requires refill
RLAPI void PlayAudioStream(AudioStream stream); // Play audio stream
RLAPI void PauseAudioStream(AudioStream stream); // Pause audio stream
RLAPI void ResumeAudioStream(AudioStream stream); // Resume audio stream
RLAPI void StopAudioStream(AudioStream stream); // Stop audio stream
#ifdef __cplusplus #ifdef __cplusplus
} }