summaryrefslogtreecommitdiff
path: root/src/models.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/models.c')
-rw-r--r--src/models.c222
1 files changed, 213 insertions, 9 deletions
diff --git a/src/models.c b/src/models.c
index eb4b978..7efee95 100644
--- a/src/models.c
+++ b/src/models.c
@@ -573,9 +573,48 @@ int lmodelsGetModelBoundingBox( lua_State *L ) {
}
/*
+> RL.SetModelTransform( Model model, Matrix transform )
+
+Set model transform matrix
+*/
+int lmodelsSetModelTransform( lua_State *L ) {
+ Model *model = uluaGetModel( L, 1 );
+ Matrix transform = uluaGetMatrix( L, 2 );
+
+ model->transform = transform;
+
+ return 0;
+}
+
+/*
+> success = RL.SetModelMesh( Model model, int meshId, Mesh mesh )
+
+Get model mesh. Return as lightuserdata
+
+- Failure return false
+- Success return true
+*/
+int lmodelsSetModelMesh( lua_State *L ) {
+ Model *model = uluaGetModel( L, 1 );
+ int meshId = luaL_checkinteger( L, 2 );
+ Mesh *mesh = uluaGetMesh( L, 3 );
+
+ if ( 0 <= meshId && meshId < model->meshCount ) {
+ // TODO Test if mesh should be copied instead. Is there issues with unloading.
+ model->meshes[ meshId ] = *mesh;
+ lua_pushboolean( L, true );
+ }
+ else {
+ TraceLog( LOG_WARNING, "MeshId %d out of bounds", meshId );
+ lua_pushboolean( L, false );
+ }
+ return 1;
+}
+
+/*
> success = RL.SetModelMaterial( Model model, int modelMaterialId, Material material )
-Copies material to model material. (Model material is the material id in models.)
+Copies material to model material
- Failure return false
- Success return true
@@ -585,8 +624,6 @@ int lmodelsSetModelMaterial( lua_State *L ) {
int modelMaterialId = luaL_checkinteger( L, 2 );
Material *material = uluaGetMaterial( L, 3 );
- //TODO Could maybe return old shader and textures for storage or get garbage collected?
-
if ( 0 <= modelMaterialId && modelMaterialId < model->materialCount ) {
/* Copy material data instead of using pointer. Pointer would result in double free error. */
model->materials[ modelMaterialId ].shader = material->shader;
@@ -630,17 +667,51 @@ int lmodelsSetModelMeshMaterial( lua_State *L ) {
}
/*
-> RL.SetModelTransform( Model model, Matrix transform )
+> success = RL.SetModelBone( Model model, int boneId, BoneInfo bone )
-Set model transform matrix
+Set model bone information (skeleton)
+
+- Failure return false
+- Success return true
*/
-int lmodelsSetModelTransform( lua_State *L ) {
+int lmodelsSetModelBone( lua_State *L ) {
Model *model = uluaGetModel( L, 1 );
- Matrix transform = uluaGetMatrix( L, 2 );
+ int boneId = luaL_checkinteger( L, 2 );
+ BoneInfo bone = uluaGetBoneInfo( L, 3 );
- model->transform = transform;
+ if ( 0 <= boneId && boneId < model->boneCount ) {
+ model->bones[ boneId ] = bone;
+ lua_pushboolean( L, true );
+ }
+ else {
+ TraceLog( LOG_WARNING, "boneId %d out of bounds", boneId );
+ lua_pushboolean( L, false );
+ }
+ return 1;
+}
- return 0;
+/*
+> success = RL.SetModelBindPose( Model model, int boneId, Transform pose )
+
+Set model bones base transformation (pose)
+
+- Failure return false
+- Success return true
+*/
+int lmodelsSetModelBindPose( lua_State *L ) {
+ Model *model = uluaGetModel( L, 1 );
+ int boneId = luaL_checkinteger( L, 2 );
+ Transform pose = uluaGetTransform( L, 3 );
+
+ if ( 0 <= boneId && boneId < model->boneCount ) {
+ model->bindPose[ boneId ] = pose;
+ lua_pushboolean( L, true );
+ }
+ else {
+ TraceLog( LOG_WARNING, "boneId %d out of bounds", boneId );
+ lua_pushboolean( L, false );
+ }
+ return 1;
}
/*
@@ -659,6 +730,139 @@ int lmodelsGetModelTransform( lua_State *L ) {
}
/*
+> meshCount = RL.GetModelMeshCount( Model model )
+
+Get model number of meshes
+
+- Success return int
+*/
+int lmodelsGetModelMeshCount( lua_State *L ) {
+ Model *model = uluaGetModel( L, 1 );
+
+ lua_pushinteger( L, model->meshCount );
+
+ return 1;
+}
+
+/*
+> meshCount = RL.GetModelMaterialCount( Model model )
+
+Get model number of materials
+
+- Success return int
+*/
+int lmodelsGetModelMaterialCount( lua_State *L ) {
+ Model *model = uluaGetModel( L, 1 );
+
+ lua_pushinteger( L, model->materialCount );
+
+ return 1;
+}
+
+/*
+> mesh = RL.GetModelMesh( Model model, int meshId )
+
+Get model mesh. Return as lightuserdata
+
+- Failure return nil
+- Success return Mesh
+*/
+int lmodelsGetModelMesh( lua_State *L ) {
+ Model *model = uluaGetModel( L, 1 );
+ int meshId = luaL_checkinteger( L, 2 );
+
+ if ( 0 <= meshId && meshId < model->meshCount ) {
+ lua_pushlightuserdata( L, &model->meshes[ meshId ] );
+ }
+ else {
+ TraceLog( LOG_WARNING, "MeshId %d out of bounds", meshId );
+ lua_pushnil( L );
+ }
+ return 1;
+}
+
+/*
+> material = RL.GetModelMaterial( Model model, int materialId )
+
+Get model material. Return as lightuserdata
+
+- Failure return nil
+- Success return Material
+*/
+int lmodelsGetModelMaterial( lua_State *L ) {
+ Model *model = uluaGetModel( L, 1 );
+ int materialId = luaL_checkinteger( L, 2 );
+
+ if ( 0 <= materialId && materialId < model->materialCount ) {
+ lua_pushlightuserdata( L, &model->materials[ materialId ] );
+ }
+ else {
+ TraceLog( LOG_WARNING, "MaterialId %d out of bounds", materialId );
+ lua_pushnil( L );
+ }
+ return 1;
+}
+
+/*
+> boneCount = RL.GetModelBoneCount( Model model )
+
+Get model number of bones
+
+- Success return int
+*/
+int lmodelsGetModelBoneCount( lua_State *L ) {
+ Model *model = uluaGetModel( L, 1 );
+
+ lua_pushinteger( L, model->boneCount );
+
+ return 1;
+}
+
+/*
+> bone = RL.GetModelBone( Model model, int boneId )
+
+Get model bones information (skeleton)
+
+- Failure return nil
+- Success return BoneInfo
+*/
+int lmodelsGetModelBone( lua_State *L ) {
+ Model *model = uluaGetModel( L, 1 );
+ int boneId = luaL_checkinteger( L, 2 );
+
+ if ( 0 <= boneId && boneId < model->boneCount ) {
+ uluaPushBoneInfo( L, model->bones[ boneId ] );
+ }
+ else {
+ TraceLog( LOG_WARNING, "BoneId %d out of bounds", boneId );
+ lua_pushnil( L );
+ }
+ return 1;
+}
+
+/*
+> pose = RL.GetModelBindPose( Model model, int boneId )
+
+Get models bones base transformation (pose)
+
+- Failure return nil
+- Success return Transform
+*/
+int lmodelsGetModelBindPose( lua_State *L ) {
+ Model *model = uluaGetModel( L, 1 );
+ int boneId = luaL_checkinteger( L, 2 );
+
+ if ( 0 <= boneId && boneId < model->boneCount ) {
+ uluaPushTransform( L, model->bindPose[ boneId ] );
+ }
+ else {
+ TraceLog( LOG_WARNING, "BoneId %d out of bounds", boneId );
+ lua_pushnil( L );
+ }
+ return 1;
+}
+
+/*
## Models - Model drawing functions
*/