Removed useless spacing

This commit is contained in:
raysan5 2016-08-16 11:09:55 +02:00
parent 342b89c5b9
commit 959a228815
8 changed files with 598 additions and 598 deletions

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,7 +233,7 @@ 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 sample size (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)
{ {
@ -256,7 +256,7 @@ Sound LoadSoundFromWave(Wave wave)
} }
} }
else TraceLog(WARNING, "Wave number of channels not supported: %i", wave.channels); else TraceLog(WARNING, "Wave number of channels not supported: %i", wave.channels);
// Create an audio source // Create an audio source
ALuint source; ALuint source;
alGenSources(1, &source); // Generate pointer to audio source alGenSources(1, &source); // Generate pointer to audio source
@ -271,7 +271,7 @@ 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 unsigned int dataSize = wave.sampleCount*wave.sampleSize/8; // Size in bytes
// Upload sound data to buffer // Upload sound data to buffer
@ -367,7 +367,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);
} }
@ -506,13 +506,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
@ -523,7 +523,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);
} }
@ -555,11 +555,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);
} }
@ -597,58 +597,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;
} }
@ -659,15 +659,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;
} }
@ -713,7 +713,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;
} }
@ -732,7 +732,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;
@ -791,7 +791,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;
@ -806,9 +806,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);
@ -818,7 +818,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);
} }
@ -828,14 +828,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);
} }
} }

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;
@ -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;
@ -2049,9 +2049,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;
@ -2069,14 +2069,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
@ -2123,7 +2123,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.
@ -2192,7 +2192,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;
@ -2203,6 +2203,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

@ -930,8 +930,8 @@ RLAPI void SetMusicPitch(Music music, float pitch); // Set pit
RLAPI float GetMusicTimeLength(Music music); // Get music time length (in seconds) RLAPI float GetMusicTimeLength(Music music); // Get music time length (in seconds)
RLAPI float GetMusicTimePlayed(Music music); // Get current music time played (in seconds) RLAPI float GetMusicTimePlayed(Music music); // Get current music time played (in seconds)
RLAPI 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)
RLAPI 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
RLAPI void CloseAudioStream(AudioStream stream); // Close audio stream and free memory RLAPI void CloseAudioStream(AudioStream stream); // Close audio stream and free memory

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,12 +586,12 @@ 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;
return spriteFont; return spriteFont;
@ -631,7 +631,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 +670,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 +685,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 +697,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 +720,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 +738,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 +766,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 +809,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 +862,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 +877,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 +889,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 +909,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 +918,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