diff --git a/thermion_dart/native/include/c_api/TSceneAsset.h b/thermion_dart/native/include/c_api/TSceneAsset.h index f51e91ff..934060ae 100644 --- a/thermion_dart/native/include/c_api/TSceneAsset.h +++ b/thermion_dart/native/include/c_api/TSceneAsset.h @@ -10,6 +10,20 @@ extern "C" { #endif + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneAsset_createGeometry( + TEngine *tEngine, + float *vertices, + uint32_t numVertices, + float *normals, + uint32_t numNormals, + float *uvs, + uint32_t numUvs, + uint16_t *indices, + uint32_t numIndices, + TPrimitiveType tPrimitiveType, + TMaterialInstance **materialInstances, + int materialInstanceCount + ); EMSCRIPTEN_KEEPALIVE void SceneAsset_addToScene(TSceneAsset *tSceneAsset, TScene *tScene); EMSCRIPTEN_KEEPALIVE EntityId SceneAsset_getEntity(TSceneAsset *tSceneAsset); EMSCRIPTEN_KEEPALIVE int SceneAsset_getChildEntityCount(TSceneAsset* tSceneAsset); diff --git a/thermion_dart/native/src/c_api/TSceneAsset.cpp b/thermion_dart/native/src/c_api/TSceneAsset.cpp index 0fee7ec0..fd8bf497 100644 --- a/thermion_dart/native/src/c_api/TSceneAsset.cpp +++ b/thermion_dart/native/src/c_api/TSceneAsset.cpp @@ -1,6 +1,8 @@ + #include "c_api/TSceneAsset.h" #include "scene/SceneAsset.hpp" #include "scene/GltfSceneAsset.hpp" +#include "scene/GeometrySceneAssetBuilder.hpp" using namespace thermion; @@ -10,6 +12,53 @@ extern "C" { #endif + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneAsset_createGeometry( + TEngine *tEngine, + float *vertices, + uint32_t numVertices, + float *normals, + uint32_t numNormals, + float *uvs, + uint32_t numUvs, + uint16_t *indices, + uint32_t numIndices, + TPrimitiveType tPrimitiveType, + TMaterialInstance **materialInstances, + int materialInstanceCount + ) { + utils::Entity entity; + + auto *engine = reinterpret_cast(tEngine); + + auto builder = GeometrySceneAssetBuilder(engine) + .vertices(vertices, numVertices) + .indices(indices, numIndices) + .primitiveType(static_cast(tPrimitiveType)); + + if (normals) + { + builder.normals(normals, numNormals); + } + + if (uvs) + { + builder.uvs(uvs, numUvs); + } + + builder.materials(reinterpret_cast(materialInstances), materialInstanceCount); + + auto sceneAsset = builder.build(); + + if (!sceneAsset) + { + Log("Failed to create geometry"); + return std::nullptr_t(); + } + + return reinterpret_cast(sceneAsset.release()); + + } + EMSCRIPTEN_KEEPALIVE void SceneAsset_addToScene(TSceneAsset *tSceneAsset, TScene *tScene) { auto *asset = reinterpret_cast(tSceneAsset); auto *scene = reinterpret_cast(tScene);