@ -40,26 +40,18 @@
/ / Check if config flags have been externally provided on compilation line
# if !defined(EXTERNAL_CONFIG_FLAGS)
# include "config.h" // Defines module configuration flags
# include "config.h" // Defines module configuration flags
# endif
# include "utils.h" // Required for: LoadFileData(), LoadFileText(), SaveFileText()
# include "utils.h" // Required for: TRACELOG(), LoadFileData(), LoadFileText(), SaveFileText()
# include "rlgl.h" // OpenGL abstraction layer to OpenGL 1.1, 2.1, 3.3+ or ES2
# include "raymath.h" // Required for: Vector3, Quaternion and Matrix functionality
# include <stdio.h> // Required for: sprintf()
# include <stdlib.h> // Required for: malloc(), free()
# include <string.h> // Required for: memcmp(), strlen()
# include <math.h> // Required for: sinf(), cosf(), sqrtf(), fabsf()
# if defined(_WIN32)
# include <direct.h> // Required for: _chdir() [Used in LoadOBJ()]
# define CHDIR _chdir
# else
# include <unistd.h> // Required for: chdir() (POSIX) [Used in LoadOBJ()]
# define CHDIR chdir
# endif
# include "rlgl.h" // raylib OpenGL abstraction layer to OpenGL 1.1, 2.1, 3.3+ or ES2
# if defined(SUPPORT_FILEFORMAT_OBJ) || defined(SUPPORT_FILEFORMAT_MTL)
# define TINYOBJ_MALLOC RL_MALLOC
# define TINYOBJ_CALLOC RL_CALLOC
@ -89,6 +81,14 @@
# include "external/par_shapes.h" // Shapes 3d parametric generation
# endif
# if defined(_WIN32)
# include <direct.h> // Required for: _chdir() [Used in LoadOBJ()]
# define CHDIR _chdir
# else
# include <unistd.h> // Required for: chdir() (POSIX) [Used in LoadOBJ()]
# define CHDIR chdir
# endif
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / Defines and Macros
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -1051,13 +1051,13 @@ void DrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int ins
/ / That ' s because BeginMode3D ( ) sets it and there is no model - drawing function
/ / that modifies it , all use rlPushMatrix ( ) and rlPopMatrix ( )
Matrix matModel = MatrixIdentity ( ) ;
Matrix matView = rlGetMatrixModelview ( ) ;
Matrix matView = rlMatrixToMatrix ( rl GetMatrixModelview () ) ;
Matrix matModelView = MatrixIdentity ( ) ;
Matrix matProjection = rlGetMatrixProjection ( ) ;
Matrix matProjection = rlMatrixToMatrix ( rl GetMatrixProjection () ) ;
/ / Upload view and projection matrices ( if locations available )
if ( material . shader . locs [ SHADER_LOC_MATRIX_VIEW ] ! = - 1 ) rlSetUniformMatrix ( material . shader . locs [ SHADER_LOC_MATRIX_VIEW ] , matView ) ;
if ( material . shader . locs [ SHADER_LOC_MATRIX_PROJECTION ] ! = - 1 ) rlSetUniformMatrix ( material . shader . locs [ SHADER_LOC_MATRIX_PROJECTION ] , matProjection ) ;
if ( material . shader . locs [ SHADER_LOC_MATRIX_VIEW ] ! = - 1 ) rlSetUniformMatrix ( material . shader . locs [ SHADER_LOC_MATRIX_VIEW ] , rlMatrixFromMatrix ( matView) ) ;
if ( material . shader . locs [ SHADER_LOC_MATRIX_PROJECTION ] ! = - 1 ) rlSetUniformMatrix ( material . shader . locs [ SHADER_LOC_MATRIX_PROJECTION ] , rlMatrixFromMatrix ( matProjection) ) ;
if ( instancing )
{
@ -1089,24 +1089,24 @@ void DrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int ins
/ / Accumulate internal matrix transform ( push / pop ) and view matrix
/ / NOTE : In this case , model instance transformation must be computed in the shader
matModelView = MatrixMultiply ( rlGetMatrixTransform ( ) , matView ) ;
matModelView = MatrixMultiply ( rlMatrixToMatrix ( rl GetMatrixTransform () ) , matView ) ;
}
else
{
/ / Model transformation matrix is send to shader uniform location : SHADER_LOC_MATRIX_MODEL
if ( material . shader . locs [ SHADER_LOC_MATRIX_MODEL ] ! = - 1 ) rlSetUniformMatrix ( material . shader . locs [ SHADER_LOC_MATRIX_MODEL ] , transforms [ 0 ] ) ;
if ( material . shader . locs [ SHADER_LOC_MATRIX_MODEL ] ! = - 1 ) rlSetUniformMatrix ( material . shader . locs [ SHADER_LOC_MATRIX_MODEL ] , rlMatrixFromMatrix ( transforms[ 0 ]) ) ;
/ / Accumulate several model transformations :
/ / transforms [ 0 ] : model transformation provided ( includes DrawModel ( ) params combined with model . transform )
/ / rlGetMatrixTransform ( ) : rlgl internal transform matrix due to push / pop matrix stack
matModel = MatrixMultiply ( transforms [ 0 ] , rlGetMatrixTransform ( ) ) ;
matModel = MatrixMultiply ( transforms [ 0 ] , rlMatrixToMatrix ( rl GetMatrixTransform () ) ) ;
/ / Get model - view matrix
matModelView = MatrixMultiply ( matModel , matView ) ;
}
/ / Upload model normal matrix ( if locations available )
if ( material . shader . locs [ SHADER_LOC_MATRIX_NORMAL ] ! = - 1 ) rlSetUniformMatrix ( material . shader . locs [ SHADER_LOC_MATRIX_NORMAL ] , MatrixTranspose ( MatrixInvert ( matModel ) ) ) ;
if ( material . shader . locs [ SHADER_LOC_MATRIX_NORMAL ] ! = - 1 ) rlSetUniformMatrix ( material . shader . locs [ SHADER_LOC_MATRIX_NORMAL ] , rlMatrixFromMatrix ( MatrixTranspose( MatrixInvert ( matModel) ) ) ) ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / Bind active texture maps ( if available )
@ -1199,11 +1199,11 @@ void DrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int ins
{
/ / Setup current eye viewport ( half screen width )
rlViewport ( eye * rlGetFramebufferWidth ( ) / 2 , 0 , rlGetFramebufferWidth ( ) / 2 , rlGetFramebufferHeight ( ) ) ;
matModelViewProjection = MatrixMultiply ( MatrixMultiply ( matModelView , rlGetMatrixViewOffsetStereo ( eye ) ) , rlGetMatrixProjectionStereo ( eye ) ) ;
matModelViewProjection = MatrixMultiply ( MatrixMultiply ( matModelView , rlMatrixToMatrix ( rl GetMatrixViewOffsetStereo ( eye) ) ) , rlMatrixToMatrix ( rl GetMatrixProjectionStereo ( eye) ) ) ;
}
/ / Send combined model - view - projection matrix to shader
rlSetUniformMatrix ( material . shader . locs [ SHADER_LOC_MATRIX_MVP ] , matModelViewProjection ) ;
rlSetUniformMatrix ( material . shader . locs [ SHADER_LOC_MATRIX_MVP ] , rlMatrixFromMatrix ( matModelViewProjection) ) ;
if ( instancing ) / / Draw mesh instanced
{
@ -1247,8 +1247,8 @@ void DrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int ins
else
{
/ / Restore rlgl internal modelview and projection matrices
rlSetMatrixModelview ( matView ) ;
rlSetMatrixProjection ( matProjection ) ;
rlSetMatrixModelview ( rlMatrixFromMatrix ( matView) ) ;
rlSetMatrixProjection ( rlMatrixFromMatrix ( matProjection) ) ;
}
# endif
}
@ -1371,7 +1371,11 @@ Material *LoadMaterials(const char *fileName, int *materialCount)
/ / Set materials shader to default ( DIFFUSE , SPECULAR , NORMAL )
if ( materials ! = NULL )
{
for ( unsigned int i = 0 ; i < count ; i + + ) materials [ i ] . shader = rlGetShaderDefault ( ) ;
for ( unsigned int i = 0 ; i < count ; i + + )
{
materials [ i ] . shader . id = rlGetShaderIdDefault ( ) ;
materials [ i ] . shader . locs = rlGetShaderLocsDefault ( ) ;
}
}
* materialCount = count ;
@ -1384,8 +1388,12 @@ Material LoadMaterialDefault(void)
Material material = { 0 } ;
material . maps = ( MaterialMap * ) RL_CALLOC ( MAX_MATERIAL_MAPS , sizeof ( MaterialMap ) ) ;
material . shader = rlGetShaderDefault ( ) ;
material . maps [ MATERIAL_MAP_DIFFUSE ] . texture = rlGetTextureDefault ( ) ; / / White texture ( 1 x1 pixel )
/ / Using rlgl default shader
material . shader . id = rlGetShaderIdDefault ( ) ;
material . shader . locs = rlGetShaderLocsDefault ( ) ;
/ / Using rlgl default texture ( 1 x1 pixel , UNCOMPRESSED_R8G8B8A8 , 1 mipmap )
material . maps [ MATERIAL_MAP_DIFFUSE ] . texture = ( Texture2D ) { rlGetTextureIdDefault ( ) , 1 , 1 , 1 , PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 } ;
/ / material . maps [ MATERIAL_MAP_NORMAL ] . texture ; / / NOTE : By default , not set
/ / material . maps [ MATERIAL_MAP_SPECULAR ] . texture ; / / NOTE : By default , not set
@ -1399,12 +1407,12 @@ Material LoadMaterialDefault(void)
void UnloadMaterial ( Material material )
{
/ / Unload material shader ( avoid unloading default shader , managed by raylib )
if ( material . shader . id ! = rlGetShaderDefault ( ). id ) UnloadShader ( material . shader ) ;
if ( material . shader . id ! = rlGetShaderId Default ( ) ) UnloadShader ( material . shader ) ;
/ / Unload loaded texture maps ( avoid unloading default texture , managed by raylib )
for ( int i = 0 ; i < MAX_MATERIAL_MAPS ; i + + )
{
if ( material . maps [ i ] . texture . id ! = rlGetTextureDefault ( ). id ) rlUnloadTexture ( material . maps [ i ] . texture . id ) ;
if ( material . maps [ i ] . texture . id ! = rlGetTextureId Default ( ) ) rlUnloadTexture ( material . maps [ i ] . texture . id ) ;
}
RL_FREE ( material . maps ) ;
@ -3400,10 +3408,11 @@ static Model LoadOBJ(const char *fileName)
/ / NOTE : Uses default shader , which only supports MATERIAL_MAP_DIFFUSE
model . materials [ m ] = LoadMaterialDefault ( ) ;
model . materials [ m ] . maps [ MATERIAL_MAP_DIFFUSE ] . texture = rlGetTextureDefault ( ) ; / / Get default texture , in case no texture is defined
/ / Get default texture , in case no texture is defined
/ / NOTE : rlgl default texture is a 1 x1 pixel UNCOMPRESSED_R8G8B8A8
model . materials [ m ] . maps [ MATERIAL_MAP_DIFFUSE ] . texture = ( Texture2D ) { rlGetTextureIdDefault ( ) , 1 , 1 , 1 , PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 } ;
if ( materials [ m ] . diffuse_texname ! = NULL ) model . materials [ m ] . maps [ MATERIAL_MAP_DIFFUSE ] . texture = LoadTexture ( materials [ m ] . diffuse_texname ) ; / / char * diffuse_texname ; / / map_Kd
else model . materials [ m ] . maps [ MATERIAL_MAP_DIFFUSE ] . texture = rlGetTextureDefault ( ) ;
model . materials [ m ] . maps [ MATERIAL_MAP_DIFFUSE ] . color = ( Color ) { ( unsigned char ) ( materials [ m ] . diffuse [ 0 ] * 255.0f ) , ( unsigned char ) ( materials [ m ] . diffuse [ 1 ] * 255.0f ) , ( unsigned char ) ( materials [ m ] . diffuse [ 2 ] * 255.0f ) , 255 } ; / / float diffuse [ 3 ] ;
model . materials [ m ] . maps [ MATERIAL_MAP_DIFFUSE ] . value = 0.0f ;