From 69b6e599e9ff84fa73f1b2e13dbaca05bd755518 Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 13 Feb 2019 23:55:47 -0800 Subject: [PATCH] Re-add Model:getMaterial and Model:setMaterial; --- src/api/types/model.c | 20 ++++++++++++++++++++ src/graphics/model.c | 17 ++++++++++++++++- src/graphics/model.h | 3 +++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/api/types/model.c b/src/api/types/model.c index 17efc155..3c0e1a50 100644 --- a/src/api/types/model.c +++ b/src/api/types/model.c @@ -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 } }; diff --git a/src/graphics/model.c b/src/graphics/model.c index 2dd82fbb..66b7e58f 100644 --- a/src/graphics/model.c +++ b/src/graphics/model.c @@ -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]; diff --git a/src/graphics/model.h b/src/graphics/model.h index 54b8e004..a865247b 100644 --- a/src/graphics/model.h +++ b/src/graphics/model.h @@ -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]);