#include #include #include #include #include #include #include "Log.hpp" #include "MathUtils.hpp" #include "material/image.h" #include "material/grid.h" #include "material/unlit_fixed_size.h" #include "c_api/TMaterialInstance.h" #ifdef __cplusplus namespace thermion { extern "C" { #endif EMSCRIPTEN_KEEPALIVE TMaterialInstance *Material_createInstance(TMaterial *tMaterial) { auto *material = reinterpret_cast(tMaterial); auto *instance = material->createInstance(); return reinterpret_cast(instance); } EMSCRIPTEN_KEEPALIVE TMaterial *Material_createImageMaterial(TEngine *tEngine) { auto *engine = reinterpret_cast(tEngine); auto *material = filament::Material::Builder() .package(IMAGE_IMAGE_DATA, IMAGE_IMAGE_SIZE) .build(*engine); return reinterpret_cast(material); } EMSCRIPTEN_KEEPALIVE TMaterial *Material_createGridMaterial(TEngine *tEngine) { auto *engine = reinterpret_cast(tEngine); auto *material = filament::Material::Builder() .package(GRID_GRID_DATA, GRID_GRID_SIZE) .build(*engine); return reinterpret_cast(material); } EMSCRIPTEN_KEEPALIVE TMaterial *Material_createGizmoMaterial(TEngine *tEngine) { auto *engine = reinterpret_cast(tEngine); auto *material = filament::Material::Builder() .package(UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_DATA, UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_SIZE) .build(*engine); return reinterpret_cast(material); } EMSCRIPTEN_KEEPALIVE bool Material_hasParameter(TMaterial *tMaterial, const char *propertyName) { auto *material = reinterpret_cast(tMaterial); return material->hasParameter(propertyName); } EMSCRIPTEN_KEEPALIVE bool MaterialInstance_isStencilWriteEnabled(TMaterialInstance *tMaterialInstance) { return reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance)->isStencilWriteEnabled(); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance *materialInstance, bool enabled) { reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setDepthWrite(enabled); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance *materialInstance, bool enabled) { reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setDepthCulling(enabled); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat(TMaterialInstance *tMaterialInstance, const char *propertyName, double value) { auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); auto fValue = static_cast(value); materialInstance->setParameter(propertyName, fValue); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat2(TMaterialInstance *materialInstance, const char *propertyName, double x, double y) { filament::math::float2 data{static_cast(x), static_cast(y)}; reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, data); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat3(TMaterialInstance *materialInstance, const char *propertyName, double x, double y, double z) { filament::math::float3 data{static_cast(x), static_cast(y), static_cast(z) }; reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, data); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat3Array(TMaterialInstance *tMaterialInstance, const char *propertyName, double* raw, uint32_t length) { TRACE("Setting property %s to array from raw length %d", propertyName, length); std::vector data; for(int i = 0; i < length; i+=3) { // TRACE("Vector %f %f %f", static_cast(raw[i]), static_cast(raw[i+1]), static_cast(raw[i+2])); data.push_back(filament::math::float3 { static_cast(raw[i]), static_cast(raw[i+1]), static_cast(raw[i+2]) }); } auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); materialInstance->setParameter(propertyName, data.data(), data.size()); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat4(TMaterialInstance *tMaterialInstance, const char *propertyName, double x, double y, double z, double w) { auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); filament::math::float4 data{static_cast(x), static_cast(y), static_cast(z), static_cast(w)}; materialInstance->setParameter(propertyName, data); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance *tMaterialInstance, const char *propertyName, int value) { auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); materialInstance->setParameter(propertyName, value); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterBool(TMaterialInstance *materialInstance, const char *propertyName, bool value) { reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, value); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterTexture(TMaterialInstance *tMaterialInstance, const char *propertyName, TTexture* tTexture, TTextureSampler* tSampler) { auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); auto texture = reinterpret_cast<::filament::Texture*>(tTexture); auto sampler = reinterpret_cast<::filament::TextureSampler*>(tSampler); materialInstance->setParameter(propertyName, texture, *sampler); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterMat4(TMaterialInstance *tMaterialInstance, const char *propertyName, double *matrix) { auto *mi = reinterpret_cast(tMaterialInstance); mi->setParameter(propertyName, convert_double_to_mat4f(matrix)); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthFunc(TMaterialInstance *tMaterialInstance, TSamplerCompareFunc tDepthFunc) { auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); auto depthFunc = static_cast(tDepthFunc); materialInstance->setDepthFunc(depthFunc); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilOpStencilFail(TMaterialInstance *tMaterialInstance, TStencilOperation tOp, TStencilFace tFace) { auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); auto op = static_cast(tOp); auto face = static_cast(tFace); materialInstance->setStencilOpStencilFail(op, face); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilOpDepthFail(TMaterialInstance *tMaterialInstance, TStencilOperation tOp, TStencilFace tFace) { auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); auto op = static_cast(tOp); auto face = static_cast(tFace); materialInstance->setStencilOpDepthFail(op, face); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilOpDepthStencilPass(TMaterialInstance *tMaterialInstance, TStencilOperation tOp, TStencilFace tFace) { auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); auto op = static_cast(tOp); auto face = static_cast(tFace); materialInstance->setStencilOpDepthStencilPass(op, face); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilCompareFunction(TMaterialInstance *tMaterialInstance, TSamplerCompareFunc tFunc, TStencilFace tFace) { auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); auto func = static_cast(tFunc); auto face = static_cast(tFace); materialInstance->setStencilCompareFunction(func, face); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilReferenceValue(TMaterialInstance *tMaterialInstance, uint8_t value, TStencilFace tFace) { auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); auto face = static_cast(tFace); materialInstance->setStencilReferenceValue(value, face); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilWrite(TMaterialInstance *materialInstance, bool enabled) { reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setStencilWrite(enabled); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setCullingMode(TMaterialInstance *materialInstance, TCullingMode culling) { auto *instance = reinterpret_cast<::filament::MaterialInstance *>(materialInstance); auto cullingMode = static_cast(culling); instance->setCullingMode(cullingMode); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilReadMask( TMaterialInstance *materialInstance, uint8_t mask) { auto *instance = reinterpret_cast<::filament::MaterialInstance *>(materialInstance); instance->setStencilReadMask(mask); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilWriteMask( TMaterialInstance *materialInstance, uint8_t mask) { auto *instance = reinterpret_cast<::filament::MaterialInstance *>(materialInstance); instance->setStencilWriteMask(mask); } EMSCRIPTEN_KEEPALIVE void MaterialInstance_setTransparencyMode( TMaterialInstance *materialInstance, TTransparencyMode transparencyMode) { auto *instance = reinterpret_cast<::filament::MaterialInstance *>(materialInstance); instance->setTransparencyMode((filament::TransparencyMode)transparencyMode); } #ifdef __cplusplus } } #endif