|
|
@ -1,466 +0,0 @@ |
|
|
|
/********************************************************************************************** |
|
|
|
* |
|
|
|
* raylib.pbr - Some useful functions to deal with pbr materials and lights |
|
|
|
* |
|
|
|
* CONFIGURATION: |
|
|
|
* |
|
|
|
* #define RPBR_IMPLEMENTATION |
|
|
|
* Generates the implementation of the library into the included file. |
|
|
|
* If not defined, the library is in header only mode and can be included in other headers |
|
|
|
* or source files without problems. But only ONE file should hold the implementation. |
|
|
|
* |
|
|
|
* LICENSE: zlib/libpng |
|
|
|
* |
|
|
|
* Copyright (c) 2023-2024 Afan OLOVCIC (@_DevDad) 2017-2020 Victor Fisac(@victorfisac),Ramon Santamaria (@raysan5) |
|
|
|
* |
|
|
|
* This software is provided "as-is", without any express or implied warranty. In no event |
|
|
|
* will the authors be held liable for any damages arising from the use of this software. |
|
|
|
* |
|
|
|
* Permission is granted to anyone to use this software for any purpose, including commercial |
|
|
|
* applications, and to alter it and redistribute it freely, subject to the following restrictions: |
|
|
|
* |
|
|
|
* 1. The origin of this software must not be misrepresented; you must not claim that you |
|
|
|
* wrote the original software. If you use this software in a product, an acknowledgment |
|
|
|
* in the product documentation would be appreciated but is not required. |
|
|
|
* |
|
|
|
* 2. Altered source versions must be plainly marked as such, and must not be misrepresented |
|
|
|
* as being the original software. |
|
|
|
* |
|
|
|
* 3. This notice may not be removed or altered from any source distribution. |
|
|
|
* |
|
|
|
**********************************************************************************************/ |
|
|
|
|
|
|
|
#ifndef RPBR_H |
|
|
|
#define RPBR_H |
|
|
|
#include "raylib.h" |
|
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
// Defines and Macros |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
#define MAX_LIGHTS 4 // Max dynamic lights supported by shader |
|
|
|
#define SHADER_LOC_MAP_MRA SHADER_LOC_MAP_METALNESS //METALLIC, ROUGHNESS and AO |
|
|
|
#define SHADER_LOC_MAP_EMISSIVE SHADER_LOC_MAP_HEIGHT //EMISSIVE |
|
|
|
#define MATERIAL_MAP_MRA MATERIAL_MAP_METALNESS |
|
|
|
#define MATERIAL_MAP_EMISSIVE MATERIAL_MAP_HEIGHT |
|
|
|
#define NULL 0 |
|
|
|
#define COLOR_TO_ARRAY(c) |
|
|
|
|
|
|
|
typedef struct { |
|
|
|
int enabled; |
|
|
|
int type; |
|
|
|
Vector3 position; |
|
|
|
Vector3 target; |
|
|
|
float color[4]; |
|
|
|
float intensity; |
|
|
|
|
|
|
|
int enabledLoc; |
|
|
|
int typeLoc; |
|
|
|
int positionLoc; |
|
|
|
int targetLoc; |
|
|
|
int colorLoc; |
|
|
|
int intensityLoc; |
|
|
|
} PBRLight; |
|
|
|
|
|
|
|
typedef enum { |
|
|
|
LIGHT_DIRECTIONAL = 0, |
|
|
|
LIGHT_POINT, |
|
|
|
LIGHT_SPOT |
|
|
|
} PBRLightType; |
|
|
|
|
|
|
|
typedef struct{ |
|
|
|
Shader pbrShader; |
|
|
|
Shader skyShader; |
|
|
|
unsigned int cubemap; |
|
|
|
unsigned int irradiance; |
|
|
|
unsigned int prefilter; |
|
|
|
unsigned int brdf; |
|
|
|
int modelMatrixLoc; |
|
|
|
int pbrViewLoc; |
|
|
|
int skyViewLoc; |
|
|
|
int skyResolutionLoc; |
|
|
|
} PBREnvironment; |
|
|
|
|
|
|
|
typedef enum{ |
|
|
|
PBR_COLOR_ALBEDO = 0, |
|
|
|
PBR_COLOR_EMISSIVE |
|
|
|
}PBRColorType; |
|
|
|
|
|
|
|
typedef enum{ |
|
|
|
PBR_VEC2_TILING = 0, |
|
|
|
PBR_VEC2_OFFSET |
|
|
|
}PBRVec2Type; |
|
|
|
|
|
|
|
typedef enum{ |
|
|
|
PBR_PARAM_NORMAL =0, |
|
|
|
PBR_PARAM_METALLIC, |
|
|
|
PBR_PARAM_ROUGHNESS, |
|
|
|
PBR_PARAM_EMISSIVE, |
|
|
|
PBR_PARAM_AO |
|
|
|
}PBRFloatType; |
|
|
|
|
|
|
|
typedef enum{ |
|
|
|
PBR_TEXTURE_ALBEDO = 0, |
|
|
|
PBR_TEXTURE_NORMAL, |
|
|
|
PBR_TEXTURE_MRA, |
|
|
|
PBR_TEXTURE_EMISSIVE |
|
|
|
}PBRTexType; |
|
|
|
|
|
|
|
// Textures are moved to material from params to pack better and use less textures on the end |
|
|
|
// texture MRAE 4Channel R: Metallic G: Roughness B: A: Ambient Occlusion |
|
|
|
// texEmissive use just one channel, so we have 3 channels still to use if we need |
|
|
|
typedef struct { |
|
|
|
Shader pbrShader; |
|
|
|
float albedo[4]; |
|
|
|
float normal; |
|
|
|
float metallic; |
|
|
|
float roughness; |
|
|
|
float ao; |
|
|
|
float emissive[4]; |
|
|
|
float ambient[3]; |
|
|
|
float emissivePower; |
|
|
|
|
|
|
|
Texture2D texAlbedo; |
|
|
|
Texture2D texNormal; |
|
|
|
Texture2D texMRA;//r: Metallic g: Roughness b: AO a:Empty |
|
|
|
Texture2D texEmissive; //Emissive Texture |
|
|
|
// Using float4 to store tilling at 1st and 2nd position and offset at 3rd and 4th |
|
|
|
float texTiling[2]; |
|
|
|
float texOffset[2]; |
|
|
|
|
|
|
|
int useTexAlbedo; |
|
|
|
int useTexNormal; |
|
|
|
int useTexMRA; |
|
|
|
int useTexEmissive; |
|
|
|
|
|
|
|
int albedoLoc; |
|
|
|
int normalLoc; |
|
|
|
int metallicLoc; |
|
|
|
int roughnessLoc; |
|
|
|
int aoLoc; |
|
|
|
int emissiveColorLoc; |
|
|
|
int emissivePowerLoc; |
|
|
|
|
|
|
|
int texTilingLoc; |
|
|
|
int texOffsetLoc; |
|
|
|
|
|
|
|
int useTexAlbedoLoc; |
|
|
|
int useTexNormalLoc; |
|
|
|
int useTexMRAELoc; |
|
|
|
int useTexEmissiveLoc; |
|
|
|
} PBRMaterial; |
|
|
|
|
|
|
|
typedef struct{ |
|
|
|
Model model; |
|
|
|
PBRMaterial pbrMat; |
|
|
|
}PBRModel; |
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
extern "C" { |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
// Module Functions Declaration |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
// Create a light and get shader locations |
|
|
|
PBRLight PBRLightCreate(int type, Vector3 position, Vector3 target, Color color,float intensity, Shader shader); |
|
|
|
// Send light properties to shader |
|
|
|
void PBRLightUpdate(Shader shader, PBRLight light); |
|
|
|
|
|
|
|
//For now until we do real skylight |
|
|
|
void PBRSetAmbient(Shader shader, Color color, float intensity); |
|
|
|
|
|
|
|
PBRModel PBRModelLoad(const char *fileName); |
|
|
|
PBRModel PBRModelLoadFromMesh(Mesh mesh); |
|
|
|
|
|
|
|
void PBRLoadTextures(PBRMaterial *pbrMat,PBRTexType pbrTexType,const char *fileName); |
|
|
|
void UnloadPBRMaterial(PBRMaterial pbrMat); |
|
|
|
void PBRSetColor(PBRMaterial *pbrMat,PBRColorType pbrColorType,Color color); |
|
|
|
void PBRSetVec2(PBRMaterial *pbrMat,PBRVec2Type type,Vector2 value); |
|
|
|
void PBRSetFloat(PBRMaterial *pbrMat, PBRFloatType pbrParamType, float value); |
|
|
|
|
|
|
|
void PBRMaterialSetup( PBRMaterial *pbrMat,Shader pbrShader, PBREnvironment* environment); |
|
|
|
void PBRSetMaterial(PBRModel* model,PBRMaterial* pbrMat,int matIndex); |
|
|
|
void PBRDrawModel(PBRModel pbrModel, Vector3 position, float scale); |
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
#endif //RPBR_H |
|
|
|
|
|
|
|
/*********************************************************************************** |
|
|
|
* |
|
|
|
* RPBR IMPLEMENTATION |
|
|
|
* |
|
|
|
************************************************************************************/ |
|
|
|
|
|
|
|
#if defined(RPBR_IMPLEMENTATION) |
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
// Global Variables Definition |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
static int lightsCount = 0; // Current amount of created lights |
|
|
|
|
|
|
|
// Create a light and get shader locations |
|
|
|
PBRLight PBRLightCreate(int type, Vector3 position, Vector3 target, Color color,float intensity, Shader shader) |
|
|
|
{ |
|
|
|
PBRLight light = { 0 }; |
|
|
|
|
|
|
|
if (lightsCount < MAX_LIGHTS) |
|
|
|
{ |
|
|
|
light.enabled = 1; |
|
|
|
light.type = type; |
|
|
|
light.position = position; |
|
|
|
light.target = target; |
|
|
|
light.color[0] = (float)color.r/(float)255; |
|
|
|
light.color[1] = (float)color.g/(float)255; |
|
|
|
light.color[2] = (float)color.b/(float)255; |
|
|
|
light.color[3] = (float)color.a/(float)255; |
|
|
|
light.intensity = intensity; |
|
|
|
// NOTE: Lighting shader naming must be the provided ones |
|
|
|
light.enabledLoc = GetShaderLocation(shader, TextFormat("lights[%i].enabled", lightsCount)); |
|
|
|
light.typeLoc = GetShaderLocation(shader, TextFormat("lights[%i].type", lightsCount)); |
|
|
|
light.positionLoc = GetShaderLocation(shader, TextFormat("lights[%i].position", lightsCount)); |
|
|
|
light.targetLoc = GetShaderLocation(shader, TextFormat("lights[%i].target", lightsCount)); |
|
|
|
light.colorLoc = GetShaderLocation(shader, TextFormat("lights[%i].color", lightsCount)); |
|
|
|
light.intensityLoc = GetShaderLocation(shader, TextFormat("lights[%i].intensity", lightsCount)); |
|
|
|
PBRLightUpdate(shader, light); |
|
|
|
|
|
|
|
lightsCount++; |
|
|
|
} |
|
|
|
|
|
|
|
return light; |
|
|
|
} |
|
|
|
|
|
|
|
// Send light properties to shader |
|
|
|
// NOTE: Light shader locations should be available |
|
|
|
void PBRLightUpdate(Shader shader, PBRLight light) |
|
|
|
{ |
|
|
|
SetShaderValue(shader, light.enabledLoc, &light.enabled, SHADER_UNIFORM_INT); |
|
|
|
SetShaderValue(shader, light.typeLoc, &light.type, SHADER_UNIFORM_INT); |
|
|
|
// Send to shader light position values |
|
|
|
float position[3] = { light.position.x, light.position.y, light.position.z }; |
|
|
|
SetShaderValue(shader, light.positionLoc, position, SHADER_UNIFORM_VEC3); |
|
|
|
|
|
|
|
// Send to shader light target position values |
|
|
|
float target[3] = { light.target.x, light.target.y, light.target.z }; |
|
|
|
SetShaderValue(shader, light.targetLoc, target, SHADER_UNIFORM_VEC3); |
|
|
|
SetShaderValue(shader, light.colorLoc, light.color, SHADER_UNIFORM_VEC4); |
|
|
|
SetShaderValue(shader, light.intensityLoc, &light.intensity, SHADER_UNIFORM_FLOAT); |
|
|
|
} |
|
|
|
|
|
|
|
void PBRSetAmbient(Shader shader, Color color, float intensity){ |
|
|
|
float col[3] = {color.r/255,color.g/255,color.b/255}; |
|
|
|
SetShaderValue(shader, GetShaderLocation(shader, "ambientColor"), col, SHADER_UNIFORM_VEC3); |
|
|
|
SetShaderValue(shader, GetShaderLocation(shader, "ambient"), &intensity, SHADER_UNIFORM_FLOAT); |
|
|
|
} |
|
|
|
|
|
|
|
void PBRMaterialSetup(PBRMaterial *pbrMat, Shader pbrShader, PBREnvironment* environment){ |
|
|
|
pbrMat->pbrShader = pbrShader; |
|
|
|
|
|
|
|
pbrMat->texAlbedo = (Texture2D){0}; |
|
|
|
pbrMat->texNormal = (Texture2D){0}; |
|
|
|
pbrMat->texMRA = (Texture2D){0}; |
|
|
|
pbrMat->texEmissive = (Texture2D){0}; |
|
|
|
|
|
|
|
//PBRParam |
|
|
|
pbrMat->albedo[0] = 1.0; |
|
|
|
pbrMat->albedo[1] = 1.0; |
|
|
|
pbrMat->albedo[2] = 1.0; |
|
|
|
pbrMat->albedo[3] = 1.0; |
|
|
|
pbrMat->metallic = 0; |
|
|
|
pbrMat->roughness = 0; |
|
|
|
pbrMat->ao = 1.0; |
|
|
|
pbrMat->normal = 1; |
|
|
|
pbrMat->emissive[0] = 0; |
|
|
|
pbrMat->emissive[1] = 0; |
|
|
|
pbrMat->emissive[2] = 0; |
|
|
|
pbrMat->emissive[3] = 0; |
|
|
|
|
|
|
|
pbrMat->texTiling[0] = 1.0; |
|
|
|
pbrMat->texTiling[1] = 1.0; |
|
|
|
pbrMat->texOffset[0] = 0.0; |
|
|
|
pbrMat->texOffset[1] = 0.0; |
|
|
|
pbrMat->emissivePower = 1.0; |
|
|
|
// Set up PBR shader material locations |
|
|
|
|
|
|
|
pbrMat->albedoLoc = GetShaderLocation(pbrMat->pbrShader, "albedoColor"); |
|
|
|
pbrMat->normalLoc = GetShaderLocation(pbrMat->pbrShader, "normalValue"); |
|
|
|
pbrMat->metallicLoc = GetShaderLocation(pbrMat->pbrShader, "metallicValue"); |
|
|
|
pbrMat->roughnessLoc = GetShaderLocation(pbrMat->pbrShader, "roughnessValue"); |
|
|
|
pbrMat->aoLoc = GetShaderLocation(pbrMat->pbrShader, "aoValue"); |
|
|
|
pbrMat->emissiveColorLoc = GetShaderLocation(pbrMat->pbrShader, "emissiveColor"); |
|
|
|
pbrMat->emissivePowerLoc = GetShaderLocation(pbrMat->pbrShader, "emissivePower"); |
|
|
|
|
|
|
|
pbrMat->texTilingLoc = GetShaderLocation(pbrMat->pbrShader, "tiling"); |
|
|
|
pbrMat->texOffsetLoc = GetShaderLocation(pbrMat->pbrShader, "offset"); |
|
|
|
|
|
|
|
pbrMat->useTexAlbedoLoc = GetShaderLocation(pbrMat->pbrShader, "useTexAlbedo"); |
|
|
|
pbrMat->useTexNormalLoc = GetShaderLocation(pbrMat->pbrShader, "useTexNormal"); |
|
|
|
pbrMat->useTexMRAELoc = GetShaderLocation(pbrMat->pbrShader, "useTexMRA"); |
|
|
|
pbrMat->useTexEmissiveLoc = GetShaderLocation(pbrMat->pbrShader, "useTexEmissive"); |
|
|
|
|
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->albedoLoc,pbrMat->albedo,SHADER_UNIFORM_VEC4); |
|
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->emissiveColorLoc, pbrMat->emissive, SHADER_UNIFORM_VEC4); |
|
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->emissivePowerLoc, &pbrMat->emissivePower, SHADER_UNIFORM_FLOAT); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->metallicLoc,&pbrMat->metallic,SHADER_UNIFORM_FLOAT); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->roughnessLoc,&pbrMat->roughness,SHADER_UNIFORM_FLOAT); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->aoLoc,&pbrMat->ao,SHADER_UNIFORM_FLOAT); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->normalLoc,&pbrMat->normal,SHADER_UNIFORM_FLOAT); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texTilingLoc,pbrMat->texTiling,SHADER_UNIFORM_VEC2); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texOffsetLoc,pbrMat->texOffset,SHADER_UNIFORM_VEC2); |
|
|
|
} |
|
|
|
|
|
|
|
void PBRLoadTextures(PBRMaterial *pbrMat,PBRTexType pbrTexType,const char *fileName){ |
|
|
|
if(pbrMat == NULL) return; |
|
|
|
switch(pbrTexType){ |
|
|
|
case PBR_TEXTURE_ALBEDO: |
|
|
|
pbrMat->texAlbedo = LoadTexture(fileName); |
|
|
|
pbrMat->useTexAlbedo = 1; |
|
|
|
break; |
|
|
|
case PBR_TEXTURE_MRA: |
|
|
|
pbrMat->texMRA = LoadTexture(fileName); |
|
|
|
pbrMat->useTexMRA = 1; |
|
|
|
break; |
|
|
|
case PBR_TEXTURE_NORMAL: |
|
|
|
pbrMat->texNormal = LoadTexture(fileName); |
|
|
|
pbrMat->useTexNormal = 1; |
|
|
|
break; |
|
|
|
case PBR_TEXTURE_EMISSIVE: |
|
|
|
pbrMat->texEmissive = LoadTexture(fileName); |
|
|
|
pbrMat->useTexEmissive = 1; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void UnloadPBRMaterial(PBRMaterial pbrMat){ |
|
|
|
if(pbrMat.useTexAlbedo == 1) UnloadTexture(pbrMat.texAlbedo); |
|
|
|
if(pbrMat.useTexNormal == 1) UnloadTexture(pbrMat.texNormal); |
|
|
|
if(pbrMat.useTexMRA == 1) UnloadTexture(pbrMat.texMRA); |
|
|
|
if(pbrMat.useTexEmissive == 1) UnloadTexture(pbrMat.texEmissive); |
|
|
|
} |
|
|
|
|
|
|
|
void PBRSetColor(PBRMaterial *pbrMat,PBRColorType pbrColorType,Color color){ |
|
|
|
if(pbrMat == NULL) return; |
|
|
|
switch(pbrColorType){ |
|
|
|
case PBR_COLOR_ALBEDO: |
|
|
|
pbrMat->albedo[0] = (float) color.r / 255; |
|
|
|
pbrMat->albedo[1] = (float) color.g / 255; |
|
|
|
pbrMat->albedo[2] = (float) color.b / 255; |
|
|
|
pbrMat->albedo[3] = (float) color.a / 255; |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->albedoLoc,pbrMat->albedo,SHADER_UNIFORM_VEC4); |
|
|
|
break; |
|
|
|
case PBR_COLOR_EMISSIVE: |
|
|
|
pbrMat->emissive[0] = (float) color.r / 255; |
|
|
|
pbrMat->emissive[1] = (float) color.g / 255; |
|
|
|
pbrMat->emissive[2] = (float) color.b / 255; |
|
|
|
pbrMat->emissive[3] = (float) color.a / 255; |
|
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->emissiveColorLoc, pbrMat->emissive, SHADER_UNIFORM_VEC4); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void PBRSetFloat(PBRMaterial *pbrMat, PBRFloatType pbrParamType, float value){ |
|
|
|
if(pbrMat == NULL) return; |
|
|
|
switch(pbrParamType){ |
|
|
|
case PBR_PARAM_METALLIC: |
|
|
|
pbrMat->metallic = value; |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->metallicLoc,&pbrMat->metallic,SHADER_UNIFORM_FLOAT); |
|
|
|
break; |
|
|
|
case PBR_PARAM_ROUGHNESS: |
|
|
|
pbrMat->roughness = value; |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->roughnessLoc,&pbrMat->roughness,SHADER_UNIFORM_FLOAT); |
|
|
|
break; |
|
|
|
case PBR_PARAM_NORMAL: |
|
|
|
pbrMat->normal = value; |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->normalLoc,&pbrMat->normal,SHADER_UNIFORM_FLOAT); |
|
|
|
break; |
|
|
|
case PBR_PARAM_AO: |
|
|
|
pbrMat->ao = value; |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->aoLoc,&pbrMat->ao,SHADER_UNIFORM_FLOAT); |
|
|
|
break; |
|
|
|
case PBR_PARAM_EMISSIVE: |
|
|
|
pbrMat->emissivePower = value; |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->emissivePowerLoc,&pbrMat->emissivePower,SHADER_UNIFORM_FLOAT); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void PBRSetVec2(PBRMaterial *pbrMat,PBRVec2Type type,Vector2 value){ |
|
|
|
switch(type){ |
|
|
|
case PBR_VEC2_TILING: |
|
|
|
pbrMat->texTiling[0] = value.x; |
|
|
|
pbrMat->texTiling[1] = value.y; |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texTilingLoc,&pbrMat->texTiling,SHADER_UNIFORM_VEC2); |
|
|
|
break; |
|
|
|
case PBR_VEC2_OFFSET: |
|
|
|
pbrMat->texOffset[0] = value.x; |
|
|
|
pbrMat->texOffset[1] = value.y; |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texOffsetLoc,&pbrMat->texOffset,SHADER_UNIFORM_VEC2); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void PBRSetMaterial(PBRModel* model,PBRMaterial* pbrMat,int matIndex){ |
|
|
|
|
|
|
|
|
|
|
|
model->pbrMat = *pbrMat; |
|
|
|
model->model.materials[matIndex].shader = model->pbrMat.pbrShader; |
|
|
|
pbrMat->pbrShader.locs[SHADER_LOC_MAP_MRA] = GetShaderLocation(pbrMat->pbrShader, "mraMap"); |
|
|
|
pbrMat->pbrShader.locs[SHADER_LOC_MAP_EMISSIVE] = GetShaderLocation(pbrMat->pbrShader, "emissiveMap"); |
|
|
|
pbrMat->pbrShader.locs[SHADER_LOC_MAP_NORMAL] = GetShaderLocation(pbrMat->pbrShader, "normalMap"); |
|
|
|
|
|
|
|
if(pbrMat->useTexAlbedo) { |
|
|
|
model->model.materials[matIndex].maps[MATERIAL_MAP_ALBEDO].texture = pbrMat->texAlbedo; |
|
|
|
} |
|
|
|
if(pbrMat->useTexMRA) { |
|
|
|
model->model.materials[matIndex].maps[MATERIAL_MAP_MRA].texture = pbrMat->texMRA; |
|
|
|
} |
|
|
|
if(pbrMat->useTexNormal) { |
|
|
|
model->model.materials[matIndex].maps[MATERIAL_MAP_NORMAL].texture = pbrMat->texNormal; |
|
|
|
} |
|
|
|
if(pbrMat->useTexEmissive) { |
|
|
|
model->model.materials[matIndex].maps[MATERIAL_MAP_EMISSIVE].texture = pbrMat->texEmissive; |
|
|
|
} |
|
|
|
|
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->useTexAlbedoLoc,&pbrMat->useTexAlbedo,SHADER_UNIFORM_INT); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->useTexNormalLoc,&pbrMat->useTexNormal,SHADER_UNIFORM_INT); |
|
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->useTexMRAELoc, &pbrMat->useTexMRA, SHADER_UNIFORM_INT); |
|
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->useTexEmissiveLoc, &pbrMat->useTexEmissive, SHADER_UNIFORM_INT); |
|
|
|
} |
|
|
|
|
|
|
|
void PBRDrawModel(PBRModel pbrModel, Vector3 position, float scale){ |
|
|
|
PBRMaterial *pbrMat = &pbrModel.pbrMat; |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->albedoLoc,pbrMat->albedo,SHADER_UNIFORM_VEC4); |
|
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->emissiveColorLoc, pbrMat->emissive, SHADER_UNIFORM_VEC4); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->metallicLoc,&pbrMat->metallic,SHADER_UNIFORM_FLOAT); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->roughnessLoc,&pbrMat->roughness,SHADER_UNIFORM_FLOAT); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->aoLoc,&pbrMat->ao,SHADER_UNIFORM_FLOAT); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->normalLoc,&pbrMat->normal,SHADER_UNIFORM_FLOAT); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texTilingLoc,pbrMat->texTiling,SHADER_UNIFORM_VEC2); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texOffsetLoc,pbrMat->texOffset,SHADER_UNIFORM_VEC2); |
|
|
|
|
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->useTexAlbedoLoc,&pbrMat->useTexAlbedo,SHADER_UNIFORM_INT); |
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->useTexNormalLoc,&pbrMat->useTexNormal,SHADER_UNIFORM_INT); |
|
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->useTexMRAELoc, &pbrMat->useTexMRA, SHADER_UNIFORM_INT); |
|
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->useTexEmissiveLoc, &pbrMat->useTexEmissive, SHADER_UNIFORM_INT); |
|
|
|
|
|
|
|
DrawModel(pbrModel.model,position,scale,WHITE); |
|
|
|
} |
|
|
|
|
|
|
|
PBRModel PBRModelLoad(const char *fileName){ |
|
|
|
PBRModel pbrModel = (PBRModel){0}; |
|
|
|
pbrModel.model = LoadModel(fileName); |
|
|
|
return pbrModel; |
|
|
|
} |
|
|
|
|
|
|
|
PBRModel PBRModelLoadFromMesh(Mesh mesh){ |
|
|
|
PBRModel pbrModel = (PBRModel){0}; |
|
|
|
pbrModel.model = LoadModelFromMesh(mesh); |
|
|
|
return pbrModel; |
|
|
|
} |
|
|
|
#endif // RPBR_IMPLEMENTATION |