mirror of https://github.com/bjornbytes/lovr.git
Material:getTransform; Material:setTransform;
This commit is contained in:
parent
5641afee13
commit
8cc795aa9d
|
@ -62,6 +62,29 @@ int l_lovrMaterialSetTexture(lua_State* L) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int l_lovrMaterialGetTransform(lua_State* L) {
|
||||
Material* material = luax_checktype(L, 1, Material);
|
||||
float ox, oy, sx, sy, angle;
|
||||
lovrMaterialGetTransform(material, &ox, &oy, &sx, &sy, &angle);
|
||||
lua_pushnumber(L, ox);
|
||||
lua_pushnumber(L, oy);
|
||||
lua_pushnumber(L, sx);
|
||||
lua_pushnumber(L, sy);
|
||||
lua_pushnumber(L, angle);
|
||||
return 5;
|
||||
}
|
||||
|
||||
int l_lovrMaterialSetTransform(lua_State* L) {
|
||||
Material* material = luax_checktype(L, 1, Material);
|
||||
float ox = luaL_optnumber(L, 2, 0.f);
|
||||
float oy = luaL_optnumber(L, 3, 0.f);
|
||||
float sx = luaL_optnumber(L, 4, 1.f);
|
||||
float sy = luaL_optnumber(L, 5, sx);
|
||||
float angle = luaL_optnumber(L, 6, 0.f);
|
||||
lovrMaterialSetTransform(material, ox, oy, sx, sy, angle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
const luaL_Reg lovrMaterial[] = {
|
||||
{ "getColor", l_lovrMaterialGetColor },
|
||||
{ "setColor", l_lovrMaterialSetColor },
|
||||
|
@ -69,5 +92,7 @@ const luaL_Reg lovrMaterial[] = {
|
|||
{ "setScalar", l_lovrMaterialSetScalar },
|
||||
{ "getTexture", l_lovrMaterialGetTexture },
|
||||
{ "setTexture", l_lovrMaterialSetTexture },
|
||||
{ "getTransform", l_lovrMaterialGetTransform },
|
||||
{ "setTransform", l_lovrMaterialSetTransform },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "graphics/material.h"
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
Material* lovrMaterialCreate() {
|
||||
|
@ -13,6 +14,8 @@ Material* lovrMaterialCreate() {
|
|||
material->colors[i] = (Color) { 1, 1, 1, 1 };
|
||||
}
|
||||
|
||||
lovrMaterialSetTransform(material, 0, 0, 1, 1, 0);
|
||||
|
||||
return material;
|
||||
}
|
||||
|
||||
|
@ -51,3 +54,25 @@ void lovrMaterialSetTexture(Material* material, MaterialTexture textureType, Tex
|
|||
material->textures[textureType] = texture;
|
||||
}
|
||||
}
|
||||
|
||||
void lovrMaterialGetTransform(Material* material, float* ox, float* oy, float* sx, float* sy, float* angle) {
|
||||
*ox = material->transform[6];
|
||||
*oy = material->transform[7];
|
||||
*sx = sqrt(material->transform[0] * material->transform[0] + material->transform[1] * material->transform[1]);
|
||||
*sy = sqrt(material->transform[3] * material->transform[3] + material->transform[4] * material->transform[4]);
|
||||
*angle = atan2(-material->transform[3], material->transform[0]);
|
||||
}
|
||||
|
||||
void lovrMaterialSetTransform(Material* material, float ox, float oy, float sx, float sy, float angle) {
|
||||
float c = cos(angle);
|
||||
float s = sin(angle);
|
||||
material->transform[0] = c * sx;
|
||||
material->transform[1] = s * sx;
|
||||
material->transform[2] = 0;
|
||||
material->transform[3] = -s * sy;
|
||||
material->transform[4] = c * sy;
|
||||
material->transform[5] = 0;
|
||||
material->transform[6] = ox;
|
||||
material->transform[7] = oy;
|
||||
material->transform[8] = 1;
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ typedef struct {
|
|||
float scalars[MAX_MATERIAL_SCALARS];
|
||||
Color colors[MAX_MATERIAL_COLORS];
|
||||
Texture* textures[MAX_MATERIAL_TEXTURES];
|
||||
float transform[9];
|
||||
bool isDefault;
|
||||
} Material;
|
||||
|
||||
|
@ -43,3 +44,5 @@ Color lovrMaterialGetColor(Material* material, MaterialColor colorType);
|
|||
void lovrMaterialSetColor(Material* material, MaterialColor colorType, Color color);
|
||||
Texture* lovrMaterialGetTexture(Material* material, MaterialTexture textureType);
|
||||
void lovrMaterialSetTexture(Material* material, MaterialTexture textureType, Texture* texture);
|
||||
void lovrMaterialGetTransform(Material* material, float* ox, float* oy, float* sx, float* sy, float* angle);
|
||||
void lovrMaterialSetTransform(Material* material, float ox, float oy, float sx, float sy, float angle);
|
||||
|
|
|
@ -680,6 +680,8 @@ void lovrGpuDraw(DrawCommand* command) {
|
|||
lovrShaderSetTexture(shader, lovrShaderTextureUniforms[i], &texture, 1);
|
||||
}
|
||||
|
||||
lovrShaderSetMatrix(shader, "lovrMaterialTransform", material->transform, 9);
|
||||
|
||||
// Canvas
|
||||
Canvas** canvas = pipeline->canvasCount > 0 ? pipeline->canvas : &command->camera.canvas;
|
||||
int canvasCount = pipeline->canvasCount > 0 ? pipeline->canvasCount : (command->camera.canvas != NULL);
|
||||
|
|
|
@ -43,6 +43,7 @@ const char* lovrShaderVertexPrefix = ""
|
|||
"uniform mat4 lovrProjection; \n"
|
||||
"uniform mat4 lovrTransform; \n"
|
||||
"uniform mat3 lovrNormalMatrix; \n"
|
||||
"uniform mat3 lovrMaterialTransform; \n"
|
||||
"uniform float lovrPointSize; \n"
|
||||
"uniform mat4 lovrPose[MAX_BONES]; \n"
|
||||
"#line 0 \n";
|
||||
|
@ -76,7 +77,7 @@ const char* lovrShaderFragmentPrefix = ""
|
|||
|
||||
const char* lovrShaderVertexSuffix = ""
|
||||
"void main() { \n"
|
||||
" texCoord = lovrTexCoord; \n"
|
||||
" texCoord = (lovrMaterialTransform * vec3(lovrTexCoord, 1.)).xy; \n"
|
||||
" vertexColor = lovrVertexColor; \n"
|
||||
" mat4 pose = \n"
|
||||
" lovrPose[lovrBones[0]] * lovrBoneWeights[0] + \n"
|
||||
|
|
Loading…
Reference in New Issue