Re-add Model:getMaterial and Model:setMaterial;

This commit is contained in:
bjorn 2019-02-13 23:55:47 -08:00
parent 7c6accf856
commit 69b6e599e9
3 changed files with 39 additions and 1 deletions

View File

@ -28,6 +28,24 @@ int l_lovrModelSetAnimator(lua_State* L) {
return 0;
}
int l_lovrModelGetMaterial(lua_State* L) {
Model* model = luax_checktype(L, 1, Model);
Material* material = lovrModelGetMaterial(model);
luax_pushobject(L, material);
return 1;
}
int l_lovrModelSetMaterial(lua_State* L) {
Model* model = luax_checktype(L, 1, Model);
if (lua_isnoneornil(L, 2)) {
lovrModelSetMaterial(model, NULL);
} else {
Material* material = luax_checktype(L, 2, Material);
lovrModelSetMaterial(model, material);
}
return 0;
}
int l_lovrModelGetAABB(lua_State* L) {
Model* model = luax_checktype(L, 1, Model);
float aabb[6];
@ -42,6 +60,8 @@ const luaL_Reg lovrModel[] = {
{ "draw", l_lovrModelDraw },
{ "getAnimator", l_lovrModelGetAnimator },
{ "setAnimator", l_lovrModelSetAnimator },
{ "getMaterial", l_lovrModelGetMaterial },
{ "setMaterial", l_lovrModelSetMaterial },
{ "getAABB", l_lovrModelGetAABB },
{ NULL, NULL }
};

View File

@ -42,6 +42,11 @@ static void renderNode(Model* model, uint32_t nodeIndex, int instances) {
for (uint32_t i = 0; i < node->primitiveCount; i++) {
ModelPrimitive* primitive = &model->data->primitives[node->primitiveIndex + i];
Mesh* mesh = model->meshes[node->primitiveIndex + i];
Material* material = primitive->material >= 0 ? model->materials[primitive->material] : NULL;
if (model->userMaterial) {
material = model->userMaterial;
}
uint32_t rangeStart, rangeCount;
lovrMeshGetDrawRange(mesh, &rangeStart, &rangeCount);
@ -57,7 +62,7 @@ static void renderNode(Model* model, uint32_t nodeIndex, int instances) {
.pose = node->skin >= 0 ? pose : NULL
},
.transform = globalTransform,
.material = primitive->material >= 0 ? model->materials[primitive->material] : NULL
.material = material
});
}
}
@ -206,6 +211,16 @@ void lovrModelSetAnimator(Model* model, Animator* animator) {
}
}
Material* lovrModelGetMaterial(Model* model) {
return model->userMaterial;
}
void lovrModelSetMaterial(Model* model, Material* material) {
lovrRetain(material);
lovrRelease(model->userMaterial);
model->userMaterial = material;
}
static void applyAABB(Model* model, int nodeIndex, float aabb[6]) {
ModelNode* node = &model->data->nodes[nodeIndex];

View File

@ -14,6 +14,7 @@ typedef struct {
Mesh** meshes;
Texture** textures;
Material** materials;
Material* userMaterial;
float* globalNodeTransforms;
} Model;
@ -23,4 +24,6 @@ void lovrModelDestroy(void* ref);
void lovrModelDraw(Model* model, mat4 transform, int instances);
Animator* lovrModelGetAnimator(Model* model);
void lovrModelSetAnimator(Model* model, Animator* animator);
Material* lovrModelGetMaterial(Model* model);
void lovrModelSetMaterial(Model* model, Material* material);
void lovrModelGetAABB(Model* model, float aabb[6]);