| 397 | } |
| 398 | |
| 399 | FALCOR_SCRIPT_BINDING(ShaderVar) |
| 400 | { |
| 401 | FALCOR_SCRIPT_BINDING_DEPENDENCY(Buffer) |
| 402 | FALCOR_SCRIPT_BINDING_DEPENDENCY(Texture) |
| 403 | |
| 404 | pybind11::class_<ShaderVar> shaderVar(m, "ShaderVar"); |
| 405 | |
| 406 | shaderVar.def("__getitem__", [](ShaderVar& self, std::string_view name) { return self[name]; }); |
| 407 | shaderVar.def("__getattr__", [](ShaderVar& self, std::string_view name) { return self[name]; }); |
| 408 | |
| 409 | #define def_setter(type) \ |
| 410 | shaderVar.def("__setitem__", [](ShaderVar& self, std::string_view name, type value) { self[name] = value; }); \ |
| 411 | shaderVar.def("__setattr__", [](ShaderVar& self, std::string_view name, type value) { self[name] = value; }); |
| 412 | |
| 413 | def_setter(ref<Buffer>); |
| 414 | def_setter(ref<Texture>); |
| 415 | def_setter(ref<Sampler>); |
| 416 | |
| 417 | def_setter(uint2); |
| 418 | def_setter(uint3); |
| 419 | def_setter(uint4); |
| 420 | |
| 421 | def_setter(int2); |
| 422 | def_setter(int3); |
| 423 | def_setter(int4); |
| 424 | |
| 425 | def_setter(bool); |
| 426 | def_setter(bool2); |
| 427 | def_setter(bool3); |
| 428 | def_setter(bool4); |
| 429 | |
| 430 | def_setter(float2); |
| 431 | def_setter(float3); |
| 432 | def_setter(float4); |
| 433 | |
| 434 | def_setter(float3x4); |
| 435 | def_setter(float4x4); |
| 436 | |
| 437 | #undef def_setter |
| 438 | |
| 439 | // We need to handle integers and floats specially. |
| 440 | // Python only has an `int` and `float` type that can have different bit-width. |
| 441 | // We use reflection data to convert the python types to the correct types before assigning. |
| 442 | |
| 443 | auto set_int = [](ShaderVar& self, std::string_view name, pybind11::int_ value) |
| 444 | { |
| 445 | const ReflectionBasicType* basicType = self[name].getType()->unwrapArray()->asBasicType(); |
| 446 | FALCOR_CHECK(basicType, "Error trying to set a variable that is not a basic type."); |
| 447 | switch (basicType->getType()) |
| 448 | { |
| 449 | case ReflectionBasicType::Type::Int: |
| 450 | self[name] = value.cast<int32_t>(); |
| 451 | break; |
| 452 | case ReflectionBasicType::Type::Uint: |
| 453 | self[name] = value.cast<uint32_t>(); |
| 454 | break; |
| 455 | default: |
| 456 | FALCOR_THROW("Error trying to set a variable that is not an integer type."); |
nothing calls this directly
no test coverage detected