feat: add flag for keepData for gltf instancing, add highlightScene, add stencilHighlight method

This commit is contained in:
Nick Fisher
2024-09-06 12:36:16 +08:00
parent 1b50ca2b57
commit 0a4e3501dc
20 changed files with 1967 additions and 93 deletions

View File

@@ -174,6 +174,7 @@ namespace thermion_filament
const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper;
void* _context = nullptr;
Scene *_scene = nullptr;
Scene *_highlightScene = nullptr;
View *_view = nullptr;
Engine *_engine = nullptr;

View File

@@ -46,10 +46,11 @@ namespace thermion_filament
const ResourceLoaderWrapperImpl *const loader,
Engine *engine,
Scene *scene,
Scene *highlightScene,
const char *uberArchivePath);
~SceneManager();
EntityId loadGltf(const char *uri, const char *relativeResourcePath);
EntityId loadGltf(const char *uri, const char *relativeResourcePath, bool keepData = false);
////
/// @brief Load the GLB from the specified path, optionally creating multiple instances.
@@ -57,8 +58,8 @@ namespace thermion_filament
/// @param numInstances the number of instances to create.
/// @return an Entity representing the FilamentAsset associated with the loaded FilamentAsset.
///
EntityId loadGlb(const char *uri, int numInstances);
EntityId loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances = 1);
EntityId loadGlb(const char *uri, int numInstances, bool keepData);
EntityId loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances = 1, bool keepData = false);
EntityId createInstance(EntityId entityId);
void remove(EntityId entity);
@@ -157,6 +158,8 @@ namespace thermion_filament
bool addAnimationComponent(EntityId entity);
void removeAnimationComponent(EntityId entity);
void setStencilHighlight(EntityId entity);
/// @brief returns the number of instances of the FilamentAsset represented by the given entity.
/// @param entityId
/// @return the number of instances
@@ -194,9 +197,11 @@ namespace thermion_filament
const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper;
Engine *_engine = nullptr;
Scene *_scene = nullptr;
Scene *_highlightScene = nullptr;
View* _view = nullptr;
gltfio::MaterialProvider *_ubershaderProvider = nullptr;
gltfio::MaterialProvider *_unlitMaterialProvider = nullptr;
gltfio::ResourceLoader *_gltfResourceLoader = nullptr;
gltfio::TextureProvider *_stbDecoder = nullptr;
gltfio::TextureProvider *_ktxDecoder = nullptr;

View File

@@ -95,9 +95,9 @@ extern "C"
EMSCRIPTEN_KEEPALIVE void clear_lights(const void *const viewer);
EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, EntityId light, float x, float y, float z);
EMSCRIPTEN_KEEPALIVE void set_light_direction(const void *const viewer, EntityId light, float x, float y, float z);
EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances);
EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length);
EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath);
EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances, bool keepData);
EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length, bool keepData);
EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath, bool keepData);
EMSCRIPTEN_KEEPALIVE EntityId create_instance(void *sceneManager, EntityId id);
EMSCRIPTEN_KEEPALIVE int get_instance_count(void *sceneManager, EntityId entityId);
EMSCRIPTEN_KEEPALIVE void get_instances(void *sceneManager, EntityId entityId, EntityId *out);
@@ -259,6 +259,7 @@ extern "C"
EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled);
EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y));
EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible);
EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entity);
#ifdef __cplusplus
}

View File

@@ -66,9 +66,9 @@ extern "C"
void (*callback)(EntityId));
EMSCRIPTEN_KEEPALIVE void remove_light_ffi(void *const viewer, EntityId entityId);
EMSCRIPTEN_KEEPALIVE void clear_lights_ffi(void *const viewer);
EMSCRIPTEN_KEEPALIVE void load_glb_ffi(void *const sceneManager, const char *assetPath, int numInstances, void (*callback)(EntityId));
EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, const void *const data, size_t length, int numInstances, void (*callback)(EntityId));
EMSCRIPTEN_KEEPALIVE void load_gltf_ffi(void *const sceneManager, const char *assetPath, const char *relativePath, void (*callback)(EntityId));
EMSCRIPTEN_KEEPALIVE void load_glb_ffi(void *const sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId));
EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_ffi(void *const sceneManager, const void *const data, size_t length, int numInstances, bool keepData, void (*callback)(EntityId));
EMSCRIPTEN_KEEPALIVE void load_gltf_ffi(void *const sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId));
EMSCRIPTEN_KEEPALIVE void create_instance_ffi(void *const sceneManager, EntityId entityId, void (*callback)(EntityId));
EMSCRIPTEN_KEEPALIVE void remove_entity_ffi(void *const viewer, EntityId asset, void (*callback)());
EMSCRIPTEN_KEEPALIVE void clear_entities_ffi(void *const viewer, void (*callback)());

View File

@@ -0,0 +1,72 @@
#ifndef UNLIT_MATERIAL_PROVIDER_HPP
#define UNLIT_MATERIAL_PROVIDER_HPP
#include <filament/gltfio/MaterialProvider.h>
#include <filament/Material.h>
#include <filament/MaterialInstance.h>
#include <filament/Texture.h>
#include <filament/TextureSampler.h>
#include <math/mat3.h>
#include <math/vec3.h>
#include <math/vec4.h>
namespace thermion_filament {
class UnlitMaterialProvider : public filament::gltfio::MaterialProvider {
private:
filament::Material* mUnlitMaterial;
const filament::Material* mMaterials[1];
filament::Engine* mEngine;
public:
UnlitMaterialProvider(filament::Engine* engine, const void* const data, const size_t size) : mEngine(engine) {
mUnlitMaterial = filament::Material::Builder()
.package(data, size)
.build(*engine);
mMaterials[0] = mUnlitMaterial;
}
~UnlitMaterialProvider() {
mEngine->destroy(mUnlitMaterial);
}
filament::MaterialInstance* createMaterialInstance(filament::gltfio::MaterialKey* config,
filament::gltfio::UvMap* uvmap,
const char* label = "unlit",
const char* extras = nullptr) override {
auto instance = mUnlitMaterial->createInstance();
// Set default parameters
instance->setParameter("color", filament::math::float3{1.0f, 1.0f, 1.0f});
instance->setParameter("scale", 1.0f);
return instance;
}
filament::Material* getMaterial(filament::gltfio::MaterialKey* config,
filament::gltfio::UvMap* uvmap,
const char* label = "unlit") override {
return mUnlitMaterial;
}
const filament::Material* const* getMaterials() const noexcept override {
return mMaterials;
}
size_t getMaterialsCount() const noexcept override {
return 1;
}
void destroyMaterials() override {
// Materials are destroyed in the destructor
}
bool needsDummyData(filament::VertexAttribute attrib) const noexcept override {
// For unlit material, we don't need dummy data for any attribute
return false;
}
};
} // namespace thermion_filament
#endif // UNLIT_MATERIAL_PROVIDER_HPP

View File

@@ -0,0 +1,12 @@
.global UNLIT_UNLIT_OFFSET;
.global UNLIT_UNLIT_SIZE;
.global UNLIT_PACKAGE
.section .rodata
UNLIT_PACKAGE:
.incbin "unlit.bin"
UNLIT_UNLIT_OFFSET:
.int 0
UNLIT_UNLIT_SIZE:
.int 26426

View File

@@ -0,0 +1,12 @@
.global _UNLIT_UNLIT_OFFSET;
.global _UNLIT_UNLIT_SIZE;
.global _UNLIT_PACKAGE
.section __TEXT,__const
_UNLIT_PACKAGE:
.incbin "unlit.bin"
_UNLIT_UNLIT_OFFSET:
.int 0
_UNLIT_UNLIT_SIZE:
.int 26426

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,13 @@
#ifndef UNLIT_H_
#define UNLIT_H_
#include <stdint.h>
extern "C" {
extern const uint8_t UNLIT_PACKAGE[];
extern int UNLIT_UNLIT_OFFSET;
extern int UNLIT_UNLIT_SIZE;
}
#define UNLIT_UNLIT_DATA (UNLIT_PACKAGE + UNLIT_UNLIT_OFFSET)
#endif