2017-10-21 21:00:33 +00:00
|
|
|
#include "graphics/material.h"
|
2018-12-27 21:50:42 +00:00
|
|
|
#include "graphics/graphics.h"
|
2019-04-05 11:58:29 +00:00
|
|
|
#include "graphics/shader.h"
|
|
|
|
#include "graphics/texture.h"
|
2018-12-11 05:30:55 +00:00
|
|
|
#include "resources/shaders.h"
|
2019-06-02 07:20:10 +00:00
|
|
|
#include "core/ref.h"
|
2018-07-04 20:51:35 +00:00
|
|
|
#include <stdlib.h>
|
2019-04-05 11:58:29 +00:00
|
|
|
#include <math.h>
|
2017-10-21 21:00:33 +00:00
|
|
|
|
2018-12-19 08:15:08 +00:00
|
|
|
Material* lovrMaterialInit(Material* material) {
|
2018-02-12 03:16:40 +00:00
|
|
|
for (int i = 0; i < MAX_MATERIAL_SCALARS; i++) {
|
|
|
|
material->scalars[i] = 1.f;
|
|
|
|
}
|
|
|
|
|
2018-01-30 05:44:32 +00:00
|
|
|
for (int i = 0; i < MAX_MATERIAL_COLORS; i++) {
|
2018-10-11 09:07:09 +00:00
|
|
|
if (i == COLOR_EMISSIVE) {
|
2019-05-21 03:35:07 +00:00
|
|
|
material->colors[i] = (Color) { 0.f, 0.f, 0.f, 0.f };
|
2018-10-11 09:07:09 +00:00
|
|
|
} else {
|
2019-05-21 03:35:07 +00:00
|
|
|
material->colors[i] = (Color) { 1.f, 1.f, 1.f, 1.f };
|
2018-10-11 09:07:09 +00:00
|
|
|
}
|
2018-01-30 05:44:32 +00:00
|
|
|
}
|
|
|
|
|
2019-05-21 03:35:07 +00:00
|
|
|
lovrMaterialSetTransform(material, 0.f, 0.f, 1.f, 1.f, 0.f);
|
2017-10-21 21:00:33 +00:00
|
|
|
return material;
|
|
|
|
}
|
|
|
|
|
2018-02-26 08:59:03 +00:00
|
|
|
void lovrMaterialDestroy(void* ref) {
|
|
|
|
Material* material = ref;
|
2019-01-04 09:35:29 +00:00
|
|
|
lovrGraphicsFlushMaterial(material);
|
2017-10-21 21:00:33 +00:00
|
|
|
for (int i = 0; i < MAX_MATERIAL_TEXTURES; i++) {
|
2019-04-05 10:41:03 +00:00
|
|
|
lovrRelease(Texture, material->textures[i]);
|
2017-10-21 21:00:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-11 05:30:55 +00:00
|
|
|
void lovrMaterialBind(Material* material, Shader* shader) {
|
|
|
|
for (int i = 0; i < MAX_MATERIAL_SCALARS; i++) {
|
|
|
|
lovrShaderSetFloats(shader, lovrShaderScalarUniforms[i], &material->scalars[i], 0, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < MAX_MATERIAL_COLORS; i++) {
|
|
|
|
lovrShaderSetColor(shader, lovrShaderColorUniforms[i], material->colors[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < MAX_MATERIAL_TEXTURES; i++) {
|
|
|
|
lovrShaderSetTextures(shader, lovrShaderTextureUniforms[i], &material->textures[i], 0, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
lovrShaderSetMatrices(shader, "lovrMaterialTransform", material->transform, 0, 9);
|
|
|
|
}
|
|
|
|
|
2018-02-12 03:16:40 +00:00
|
|
|
float lovrMaterialGetScalar(Material* material, MaterialScalar scalarType) {
|
|
|
|
return material->scalars[scalarType];
|
|
|
|
}
|
|
|
|
|
|
|
|
void lovrMaterialSetScalar(Material* material, MaterialScalar scalarType, float value) {
|
2018-12-11 21:27:59 +00:00
|
|
|
if (material->scalars[scalarType] != value) {
|
2018-12-27 21:50:42 +00:00
|
|
|
lovrGraphicsFlushMaterial(material);
|
2018-12-11 21:27:59 +00:00
|
|
|
material->scalars[scalarType] = value;
|
|
|
|
}
|
2018-02-12 03:16:40 +00:00
|
|
|
}
|
|
|
|
|
2017-10-21 21:00:33 +00:00
|
|
|
Color lovrMaterialGetColor(Material* material, MaterialColor colorType) {
|
2018-01-30 05:44:32 +00:00
|
|
|
return material->colors[colorType];
|
2017-10-21 21:00:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void lovrMaterialSetColor(Material* material, MaterialColor colorType, Color color) {
|
2018-12-11 21:27:59 +00:00
|
|
|
if (memcmp(&material->colors[colorType], &color, 4 * sizeof(float))) {
|
2018-12-27 21:50:42 +00:00
|
|
|
lovrGraphicsFlushMaterial(material);
|
2018-12-11 21:27:59 +00:00
|
|
|
material->colors[colorType] = color;
|
|
|
|
}
|
2017-10-21 21:00:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Texture* lovrMaterialGetTexture(Material* material, MaterialTexture textureType) {
|
|
|
|
return material->textures[textureType];
|
|
|
|
}
|
|
|
|
|
|
|
|
void lovrMaterialSetTexture(Material* material, MaterialTexture textureType, Texture* texture) {
|
2018-12-11 21:27:59 +00:00
|
|
|
if (material->textures[textureType] != texture) {
|
2018-12-27 21:50:42 +00:00
|
|
|
lovrGraphicsFlushMaterial(material);
|
2018-02-26 08:59:03 +00:00
|
|
|
lovrRetain(texture);
|
2019-04-05 10:41:03 +00:00
|
|
|
lovrRelease(Texture, material->textures[textureType]);
|
2017-10-31 08:49:45 +00:00
|
|
|
material->textures[textureType] = texture;
|
|
|
|
}
|
2017-10-21 21:00:33 +00:00
|
|
|
}
|
2018-07-18 08:17:16 +00:00
|
|
|
|
|
|
|
void lovrMaterialGetTransform(Material* material, float* ox, float* oy, float* sx, float* sy, float* angle) {
|
|
|
|
*ox = material->transform[6];
|
|
|
|
*oy = material->transform[7];
|
2019-01-25 00:38:50 +00:00
|
|
|
*sx = sqrtf(material->transform[0] * material->transform[0] + material->transform[1] * material->transform[1]);
|
|
|
|
*sy = sqrtf(material->transform[3] * material->transform[3] + material->transform[4] * material->transform[4]);
|
|
|
|
*angle = atan2f(-material->transform[3], material->transform[0]);
|
2018-07-18 08:17:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void lovrMaterialSetTransform(Material* material, float ox, float oy, float sx, float sy, float angle) {
|
2018-12-27 21:50:42 +00:00
|
|
|
lovrGraphicsFlushMaterial(material);
|
2019-01-25 00:38:50 +00:00
|
|
|
float c = cosf(angle);
|
|
|
|
float s = sinf(angle);
|
2018-07-18 08:17:16 +00:00
|
|
|
material->transform[0] = c * sx;
|
|
|
|
material->transform[1] = s * sx;
|
2019-01-25 00:38:50 +00:00
|
|
|
material->transform[2] = 0.f;
|
2018-07-18 08:17:16 +00:00
|
|
|
material->transform[3] = -s * sy;
|
|
|
|
material->transform[4] = c * sy;
|
2019-01-25 00:38:50 +00:00
|
|
|
material->transform[5] = 0.f;
|
2018-07-18 08:17:16 +00:00
|
|
|
material->transform[6] = ox;
|
|
|
|
material->transform[7] = oy;
|
2019-01-25 00:38:50 +00:00
|
|
|
material->transform[8] = 1.f;
|
2018-07-18 08:17:16 +00:00
|
|
|
}
|