@@ -71,6 +71,7 @@ typedef struct _plMeshBuilder
7171{
7272 plMeshBuilderOptions tOptions ;
7373 plVec3 * sbtVertices ;
74+ plDVec3 * sbtDVertices ;
7475 plMeshBuilderTriangle * sbtTriangles ;
7576} plMeshBuilder ;
7677
@@ -702,6 +703,100 @@ pl_mesh_builder_commit(plMeshBuilder* ptBuilder, uint32_t* puIndexBuffer, plVec3
702703}
703704
704705
706+ void
707+ pl_mesh_builder_add_triangle_double (plMeshBuilder * ptBuilder , plDVec3 tA , plDVec3 tB , plDVec3 tC )
708+ {
709+ plMeshBuilderTriangle tTriangle ;
710+ tTriangle .uIndex0 = UINT32_MAX ;
711+ tTriangle .uIndex1 = UINT32_MAX ;
712+ tTriangle .uIndex2 = UINT32_MAX ;
713+
714+ const double fWeldRadiusSqr = (double )(ptBuilder -> tOptions .fWeldRadius * ptBuilder -> tOptions .fWeldRadius );
715+
716+ const uint32_t uVertexCount = pl_sb_size (ptBuilder -> sbtDVertices );
717+
718+ for (uint32_t i = 0 ; i < uVertexCount ; i ++ )
719+ {
720+ const plDVec3 * ptVertex = & ptBuilder -> sbtDVertices [i ];
721+
722+ double fDist = pl_length_sqr_vec3_d (pl_sub_vec3_d (* ptVertex , tA ));
723+
724+ if (fDist < fWeldRadiusSqr )
725+ {
726+ tTriangle .uIndex0 = i ;
727+ break ;
728+ }
729+ }
730+
731+ for (uint32_t i = 0 ; i < uVertexCount ; i ++ )
732+ {
733+ const plDVec3 * ptVertex = & ptBuilder -> sbtDVertices [i ];
734+
735+ double fDist = pl_length_sqr_vec3_d (pl_sub_vec3_d (* ptVertex , tB ));
736+
737+ if (fDist < fWeldRadiusSqr )
738+ {
739+ tTriangle .uIndex1 = i ;
740+ break ;
741+ }
742+ }
743+
744+ for (uint32_t i = 0 ; i < uVertexCount ; i ++ )
745+ {
746+ const plDVec3 * ptVertex = & ptBuilder -> sbtDVertices [i ];
747+
748+ double fDist = pl_length_sqr_vec3_d (pl_sub_vec3_d (* ptVertex , tC ));
749+
750+ if (fDist < fWeldRadiusSqr )
751+ {
752+ tTriangle .uIndex2 = i ;
753+ break ;
754+ }
755+ }
756+
757+ if (tTriangle .uIndex0 == UINT32_MAX )
758+ {
759+ tTriangle .uIndex0 = pl_sb_size (ptBuilder -> sbtDVertices );
760+ pl_sb_push (ptBuilder -> sbtDVertices , tA );
761+ }
762+
763+ if (tTriangle .uIndex1 == UINT32_MAX )
764+ {
765+ tTriangle .uIndex1 = pl_sb_size (ptBuilder -> sbtDVertices );
766+ pl_sb_push (ptBuilder -> sbtDVertices , tB );
767+ }
768+
769+ if (tTriangle .uIndex2 == UINT32_MAX )
770+ {
771+ tTriangle .uIndex2 = pl_sb_size (ptBuilder -> sbtDVertices );
772+ pl_sb_push (ptBuilder -> sbtDVertices , tC );
773+ }
774+
775+ pl_sb_push (ptBuilder -> sbtTriangles , tTriangle );
776+ }
777+
778+ void
779+ pl_mesh_builder_commit_double (plMeshBuilder * ptBuilder , uint32_t * puIndexBuffer , plDVec3 * ptVertexBuffer , uint32_t * puIndexBufferCountOut , uint32_t * puVertexBufferCountOut )
780+ {
781+ const uint32_t uVertexCount = pl_sb_size (ptBuilder -> sbtDVertices );
782+ const uint32_t uTriangleCount = pl_sb_size (ptBuilder -> sbtTriangles );
783+
784+ if (puVertexBufferCountOut )
785+ * puVertexBufferCountOut = uVertexCount ;
786+
787+ if (puIndexBufferCountOut )
788+ * puIndexBufferCountOut = uTriangleCount * 3 ;
789+
790+ if (puIndexBuffer && ptVertexBuffer )
791+ {
792+ memcpy (puIndexBuffer , ptBuilder -> sbtTriangles , uTriangleCount * 3 * sizeof (uint32_t ));
793+ memcpy (ptVertexBuffer , ptBuilder -> sbtDVertices , uVertexCount * sizeof (plDVec3 ));
794+ pl_sb_reset (ptBuilder -> sbtTriangles );
795+ pl_sb_reset (ptBuilder -> sbtDVertices );
796+ }
797+ }
798+
799+
705800//-----------------------------------------------------------------------------
706801// [SECTION] extension loading
707802//-----------------------------------------------------------------------------
@@ -730,6 +825,14 @@ pl_load_mesh_ext(plApiRegistryI* ptApiRegistry, bool bReload)
730825 };
731826 pl_set_api (ptApiRegistry , plMeshBuilderI , & tApi2 );
732827
828+ const plMeshBuilderDI tApi3 = {
829+ .create = pl_mesh_builder_create ,
830+ .cleanup = pl_mesh_builder_cleanup ,
831+ .add_triangle = pl_mesh_builder_add_triangle_double ,
832+ .commit = pl_mesh_builder_commit_double ,
833+ };
834+ pl_set_api (ptApiRegistry , plMeshBuilderDI , & tApi3 );
835+
733836 gptECS = pl_get_api_latest (ptApiRegistry , plEcsI );
734837 gptMemory = pl_get_api_latest (ptApiRegistry , plMemoryI );
735838 gptLog = pl_get_api_latest (ptApiRegistry , plLogI );
@@ -759,4 +862,7 @@ pl_unload_mesh_ext(plApiRegistryI* ptApiRegistry, bool bReload)
759862
760863 const plMeshBuilderI * ptApi2 = pl_get_api_latest (ptApiRegistry , plMeshBuilderI );
761864 ptApiRegistry -> remove_api (ptApi2 );
865+
866+ const plMeshBuilderDI * ptApi3 = pl_get_api_latest (ptApiRegistry , plMeshBuilderDI );
867+ ptApiRegistry -> remove_api (ptApi3 );
762868}
0 commit comments