Files
cup_edit/thermion_dart/native/src/c_api/TMaterialInstance.cpp
Nick Fisher 0cbbc058e0 refactoring
2025-03-22 10:49:24 +08:00

230 lines
12 KiB
C++

#include <vector>
#include <filament/MaterialInstance.h>
#include <filament/Material.h>
#include <math/mat4.h>
#include <math/vec4.h>
#include <math/vec2.h>
#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<filament::Material *>(tMaterial);
auto *instance = material->createInstance();
return reinterpret_cast<TMaterialInstance *>(instance);
}
EMSCRIPTEN_KEEPALIVE TMaterial *Material_createImageMaterial(TEngine *tEngine) {
auto *engine = reinterpret_cast<filament::Engine *>(tEngine);
auto *material = filament::Material::Builder()
.package(IMAGE_IMAGE_DATA, IMAGE_IMAGE_SIZE)
.build(*engine);
return reinterpret_cast<TMaterial *>(material);
}
EMSCRIPTEN_KEEPALIVE TMaterial *Material_createGridMaterial(TEngine *tEngine) {
auto *engine = reinterpret_cast<filament::Engine *>(tEngine);
auto *material = filament::Material::Builder()
.package(GRID_GRID_DATA, GRID_GRID_SIZE)
.build(*engine);
return reinterpret_cast<TMaterial *>(material);
}
EMSCRIPTEN_KEEPALIVE TMaterial *Material_createGizmoMaterial(TEngine *tEngine) {
auto *engine = reinterpret_cast<filament::Engine *>(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<TMaterial *>(material);
}
EMSCRIPTEN_KEEPALIVE bool Material_hasParameter(TMaterial *tMaterial, const char *propertyName) {
auto *material = reinterpret_cast<filament::Material *>(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<float>(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<float>(x), static_cast<float>(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<float>(x), static_cast<float>(y), static_cast<float>(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<filament::math::float3> data;
for(int i = 0; i < length; i+=3) {
// TRACE("Vector %f %f %f", static_cast<float>(raw[i]), static_cast<float>(raw[i+1]), static_cast<float>(raw[i+2]));
data.push_back(filament::math::float3 { static_cast<float>(raw[i]), static_cast<float>(raw[i+1]), static_cast<float>(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<float>(x), static_cast<float>(y), static_cast<float>(z), static_cast<float>(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<filament::MaterialInstance *>(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<filament::MaterialInstance::DepthFunc>(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<filament::MaterialInstance::StencilOperation>(tOp);
auto face = static_cast<filament::MaterialInstance::StencilFace>(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<filament::MaterialInstance::StencilOperation>(tOp);
auto face = static_cast<filament::MaterialInstance::StencilFace>(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<filament::MaterialInstance::StencilOperation>(tOp);
auto face = static_cast<filament::MaterialInstance::StencilFace>(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<filament::MaterialInstance::StencilCompareFunc>(tFunc);
auto face = static_cast<filament::MaterialInstance::StencilFace>(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<filament::MaterialInstance::StencilFace>(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<filament::MaterialInstance::CullingMode>(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