From 453c17ad664e98acf42101bbf92b9013cfeb3844 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 14 Dec 2022 23:09:58 -0800 Subject: [PATCH 1/6] Add binding for UploadMesh() --- raylib/rmodels.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/raylib/rmodels.go b/raylib/rmodels.go index 4181ee6..d243037 100644 --- a/raylib/rmodels.go +++ b/raylib/rmodels.go @@ -255,6 +255,12 @@ func GetModelBoundingBox(model Model) BoundingBox { return v } +func UploadMesh(mesh *Mesh, dynamic bool) { + cmesh := mesh.cptr() + cdynamic := C.cbool(dynamic) + C.UploadMesh(*cmesh, cdynamic) +} + // UnloadMesh - Unload mesh from memory (RAM and/or VRAM) func UnloadMesh(mesh *Mesh) { cmesh := mesh.cptr() From eefc9f5ff604dc6f48f31412a3124b65145d8d8c Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 14 Dec 2022 23:12:21 -0800 Subject: [PATCH 2/6] Add binding for UploadMesh --- raylib/rmodels.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/raylib/rmodels.go b/raylib/rmodels.go index d243037..de3019e 100644 --- a/raylib/rmodels.go +++ b/raylib/rmodels.go @@ -258,7 +258,7 @@ func GetModelBoundingBox(model Model) BoundingBox { func UploadMesh(mesh *Mesh, dynamic bool) { cmesh := mesh.cptr() cdynamic := C.cbool(dynamic) - C.UploadMesh(*cmesh, cdynamic) + C.UploadMesh(cmesh, cdynamic) } // UnloadMesh - Unload mesh from memory (RAM and/or VRAM) From 417130bd8e3de8e3b39f9dfd0df01a210b980140 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Thu, 15 Dec 2022 00:00:48 -0800 Subject: [PATCH 3/6] Add binding for UploadMesh --- raylib/rmodels.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/raylib/rmodels.go b/raylib/rmodels.go index de3019e..fa77ab2 100644 --- a/raylib/rmodels.go +++ b/raylib/rmodels.go @@ -255,9 +255,10 @@ func GetModelBoundingBox(model Model) BoundingBox { return v } +// UploadMesh - Upload mesh vertex data in GPU and provide VAO/VBO ids func UploadMesh(mesh *Mesh, dynamic bool) { cmesh := mesh.cptr() - cdynamic := C.cbool(dynamic) + cdynamic := C.bool(dynamic) C.UploadMesh(cmesh, cdynamic) } From 4c850b247255379f71c01d86977432eabb0ded33 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 8 Nov 2023 13:28:48 -0800 Subject: [PATCH 4/6] Fix for UnloadMesh per issue #303 --- raylib/rmodels.go | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/raylib/rmodels.go b/raylib/rmodels.go index 069567f..9980af4 100644 --- a/raylib/rmodels.go +++ b/raylib/rmodels.go @@ -335,8 +335,18 @@ func DrawBillboardPro(camera Camera, texture Texture2D, sourceRec Rectangle, pos C.DrawBillboardPro(*ccamera, *ctexture, *csourceRec, *cposition, *cup, *csize, *corigin, crotation, *ctint) } +//List of VaoIDs of meshes created by calling UploadMesh() +//Used by UnloadMesh() to determine if mesh is go-managed or C-allocated +var goManagedMeshIDs []uint32 = make([]uint32, 0) + // UploadMesh - Upload vertex data into a VAO (if supported) and VBO func UploadMesh(mesh *Mesh, dynamic bool) { + //check if mesh has already been uploaded to prevent duplication + if mesh.VaoID != 0 { + fmt.printf("VAO: [ID %i] Trying to re-load an already loaded mesh", mesh->vaoId) + return + } + pinner := runtime.Pinner{} //Mesh pointer fields must be pinned to allow a Mesh pointer to be passed to C.UploadMesh() below //nil checks are required because Pin() will panic if passed nil @@ -381,6 +391,10 @@ func UploadMesh(mesh *Mesh, dynamic bool) { cMesh := mesh.cptr() C.UploadMesh(cMesh, C.bool(dynamic)) + //Add new mesh VaoID to list + goManagedMeshIDs = append(goManagedMeshIDs, mesh.VaoID) + fmt.Println(goManagedMeshIDs) + pinner.Unpin() } @@ -394,14 +408,26 @@ func UpdateMeshBuffer(mesh Mesh, index int, data []byte, offset int) { // UnloadMesh - Unload mesh from memory (RAM and/or VRAM) func UnloadMesh(mesh *Mesh) { - //C.UnloadMesh() only needs to read the VaoID & VboID - //passing a temporary struct with all other fields nil makes it safe for the C code to call free() - tempMesh := Mesh{ - VaoID: mesh.VaoID, - VboID: mesh.VboID, + //Check list of go-managed mesh IDs + if slices.Contains(goManagedMeshIDs, mesh.VaoID) { + //C.UnloadMesh() only needs to read the VaoID & VboID + //passing a temporary struct with all other fields nil makes it safe for the C code to call free() + tempMesh := Mesh{ + VaoID: mesh.VaoID, + VboID: mesh.VboID, + } + cmesh := tempMesh.cptr() + C.UnloadMesh(*cmesh) + + //remove mesh VaoID from list + goManagedMeshIDs = slices.DeleteFunc(goManagedMeshIDs, func(id uint32) bool { return id == mesh.VaoID }) + fmt.Println("unloaded custom Mesh") + fmt.Println(goManagedMeshIDs) + } else { + cmesh := mesh.cptr() + C.UnloadMesh(*cmesh) + fmt.Println("unloaded C Mesh") } - cmesh := tempMesh.cptr() - C.UnloadMesh(*cmesh) } // DrawMesh - Draw a single mesh From f8a694c14928c98820eed20a6084d7880ac44ed6 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 8 Nov 2023 13:33:57 -0800 Subject: [PATCH 5/6] Fix for UnloadMesh per issue #303 --- raylib/rmodels.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/raylib/rmodels.go b/raylib/rmodels.go index 9980af4..5846556 100644 --- a/raylib/rmodels.go +++ b/raylib/rmodels.go @@ -7,8 +7,10 @@ package rl import "C" import ( + "fmt" "image/color" "runtime" + "slices" "unsafe" ) @@ -335,15 +337,15 @@ func DrawBillboardPro(camera Camera, texture Texture2D, sourceRec Rectangle, pos C.DrawBillboardPro(*ccamera, *ctexture, *csourceRec, *cposition, *cup, *csize, *corigin, crotation, *ctint) } -//List of VaoIDs of meshes created by calling UploadMesh() -//Used by UnloadMesh() to determine if mesh is go-managed or C-allocated +// List of VaoIDs of meshes created by calling UploadMesh() +// Used by UnloadMesh() to determine if mesh is go-managed or C-allocated var goManagedMeshIDs []uint32 = make([]uint32, 0) // UploadMesh - Upload vertex data into a VAO (if supported) and VBO func UploadMesh(mesh *Mesh, dynamic bool) { //check if mesh has already been uploaded to prevent duplication if mesh.VaoID != 0 { - fmt.printf("VAO: [ID %i] Trying to re-load an already loaded mesh", mesh->vaoId) + fmt.printf("VAO: [ID %i] Trying to re-load an already loaded mesh", mesh.VaoId) return } @@ -408,7 +410,7 @@ func UpdateMeshBuffer(mesh Mesh, index int, data []byte, offset int) { // UnloadMesh - Unload mesh from memory (RAM and/or VRAM) func UnloadMesh(mesh *Mesh) { - //Check list of go-managed mesh IDs + //Check list of go-managed mesh IDs if slices.Contains(goManagedMeshIDs, mesh.VaoID) { //C.UnloadMesh() only needs to read the VaoID & VboID //passing a temporary struct with all other fields nil makes it safe for the C code to call free() From 5f92cb5067659e147b1507ad4fad82def7aa5e5f Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 8 Nov 2023 13:53:20 -0800 Subject: [PATCH 6/6] Fix for UnloadMesh per issue #303 --- raylib/rmodels.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/raylib/rmodels.go b/raylib/rmodels.go index 5846556..9163d3b 100644 --- a/raylib/rmodels.go +++ b/raylib/rmodels.go @@ -345,7 +345,7 @@ var goManagedMeshIDs []uint32 = make([]uint32, 0) func UploadMesh(mesh *Mesh, dynamic bool) { //check if mesh has already been uploaded to prevent duplication if mesh.VaoID != 0 { - fmt.printf("VAO: [ID %i] Trying to re-load an already loaded mesh", mesh.VaoId) + fmt.Printf("WARNING: VAO: [ID %d] Trying to re-load an already loaded mesh\n", mesh.VaoID) return } @@ -395,7 +395,6 @@ func UploadMesh(mesh *Mesh, dynamic bool) { //Add new mesh VaoID to list goManagedMeshIDs = append(goManagedMeshIDs, mesh.VaoID) - fmt.Println(goManagedMeshIDs) pinner.Unpin() } @@ -423,12 +422,9 @@ func UnloadMesh(mesh *Mesh) { //remove mesh VaoID from list goManagedMeshIDs = slices.DeleteFunc(goManagedMeshIDs, func(id uint32) bool { return id == mesh.VaoID }) - fmt.Println("unloaded custom Mesh") - fmt.Println(goManagedMeshIDs) } else { cmesh := mesh.cptr() C.UnloadMesh(*cmesh) - fmt.Println("unloaded C Mesh") } }